* First draft of my layout
* Improved layout and cleanup of files
* Update keymap and add rules
* Add keymap.h with permissive_hold setting
* Rename keymap.h to correct name config.h
* Add next/prev and special lock key to Fn layer
* Use correct modifier in MY_LOCK command
* Removed unnecessary filler defines
* Add build instructions to README
* Move RGB controls to more logical up/down key positions, move next/prev controls, remove del from Fn layer
* Fix wrong placeholders and fix up formatting
* Remove unused code
* Clarify comments on custom defines
* Update keyboards/kbdfans/kbd6x/keymaps/mekberg/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Version 1 of keymappings
* Adding updated keymappings
* Adding hash/pound symbol to layer
* Removing broken macros
* Adding to readme. Amending value of pound sign
* Changing language in readme
* Addressing PR comments. Removing unneeded code, corrected syntax
* Removing commented out code and fixing white space issues
* Small clean up to readme
* Add a via compatible keymap
* Disable VIA on default for configurator
- use the via keymap if you want via support
* Move wilba dep to keymap avoid breaking community
- moves via specific includes into the _via keymap
- fixes configurator builds
* Avoid NO_USB_STARTUP_CHECK - Disable USB as checks seem to enable it somehow
* Update quantum/split_common/split_util.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Also remove NO_USB_STARTUP_CHECK from vitamins_included/rev1
* Move tmk_core/common/backlight to quantum/backlight
* Add guards to backlight inclusion
* Add guards to backlight inclusion
* Update backlight guards on clueboard/60
* Use full paths to avoid vpath issues
* Change RGBLight pin for Planck Light
Move it to A0, so that the SPI? pins are available for BT hackery
* Add QMK DFU bootloader info
* Add Solenoid
* Disable annoying white LED on bottom
* Enable Solenoid on Corne
* Remove bounds for animations
* Increase debounce for Ergodox EZ to reduce repeat key issues
* Set swap hands key to be a hold-tap key
This way, it's not ANNOYING and doesn't swap the hands inteniontally
* Move MT Alt in Corne keymap
* Re-Add fine tuned control of secrets
* Squash mods to single row
* Add LRA settings to haptic feedback settings for Rev6
* Fix issue with non-Planck EZ keymaps
* Add 40 Percent Nano with Analog Joystick
* Add Collide39 keymap
* Fix OLED printing to be more flavorful
* Fix up Iris GamePad and come cleanup
* Expand OLED char map further
* Add modded characters to keylogger
* Here be dragons
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Fix up rules for community layouts
* Some more OLED tweaks
* Add mod mask check function
* Change QMK DFU Audio pin to be correct
* Use manual STM config instead of CTPC for Collide 39
* Fix off-by-one error in Lily58 function keys
* Swap number and symbol layers
* Move grave/tilde to the left of brackets/braces
* Add KLE links
* Move function keys to Raise layer
* Move symbols nearer to home row
* Add readme for Lily58 layout
* add temporary test shell-spript
* Use LINK_TIME_OPTIMIZATION_ENABLE instead of Link_Time_Optimization
No change in build result.
* Helix config.h use '#pragma once'
No change in build result.
* Helix helix.h,rev?/rev?.h,pico/pico.h use '#pragma once'
No change in build result.
* Use drivers/avr/pro_micro.h instead of keyboards/helix/pro_micro.h
No change in build result.
* remove keyboards/helix/{rev2|pico}/serial_config.h
No change in build result.
* 'HELIX_ROWS' macro is now referenced only in rev1/config.h and rev2/config.h.
No change in build result.
* The contents of helix/rules.mk were distributed to subdirectories.
This is a preparation to create a new subdirectory for helix code using split_common.
No change in build result.
remove 'USE_I2C = yes', 'SUBPROJECT_rev1 = no' from keyboards/helix/rules.mk.
follow code move from keyboards/helix/rules.mk to keyboards/helix/{rev1,rev2,pico}/rules.mk.
----
SRC += i2c.c
SRC += serial.c
SRC += ssd1306.c
CUSTOM_MATRIX = yes
---
* helix/{i2c.[ch], serial.[ch], ssd1306.[ch]} move into helix/local_drivers/
No change in build result.
* Simplified 'helix/pico/keymap/*/rules.mk' using KEYBOARD_LOCAL_FEATURES_MK.
No change in build result.
* add keyboards/helix/pico/local_features.mk
* add 'KEYBOARD_LOCAL_FEATURES_MK := $(dir $(lastword $(MAKEFILE_LIST)))local_features.mk' into keyboards/helix/pico/rules.mk
* remove HELIX_CUSTOMISE_MSG from keyboards/helix/pico/keymaps/*/rules.mk
* remove HELIX= process from keyboards/helix/pico/keymaps/*/rules.mk
* remove convert code(helix to standaerd) from keyboards/helix/pico/keymaps/*/rules.mk
* add 'include $(strip $(KEYBOARD_LOCAL_FEATURES_MK))' into keyboards/helix/pico/keymaps/*/rules.mk
* Simplified 'helix/rev2/keymap/*/rules.mk' using KEYBOARD_LOCAL_FEATURES_MK.
No change in build result.
* add keyboards/helix/rev2/local_features.mk
* add 'KEYBOARD_LOCAL_FEATURES_MK := $(dir $(lastword $(MAKEFILE_LIST)))local_features.mk' into keyboards/helix/rev2/rules.mk
* remove HELIX_CUSTOMISE_MSG from keyboards/helix/rev2/keymaps/*/rules.mk
* remove HELIX= process from keyboards/helix/rev2/keymaps/*/rules.mk
* remove convert code(helix to standaerd) from keyboards/helix/rev2/keymaps/*/rules.mk
* add 'include $(strip $(KEYBOARD_LOCAL_FEATURES_MK))' into keyboards/helix/rev2/keymaps/*/rules.mk
* Added helix keyboard build NEW method.
No change in build result.
## Helix build
$ make helix:default ## no oled, no backlight, no underglow
$ make helix/rev2/back:default ## no oled, with backlight, no underglow
$ make helix/rev2/under:default ## no oled, no backlight, with underglow
$ make helix/rev2/oled:default ## with oled, no backlight, not underglow
$ make helix/rev2/oled/back:default ## with oled, with backlight, no underglow
$ make helix/rev2/back/oled:default ## with oled, with backlight, no underglow
$ make helix/rev2/oled/under:default ## with oled, no backlight, with underglow
$ make helix/rev2/under/oled:default ## with oled, no backlight, with underglow
## Helix pico build
$ make helix/pico:default ## no oled, no backlight, no underglow
$ make helix/pico/back:default ## no oled, with backlight, no underglow
$ make helix/pico/under:default ## no oled, no backlight, with underglow
$ make helix/pico/oled:default ## with oled, no backlight, not underglow
* add temporary test shell-spript
* test end remove test script. Revert "add temporary test shell-spript"
This reverts commit 5dac20cd0f8b4bc192edb2313652c1635f829657.
* test end remove test script. Revert "add temporary test shell-spript"
This reverts commit ec49f63b2dc0f2b3fe8c1c36ffa615cee2f7e3ed.
* Extended the 'HELIX=' option. add keyword 'verbose', 'no_ani'.
No change in build result.
* update keyboards/helix/{rev2,pico}/keymaps/default/readme.md
* rename KEYBOARD_TOP_DIR to HELIX_TOP_DIR in rules.mk
* update keyboards/helix/{rev2,pico}/keymaps/default/readme_jp.md
* rm keyboards/helix/pico/oled/rules.mk
* update helix's readmes. All the ':avrdude' was replaced with ':flash'.
* remove F_CPU, ARCH, F_USB, INTERRUPT_CONTROL_ENDPOINT from helix/rules.mk
No change in build result.
* Revert raise/backspace mod tap to just backspace
* Initialize usb_usb/narze
* Modify keys
* Add readme
* Support Right shift to )
* Add Dev layer
* Use Dev layer on holding z key
* Add Dev layer for Ergodox
* Update keyboards/converter/usb_usb/keymaps/narze/README.md
Fix the command & close the code block as suggested
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Reduce rules
* Add dz60 keymap
* Add my TADA68 layout
* Fix descriptions and formatting
* Formatting fixes
* Add readme file
* Formatting
* move caps lock to correct key, add F-keys to both layers
* Add readme for dz60
* First draft of custom Let's Split layout
* Some more keys
* Finalized keymap
* Added a bunch of custom shortcuts to make layout easier to read
* Add PERMISSIVE_HOLD option to modtap behavior
* Add lock and sleep shortcuts, formatting
* Minor fixes and adjustments
* Add PERMISSIVE_HOLD option, add sleep/lock shortcuts, minor fixes
* Add sleep/lock shortcuts, minor fixes
* fixups
* Major simplification of lets_split layout into more standard raise/lower/special layers
* Remove layer songs, add to readme
* Formatting
* Switch a few keys around for reachability
* Add windows/mac specific layers
* simplify layers
* Update README
* Fix legends
* Invert numpad and put Del in upper right corner
* Disable arrow keys on Raise, add build instructions
* Move dz60 keymap to its own branch
* Remove redundant configuration
* Change volume and sleep keycodes to standard
* Removing empty rules.mk
* Changing layer defines to enum
* Adding comment to explain reason for swapping KC_TRNS and KC_NO fillers
* Adding profile for Corne with tap dance Swedish support.
* Remove extern keymap_config_t keymap_config as no longer needed
* Changed to use tap_code over register_code
* Removed persistent_default_layer_set
* Moved macros to hvp user space ink tap dance code
* Removed not used functions
* Moved to an ifbased include statement
* Removed not needed characters
* initial commit
* OLEDに表示するロゴをuzuのものに差し替えた
* delete undefault keymaps
* delete info.json
* delete pro_micro.h
* remove USE_Link_Time_Optimization check
* Moved constant defined for each keymap.c to rev1.h
* update layer_state_reader.c
* Rename Uzu42 to uzu42
* remove bootloader.h include
* LAYOUT_kc to LAYOUT
* delete keymap level rules.mk
* update readme.md
* remove persistent_default_layer_set function.
* try refactor to use split_common and use OLED driver
* Revert "try refactor to use split_common and use OLED driver"
This reverts commit 5a9afceacb450ca9eca8a146b64c24d0e0925dd8.
* Update keyboards/uzu42/rev1/config.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rev1/rev1.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rev1/rev1.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove lines already defined in QMK
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* replaced comment block
* Update keyboards/uzu42/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Revert "Revert "try refactor to use split_common and use OLED driver""
This reverts commit a7849216f49a411558d4cfdcfbf3e202defe892a.
* fix setting for RGBLED
* The default of OLED_DRIVER_ENABLE has been changed to no.
* Delete unuse block.
* Remove unnecessary keycode definitions.
* Remove unuse custom keycode.
* Remove not needed code.
* Remove not called code.
* Remove code overwritten by the core.
* Remove LAYOUT_kc macro.
* Moved the definition of the layer block to keymap.c.
* Removed unuse variable.
* Remove code overwritten by the core too.
* incorporate layer changes
* Moved src rule to keymap from rev1.
* Removed rgb_state_reader.c from lib folder and the code move to the keymap.c
* Removed layer_state_reader.c from lib folder and the code move to the keymap.c
* Removed logo_reader.c from lib folder and the code move to the keymap.c
* Removed keylogger.c from lib folder and the code move to the keymap.c
* Moved glcdfont_uzu42.c from lib folder to the default keymaps folder.
* Removed unused files.
* - Enabled Unicode Feature to fix the build
- Added TapDance Feature to improve the functionality of the Keyboard
- Added the ability to switch between the Unicodes Modes
- Added more Emojis thanks to the tap dance feature
* Fix Format
* new keyboard bm43a
* Thanks to noroads for generating this with his online tool
* add QMK Configurator support thanks to noroads
* turn on bootmagic lite
* update readme
* remove unneeded comments
* Removed ugfx binary because of antivirus
* Created laurent's keymap
* Made QWERTY Mac and QWERTY Windows
* Rev 1.0, added _PUNC, _NAV, _EXTRA
* REV 1.1, Dynamic macros start/stop now plays a sound, Lower acts like backspace on tap
* Formatting fixes
* Added Intellisense macro, fixed formatting
* Improved ergonomics/muscle mem on punctuation lay
* Added Raise Tap to Backspace
* Mirrored Ergodox, added One-Handed
* Added layers in README.md, added Caps lock, Scroll lock
* Moved Caps to better location
* Added ErgoDox link
* Edit Readme.md with more layer switching information
* Modified _PUNC for muscle memory
* Reverted .gitignore and .vscode settings.json to reflect master
* Improved formatting according to PR review
* QMK_KEYBOARD_H def for Intellisense fixed->rev3.h
* .gitignore diff fix
* Fixing settings.json diff
* Update settings.json
* Update keyboards/preonic/keymaps/laurentlaurent/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* - added new layout for dz60
- created personal keymap using new layout
* - changes based on pr feedback from @noroadsleft
* - further readme formatting
* Apply suggestions from code review
applied changes based on review feedback
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* - readme formatting
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Added KBD6X Vimwarrior HHKB TOFU Personal Layout
* Added Readme.md for Vimwarrior HHKB Tofu Keymap
* Added DZ60 Vimwarrior WKL Tofu Keymap
* Update Rename keymaps to devinceble_hhkb_tofu and devinceble_wkl_tofu
* Update rules.mk Added BOOTLOADER config.
* [Keymap] Added devinceble keymap for TADA68
* Fix projectkb/alice Right Spacebar Size to 2.75 not a bug though but confusing
* Update Right Alt for Layout Fix
* Use .template file extension for keyboard template files
* Filter out .template files completely before passing to clang-format
* Undo file extension stuff; just ignore quantum/template dir
* Translated breaking_changes.md in French
* Translated ChangeLog/20190830.md to French
* Update docs/fr-FR/breaking_changes.md
Co-Authored-By: Max Rumpf <max.rumpf1998@gmail.com>
* Fix comments from @zekth
Co-Authored-By: Vincent LE GOFF <g_n_s@hotmail.fr>
* initial commit
* thank you mr keebs for making this easy. Added 65_ansi macro made from mrkeebs kle2qmk tool.
* split backspace requires an additional row
* change k43 to k42
* add in split space bar support for LAYOUT_all
* add QMK Configurator support
* make default keymap more usable
* update readme
* Update keyboards/exent/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/exent/keymaps/default/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/exent/keymaps/default/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/exent/rules.mk
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Adds the files that will be translated
* Start translate cli_configuration.md in French
* Translated cli.md in French
* Translated getting_started_getting_help.md in French
* /getting_started_github.md
* Translated first part of contributing.md in French
* Finish translation of contributing.md
* Translated the getting_started_introduction.md in French
* Corrected issues from @zekth review
Co-Authored-By: Vincent LE GOFF <g_n_s@hotmail.fr>
* using similar keymaps (with vim in mind) for planck and crkbd
* changed to rgb matrix and lower max brightness to prevent unresponsiveness
* readme and default rgb mode
* disable all the not wanted effects and activate the framebuffer ones
* changed effects
* changed custom keycodes to defines
* fixed comment
* CLI command to serve docs locally
* Document it
* Default port
* Use `with` and subclass `SimpleHTTPRequestHandler` to set working dir
* Apply suggestions from code review
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Update docs/cli.md
* Translated _summary.md + newbs.md
* Translated news_best_practices.md in French
* Translated newbs_building_firmware_configurator.md in French
* Translated the file newbs_building_firmware.md in French
* Translated page newbs_flashing.md in French
* Translated the page newbs_getting_started.md in French
* Translated the page newbs_learn_more_resources.md in French
* Translated the page newbs_testing_debugging.md in French
* Change translation of split from 'séparé' to 'scindé'
* Adding the lang file for gitbook and some others tranme other translation
* Correcting typos after Gimly's review
* Some others sections on the summary
* Fix first comments from @zekth
* Fix some issues from @4sStylZ
* Fix other issues from @4sStylZ
* Fix weird phrase
* Replaced all uses of 'téléverser' by 'flash'
* Replaced all planches by board
* Fix other PR comments
* Fix comment
* [Docs] Add AVR and ARM examples to GPIO Commands
Add examples for reference for people not as well versed in microcontroller coding, such as myself.
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
The top-right key should be = and not the shifted pseudo-key +. This
matches the sample layout from the picture in the readme [0].
[0]: https://i.imgur.com/xVkODOu.jpg
sprintf always adds a NULL terminator at the end of the buffer it works on.
A few places made just enough space for the resulting string, but not the terminator.
So this just adds one to the buffer size to make room for it.
`list_keyboards` replicates the `make list-keyboards` by globbing for all paths
that include `rules.mk` and then removing the paths that include `keymaps`.
This basis of this cli command could be reused in the future as a util, but is
not done so here since this would be the only place that would use it currently
Resolves#6911
* [refactor] updating ninjonas layout blocks and standardized LOWER & ADJUST
* [feat] added new macro M_TERM to open MacOS terminal app
* [feat] introducing mod-tap functionality on keymap
* [fix] fixing oled turning on when it feels like it. thanks @drashna for helping
* [feat] updating OLED to rotate logo 180 degrees
* [feat] updating keymaps to reflect VSCode frequent habits
* [refactor] converting crkbd modifier keys to layer blocks
* [fix(#6903)] converting _delay_ms to wait_ms on launching terminal macro
* [keymap] dactyl_left
Special layout for the left side of the ergodox dactyl.
* [keymap] dactyl_left
Special layout for the left side of the ergodox dactyl.
* Updated readme.md
* Update keyboards/handwired/dactyl_left/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Addressing changes for PR
removed layers.json and 15-24 from rules.mk
* Updating keymap for better a default
Hopefully this works as a starting point
* Created personal keymap for dz60 hhkb layout.
* Renamed directory joooosh to joooosh_hhkb... Removed redundant KC_TRNS alias #define... Updated to use KC_TRNS alias defined in QMK_KEYBOARD_H.
* Initial Lily58 keymap
* Still not sure if these thumb key placements are optimal or not. I
might want to move space (enter) one key to the left (right),
respectively.
* Also unsure how I feel about Esc on a mod tap key with Ctrl... might
move it back to its own key and relocate the = key.
* Missing bindings for Print Screen, Scroll Lock, Pause/Break.
* Make Lily58 layout support operation without numrow
* Move some Lily58 modifiers around
* Move nav keys to more consistent locations
* Rebinding shift on Raise is stupid
* Don't stomp Ctrl on the Lower layer
* Tweak bottom row a little bit
* add ISO-DE layout with 5x1u and split right shift
* cleaning up
* renamed readme.md and layout. added underglow
* change layout name in info.json
* rename readme.md
* renamed layout in comment. added rgb keys to visualisation
* change Layout name in dz60.h visualization
* initial commit
restart of osa development
* minor changes
Minor changes
mostly changing naming and comment out rgb modes
* initial commit
restart of osa development
* minor changes
Minor changes
mostly changing naming and comment out rgb modes
* more minor changes
comment out some functions
correct some spelling errors
change some of the descriptive text
* Minor Changes
Minor changers per PR requests
* Minor Changes
Minor changes per PR suggestions
* Major Changes
Per PR suggestion from noroadsleft:
- changed macro to LAYOUT_all in info.json, dualsplit/keymap.c and ocm/keymap.c, and osa.h
- added osa.h macros for other layouts per suggestion and used suggested naming
- changed naming of layout macros to correspond to macros and naming in default/keymap.c, dualsplit/keymap.c, ocm/keymap.c, splitbs/keymap.c, and splitrs/keymap.c
- removed duplicate layers from all keymaps and edited per suggestions
- compiled each keymap to check for and correct any potential errors. all compiled with no errors
* Minor Change
- fixed imgur image link in readme.md to be correct format
* Minor Changes
changes to macro layouts in osa.h
changes to dualsplit/keymap.c - added arrows to layer 1
* Changes
- Made changes to info.json to match osa.h
- changes to osa.c enabling indicator LEDs
- changed "dualsplit" directory name to "all" to match keymap naming in osa.h, info.json, and keymap.c
- minor changes to all/keymap.c
* Update keyboards/sck/osa/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/osa/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Changes to info.json
- revert to info.json from version in b3b49c3 per requested changes
* production version of the PCB has the top two right most keys swapped around. There are only 6 protos in existence and one of them is mine so we can just do this.
* update readme by adding backticks
* initial commit
* fixup init_rows and read_rows routine
* fixup matrix based on Marcus's tracing info
* add a temporary keymap
* add notes
* use a standard tkl ansi keymap
* turn on that last column
* backslash and backspace row left to fix
* reorg from backslash to pgdn
* got the matrix done but the backspace location at K4N is still suspect
* add reset info into readme
* add qmk configurator support
* add community layout support
* remove uneeded keymap readme
* add a new column just for the reset switch
* change copyright dates
* add cautionary message to readme as we don't know about the lighting condition yet
* Update keyboards/duck/orion/v3/v3.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/duck/orion/v3/v3.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/duck/orion/v3/v3.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* change bootloader comments
* initial commit of skog_lite
* add layout macro from misterkeeb's tool
* add default keymap
* add pins used
* rgb support
* add tkl ansi community support
* update readmes
* add new layouts and configurator support
Features:
* Tap space for space, hold for cmd
* Tap caps lock for esc, hold for ctrl
* Dedicated key for entering default mode of yabai window manager
* Who needs arrow keys, anyways???
* Method for clearing all stuck-down mods
This fixes the following issue related to encoding on linux systems. Add
`universal_newlines=True` to subprocess.
<class 'TypeError'>
☒ a bytes-like object is required, not 'str'
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/milc.py", line 564, in __call__
return self.__call__()
File "/usr/local/lib/python3.7/site-packages/milc.py", line 569, in __call__
return self._entrypoint(self)
File "$HOME/qmk_firmware/lib/python/qmk/cli/doctor.py", line 56, in doctor
for line in mm_check.stdout.split('\n'):
TypeError: a bytes-like object is required, not 'str'
* remove IT_PIPE duplicate and add IT_GRAD
IT_PIPE was declared 2 times, ones as ° and once as |. I changed the first declaration and called it IT_GRAD. I even fixed the definition because the ° in Italian is obtained with LSFT(IT_AACC)
* rename IT_GRAD to IT_DEGR
* add missing plus_and_minus
* fix missing IT_ACUT definition
* change KC_LALT(KC_LSFT to LALT(LSFT
* Fix alignment
* remove leftover
* fix issue generated with chars while pushing
* fix typo
* fix LCBR and RCBR
* fix euro symbol
* fix RBRC
* change IT_LESS form KC_NUBS to KC_GRAVE
* add IT_TILDE and change IT_GRAV to IT_GRAVE
* add missing legends for accented vowels
* format for readability
* revert to commit befor I edit it
* initial commit
* edited to be easier to compare to _ansi.h
* remove keymap_italian_osx_iso.h and rename with edits keymap_italian_osx_ansi.h to keymap_italian_osx.h
I found out there were no difference at all
* fix missing #endif
* rename quantum/keymap_extras/keymap_italian_osx.h to quantum/keymap_extras/keymap_italian_ansi.h
Now this file is a clone of the keymap_italian.h that appears to be working only for ISO keyboards. It also contains a few improvements for IT_PIPE (defined two times) and IT_ACUT (missing definition). Additionally it redefines LCBR and RCBR to LSFT(IT_LBRC) and LSFT(IT_RBRC)
* rename file
* redefines IT_BKSL and IT_PIPE based on KC_BKSL
* add new osx_iso and osx_ansi version for italian.h and align BKSL to BSLS, fix double definition of PIPE
* Align bottom row in KBD6X keymap to match LAYOUT macro
* Remove TAP_HOLD_CAPS_DELAY override in userspace
* Change default USB polling rate to 1000 Hz
* Move media controls to nav cluster on Wasdat
* Add dz60:konstantin_b keymap
* Add personal keymap
* Additional readme note
* Fix typo's in readme
* Additional layer key info in readme
* Update keyboards/crkbd/keymaps/rpbaptist/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/crkbd/keymaps/rpbaptist/rules.mk
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/crkbd/keymaps/rpbaptist/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove redundant config
* Remove disabling of NO_ACTION_MACRO and NO_ACTION_FUNCTION
* Remove layer keycode macros
* Use layer_state_t instead of uint32_t
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Use get_highest_layer instead of biton32
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* OLED_ROTATION_90 instead of 180
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Use get_highest_layer instead of biton32
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Use get_highest_layer instead of biton32
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Revert "OLED_ROTATION_90 instead of 180"
This reverts commit f14a4353ab6719c6e4e8974a4d17f8b91940de56.
It messed up the logo on slave
* Use IS_LED_ON function to check LED status
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* first commit, skeleton code, not sure if working
* Owlet 60 working firmware, json not sure
* use json from kle to qmk converter
* deleted temporary text from owlet60.h
* owlet60 working oled and led firmware
* moved owlet60 to handwired
* updated readme.md
* Revert "owlet60 working oled and led firmware"
This reverts commit 27f9465aabd62d9ee445b477a02af348160532c1.
* Revert "moved owlet60 to handwired"
This reverts commit 9b8e8344fc303ddc4dcc3b023d4e9d05b89d5800.
* revert changes, moved owlet60 to handwired, updated copyright blurb
* fixed readme.md
* removed duplicate items
* resolve merge artifact
* Update keyboards/handwired/owlet60/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* check out merge artifacts with qmk master
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* removed redundant rule on oled_testing/rules.mk, refactored mux switching code on matrix.c
* setup local build config, created npm build script to speed things up
* removed some profiles and gutted readme
* began configuring default and lower layout
* lower: fixed right arrow and added music toggle
* began configuring default and lower layout
* changed startup song
* updated comment typos
* I did that thing where i basically refactored everything :)
* Converted 2U key to 1U's
* Reorganized and tidied up
* Reorganized and tidied up
* space now changes layers
* updated numbpad
* updated readme
* removed unwanted files
* addressed change requests
* support tkl_iso community layout
* fix comments from review
* fix review comments
* LAYOUT is an alias for LAYOUT_all
* add keymap default_iso
* revert changes to default keymap
* Initial stab at some fake dfu-util-split-left behaviour
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Clang format fixes
* Fake eeprom init for both left and right hand
* Port personal keymap to 60_tsangan_hhkb
- add 60_tsangan_hhkb layout to plain60
- Fix bug in split rs in plain60
- use community and user based layout for 60_tsangan_hhkb
- set up audio for plain60 only
* Add LAYOUT_60_ansi_split_bs_rshift
* Refactor: matrix
* New readme file
* Configurator support
* change info.json to debug linting
* use an enum to manage the layers
* readme cleanup
file header, docs links
* use #pragma once in keyboard header file
* use new-style OLKB layout macro naming scheme
* fix layout macro references in keymap.c
* correct Keyboard Maintainer
* start wraith firmware
* completed initial setup
* added amber keymap to wraith
* fixed LEDs, wrote readme files
* reverted bootloader type after troubleshooting
* decapitalised files and directory as per qmk standards
* Update Wraith keyboard folder
- Add timer keymap with documentation
- Remove boilerplate in rules.mk, ready for pull request
- Update info.json with ISO and ANSI layouts, ready for QMK Configurator
* Add Efreet keyboard
* Remove unnecessary keyboard folders
* Enable community layout support for Efreet
- Rename LAYOUT macro to LAYOUT_ortho_4x12
- Add layout macro named LAYOUT_planck_mit
- Remove unnecessary magic key command, as we are using the default
- Fix readme.md formatting for GitHub
* Fix community layout support for Efreet
- Fix 2u spacebar keycodes in LAYOUT_planck_mit to denote absence of switch
- Turn on Community Layouts in rules.mk
* Update default keymap.c to use community layout
* e6.5 actually already had a 65_ansi_blocker LAYOUT macro, so just had to enable in rules.
* Add the 65_ansi_blocker LAYOUT macro and enable in rules.mk
* rename LAYOUT macro in .h and in the keymap.c as it was only a default keymap. Also enable in rules.mk
* rename but also had to define the existing LAYOUT macro as the new one to prevent breakage of existing keymaps
* add 65_ansi_blocker support for vinta
* forgot to update the info.json on these
* add new default layout 65_ansi_blocker support to alt
* add 65_ansi_blocker support
* undo changes
* Began Work On STM32 Ergodox
Changes to be committed:
new file: keyboards/ergodox_stm32/config.h
new file: keyboards/ergodox_stm32/rules.mk
* test
* Now it compile. Not linking thou
* Screw this Linker. It links now!
* Blinkly Keyboard
* bootloader test code
* Working on matrix / i2c stuff
* Progress (LED Blink)
* Progress on MCP_23017 Status Flag
* [WIP]
* update
* Works! Remeber to change back the bootloader address when the new bootloadrer is ready.
* Time to go debug the i2c
* Finally, it now works with PCB Rev 1.0.2
* updated for rev.2 pcb
* minor compilation fix
* Why when debugger is enabled then everything works.
* Remeber to call init functions.
* Update arm i2c driver to support STM32F103 series device.
* fix include once header. Replaced with #pragma once.
* complication test
* add default LAYOUT_60_ansi
* add LAYOUT_60_hhkb support
* add tsangan_hhkb support
* add ISO support and rename LAYOUT to LAYOUT_all
* formatting
* add community layouts support
* remove unneeded code
* missed a LAYOUT rename
* add link time optimization to reduce firmware size for some people's keymaps
* new keymap for my chocolate tofu65 with dz65rgb
* consistent with a tada68 layout
* remove extra layer, add swap keycodes and mouse keycodes
* fix the tabs and spaces
* fix the left shift
* readme updates for 60_ansi and split variations
* add new community layout for mechmerlin for the new default layout 65_ansi_blocker
* change path now that kbd67 has been updated
* fix up spacing
* move kbd67mkiirgb into kbd67 directory as mkiirgb
* rename files
* rename LAYOUT to LAYOUT_65_ansi_blocker
* add support for default layout
* update readme for new build target
* update parent readme with the fourth variant
* rename LAYOUT to LAYOUT_65_blocker_ansi
* rename LAYOUT macro
* enable LAYOUT_65_blocker_ansi community layout support and remove uneeded lines of code
* rename LAYOUT to LAYOUT_65_blocker_ansi
* rename LAYOUT macro
* enable LAYOUT_65_blocker_ansi community layout support
* enable LAYOUT_65_blocker_ansi support
* fix rename mess up
* add QMK Configurator support with the new rename
* rename blocker_ansi to ansi_blocker as it rolls off the tongue easier
* Rework how bin/qmk handles subcommands
* qmk config wip
* Code to show all configs
* Fully working `qmk config` command
* Mark some CLI arguments so they don't pollute the config file
* Fleshed out config support, nicer subcommand support
* sync with installable cli
* pyformat
* Add a test for subcommand_modules
* Documentation for the `qmk config` command
* split config_token on space so qmk config is more predictable
* Rework how subcommands are imported
* Document `arg_only`
* Document deleting from CLI
* Document how multiple operations work
* Add cli config to the doc index
* Add tests for the cli commands
* Make running the tests more reliable
* Be more selective about building all default keymaps
* Update new-keymap to fit the new subcommand style
* Add documentation about writing CLI scripts
* Document new-keyboard
* Update docs/cli_configuration.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/cli_development.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/cli_development.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/cli_development.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Address yan's comments.
* Apply suggestions from code review
suggestions from @noahfrederick
Co-Authored-By: Noah Frederick <code@noahfrederick.com>
* Apply suggestions from code review
Co-Authored-By: Noah Frederick <code@noahfrederick.com>
* Remove pip3 from the test runner
* move canoe into percent directory
* update readme for new make path
* move skog into percent directory
* update readme for new path and new instructions
* update readme
* fix error in naming
* made tapdance dual_role general
* updated original dual_role functionality
* added toggling layer example
* Fix dual role and add alias
* Update docs about new layer tap dances
* Fix up based on feedback
* Add support for Void Linux systems to the qmk_install.sh script
* Fix typos + grammatical edits in comments
* Sort distributions by alphabetical order in linux_install.sh
* Revert previous commit and sort Void packages in alphabetical order
* Fix permissions on `util/linux_install.sh`
* Add reset instructions for boards that use Command to the Zadig driver installation guide
* -> → →
* Apply suggestions from code review
Replace shorthand keycode names with full names
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Added ottodokto keymaps for dz60 and tmo50.
* moved placement of keymaps to proper directory
* fixed accidental deletion of semicolon for tmo50 map
* fix to use short form codes
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* provide means to turn on RTP mode and set the amplitude
* new keycode HPT_CONT to turn RTP off/on
* introduce new keycodes HPT_CONI, and HPT_COND for Haptic Continuous Increase and Decrease
* support for continuous mode amplitude increase and decrease
* code cleanup
* update docs to reference new keycodes and functionality
* don't touch the keymaps
* add function prototypes
* add proper guards
* cleanup guards
* remove extra reserved
* move caps lock led to keyboard level so even QMK Configurator users have access to it
* set bootloader correctly to atmel-dfu
* clean up extra carriage return
* Updated encoder.c so that split encoders are indexed based on left hand encoders first.
This ensures when swapping master sides that code logic based on encoder index doesn't change.
PR Review fixes
* Removed extra define
* convert codebase to #pragma once
* fix file includes
- quantum.h is included at keyboard level, redundant at revision level
- keyboard-level path is accessible at revision level, remove relative pathing
* duplicate common layout macros from rev1 to rev2
Add the layout macros supported by both rev1 and rev2 to rev2.h directly, which exposes these layouts to QMK Configurator.
* enable community layout support (75_ansi, 75_iso)
* add LAYOUT_75_iso layout data
It needs its own tree because its keys are in a different order from LAYOUT_iso_1u even though the physical layout is the same.
* minimize rules.mk files (use QMK defaults)
* use atmel-dfu bootloader rule
* fix typo on rev1 info.json
* making a new board setup for ymdk bface clone
* removing extra keymaps that copied over
* documentation and edits for new ymdk_bface board
* cleaning up config and keymaps
* removed extra keymap and working on READMEs
* readme edits
* shorter aliexpress link in ymdk_bface readme
* added images to readmes and edited the keymaps
* more flashing directions
* Mac directions formatting
* editing and creating the all layout
* cleanign up ymdk_bface keymaps
* fixed typos in layout
* removed tabs
* cleaned up the LED and Backlight configuration.
* adding more to info.josn and cleaning up readme
* fixing JSON typos
* made a ymdk folder and moved the bface into it.
* fixing file names for the new folder structure
* Added Xerpocalypse's layout
+ Number row and symbols are switched compared to default TMO50 layout
+ Right-hand spacebar acts as backspace and a hold-layer for layer 2.
* Update keyboards/tmo50/keymaps/xerpocalypse/keymap.c
Removed unnecessary #define
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/tmo50/keymaps/xerpocalypse/keymap.c
Changed keymap to use KC_UNDS instead of custom-defined keycode
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* get rid of custom matrix that is no longer being used
* remove _kc LAYOUT
* remove ifdefs and replace with pragma once
* cleanup rules and use bootmagic lite
* get rid of led.c
* Update keyboards/alps64/alps64.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* remove unneeded configurations
* Fix Planck default keymap to play sounds on rev6
The dip_switch_update callback was overriding the default startup sound. This should prevent that from happening, and still allow it to play sounds, or stop them, when appropriate.
* Fix Preonic default keymap to play sounds on Rev 3
The dip_switch_update callback was overriding the default startup sound. This should prevent that from happening, and still allow it to play sounds, or stop them, when appropriate.
* Fix enables for Haptic Feedback
If you enabled bothe DRV2605 and SOLENOID, it would only enable one of these, not both.
This fixes the check so that you can enable both options.
* Fix check for haptic feature
It was sending a comma keypress, while I believe that the targeted
stenography software (at least on systems that generally use
US-International keyboard layout) expects a single-quote/apostrophe key.
* adding working 2key2crawl
Adding working 2key2crawl files
edited files in accordance with original PR comments
* Changes
Changes and updates
* Update readme.md
* Update config.h
removed IS_COMMAND block that was missed in previous commit
* Changes to vol/keymap.c
Removed unneccesary function
* adding a custom mf68 keymap
* added custom tada68 keymap
* readme edit on tada68 map
* added mac fast-forward and rewind keybindings to tada68 emdarcher keymap
* tada68 keymap documentation and edits
* cleanup and edits
* typo fix in emdarcher's tada68 keymap
* cleaning up emdarcher keymap for tada68
* cleaned up emdarcher keymap for mf68
* Created python version of new_keymap.sh: new_keymap.py
* Updated usage message
* Updated new_keymap.py to use python3.5+ syntax & be more similar to new_keyboard.sh
* Updated complete message
* Updated usage in argparser and removed incorrect usage_message
* Reverted the fstrings back to strings that use .format() & updated docstring convention
* Added helper to recursively cd .. until at qmk_firmware root directory
* Revert "Added helper to recursively cd .. until at qmk_firmware root directory"
This reverts commit 61a0ff3b25f91901287bec8d58eb51a1f126e2ad.
* Updated new_keymap.py to use printf-style format strings
* First draft lib/python/qmk/cli/new/keymap.py with milc
* Removed shebang & syspath appending lines
* Added optional args & resolved some cr comemnts
* Added a docstring and updated strings
* Added new 2x5 Keypad with 3 LEDs to indicate the selected layer. By Jonathan Cameron.
* Minor refactor from suggestions from qmk team
* Added
* Moved to 'handwired' directory
* Update readme.md
* Update readme.md
* Update readme.md
* Update keyboards/handwired/2x5keypad/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Switch to image offsite
* Moved image offsite
* Update keyboards/handwired/2x5keypad/keymaps/default/keymap.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/2x5keypad/2x5keypad.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Moved functions into .c file per suggestions
* Cosmetic
* Fixed function called, per suggestions.
* Update keyboards/handwired/2x5keypad/2x5keypad.h
Ok
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Moved LED functions to the top level since they can be used it various flavors
* Declare those moved LED functions!
* Update keyboards/handwired/2x5keypad/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
The E6.5 is the new 65% keyboard made by Exclusive.
This changeset adds its PCB to QMK, including all the bottom row
variants and iso/ansi/split BS layouts.
* add dp60 keyboard
* fixup wording in readme
* fix layout name in default keymap. I was missing an r
* Add QMK Configurator support for the additional layouts
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* strip out the VIA enabling from default rules.mk
* add a VIA only keymap
* Add Rabbit68 Keyboard w/ default,kaiec keymaps.
* Requested changes by @fauxpark
* Change flash command, as suggested by @drashna
* Update keyboards/rabbit/rabbit68/readme.md
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Add link to Github repo
As I per suggestion changed the link above to an image, I added now the link to the project page to the Open Source text, where it actually makes the most sense.
* change LAYOUT_ANSI to LAYOUT_60_ansi
* change QMK Configurator layout to LAYOUT_60_ansi as well
* add 60_ansi support so I can make my userspace =)
* update readme
* Very strange. ISO keymap is still using 60_ansi LAYOUT macro. But then again....no ISO hottswap dz60 has been released
* UT47.2 keymap/updates for Planck style layout switching
* UT47.2 keymap for Planck-style layout switching / code clean up
* UT47.2 keymap for Planck-style layout switching: Qwerty, Workman, Colemak, Colemak Mod-DH, and Dvorak added / code clean up
* Change the layout info to match the keymap
* Edit readme to contain relevant info for layout switching
* Edit readme to contain relevant info for layout switching
* Edit readme to contain relevant info for layout switching
* Edit readme to contain relevant info for layout switching. Add QMK Configurator file.
* Update readme.md with make information
* Undo breaking change in config.h
* Code cleanup
* Code cleanup
* Code cleanup
* More code cleanup
* Turn off more unnecessary features by default
* Double TAP_CODE_DELAY due to more media key issues
Even with this change, some of the rotary encoder turns on my BDN9's
volume knob still seem to get dropped. It's possible there's something
wrong with the encoder itself. (Maybe the TAP_CODE_DELAY actually causes
QMK to miss an encoder turn? Unclear.) The other knob (backlight
brightness) works fine, FWIW....
* Restructure userspace config.h a bit
* Hack around Instant60 Via EEPROM conflict
Remove this when #6589 is fixed for Via boards.
* Add backlight breathing and (EEPROM) reset to BDN9
* Add keymap for 9-Key macropad
* Add a quefrency keymap
* New Alt-ernate layouts
* Enable Per Key Tapping Term to preserve sanity
* Use underglow and mod lights for status on Corne
* Update the drashna_ms keymap for quefrency
* Disable Audio since there isn't enough space
* Update KC_MAKE to ues :flash target
* Cleanup ergodox layout
* Enable i2c support for Iris
* Add keymap support for CG_SWAP
* Enable RGB Matrix Shutdown mode
* enable heatmap
* Update gitlab CI to install python3
* Remove game macros
These are no longer needed, and haven't been used in ages
* Cleanup planck layout
* Add RGB Matrix fun and RGB cleanup
* Add keycode and config for RGB Matrix idle animations
* Clean up rgb idle animation code
* Add rgb idle keycode to keymaps
* Fix issues with rgb matrix idle animation
* Fix some handling for idle animation
* Reduce idle animation timeout to 15s to be more reasonable
* fix up rgb stuff
* Fix isses with rgb functions not being called for matrix
* Use custom EEPROM Magic Number so testing is easier
* Extend Default Layer macro to support a lot more layers
* Fix bjohnson macropad
* Adjust KC_MAKE to process mods for more consistent behavior
* Fix up rgb stuff on corne
* Corne OLED Overhaul
* Fixes a number of issues with weirdness.
* Fixes issues with keylogger (should be more reliable now)
* Modulaize the OLED render sections
* Rewrite layer display code
* Update URL for Font Editor
Due to odd issues, I ended up rewriting from scratch. And using PROGMEM versions, since I think I was getting memory overflows.
* Update polling rate on all keebs
* Fix planck ez layout config
* Remove macros from Viterbi
* Update keymap.c
Additional functionality added to layers.
* Error fix
Fixed missing key in layer 5, fixed brightness keys with universal codes, made code more readable.
* fix missing commas
fixed missing commas on line 19 and line 23
* fix Indicator LED sticking on RGB off toggle.
fixes issue: LED indicators stay on when toggling RGB off
* fixup readme to adhere to QMK standards and to also have more information
* use pragma once
* strip out the custom bootmagic lite routine as it is the same as QMK's default bootmagic lite routine. Also add the caps lock led indicator
* turn on bootmagic lite
* update default keymap
* Update keyboards/playkbtw/ca66/ca66.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* remove lines 4 thru 37 and add bootloader
* Add missing void parameter declarations to *_light functions
* Add doro67/multi:konstantin keymap
* Allow FNLK to be canceled with Esc
* Function layer → Fn layer in keymap comments
* Fix battery level code in adafruit_ble.cpp
The code in tsk_core/protocol/lufa/adafluit_ble.cpp that polls the
battery level for the Adafruit feather BLE controller reads the
regulated voltage, not the raw voltage coming from the battery. To do
that, the Adafruit Feather docs say you should read from pin A9:
https://learn.adafruit.com/adafruit-feather-32u4-basic-proto/power-management#measuring-battery-4-9.
(See also
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/pinouts#logic-pins-2-9.)
I'm not sure why, but analogRead(9); doesn't read the correct pin.
Checking all available analog pins experimentally, it turns out that
analogRead(7); returns the correct value. So the code above should read:
state.vbat = analogRead(7);
* Update tmk_core/protocol/lufa/adafruit_ble.cpp
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Remove old comment
* Fix linking error
* Remove `#ifdef` around `#include analog.h`.
* Really fix linking error
Add spacing to LAYOUT macros, add layout comments, improve consistency, fix ISO layout bug
* Remove placeholder comments in regular.h and rgb.h
* Change K## to k## in multi.h and regular.h
* Add alignment whitespace in Doro67 LAYOUT macros
* Update multi default keymaps and add layout comments
* Update rgb default keymap and add layout comments
* Add RESET to Fn layer in multi default keymaps
* Replace KC_GESC with KC_ESC in rgb default keymap for consistency with other Doro keymaps
* Update regular default keymap and add layout comments
* WIP
* Replace odd F1, F2 with proper split LShift/Backspace keys in default_multi
* Minor fixes and tweaks in multi default keymaps
* Fix Enter and NUHS positions in multi LAYOUT_iso
* Return true in process_record_user in rgb default keymap
* Update Enter position in multi info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update labels in multi info.json to match the default keymaps
* Enable Fn layer tap dances only if LAYER_FN is defined
* Update KBD6X keymap spacing to match LAYOUT spacing
* Add regular FNLK to userspace, update keymap comment labels
* Rename KC_BRK → BREAK, KC_SYSR → SYSRQ in userspace
* Change mousekey positions in KBD6X
* Disable Console in KBD6X to reduce firmware size
* Return false in process_record_* only when overriding existing keys
* Fix Caps light not working after LSFT_FN
* Refactor Fn/Caps light, fix sequencing issues
* Add Dip Switches as a core feature
* Add documentation for Dip Switch feature
* Update Preonic Rev3 to use new feature and remove custom matrix
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Remove custom matrix line completely
Rather than just disabling it
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* DIP changes
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Use better check for DIP Switch configuration
* Add to show features
* Add bitmask callback for dip switch
* Fix OLKB Boards dip switch config
* Update docs to include bitmask example
* Fix comments/documentation
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix issues with docs and use example from @tuzonghua
* Fix wording
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix example to use proper formatting
Bad, BAAAAAAD drashna!!!
* Handle dip switch initialization better
* Add `dfu-programmer` to `pacman -S` (#6618)
`dfu-programmer` now resides at `extra/dfu-programmer` and is no longer
in the AUR
* Add `--needed` option to `pacman -S` for efficiency
* Fix
* Update util/linux_install.sh
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
Specifically, the `util/travis_compiled_push.sh` runs a number of cleanup and deployment routines. This includes `dos2unix` that fixes the line endings for sanity's sake. However, it only runs on successful builds. That would be fine, except some builds WILL fail (community layouts, yay), which is a problem.
This should change the behavior to always run the post compile checks.
However, in the long run, we should break up this script into more parts.
* update codebase to four-space indent
* update codebase to use #pragma once
* refactor config.h
* change info.json to debug linting
* refactor readme
- file header
- update docs links
* minimize and lint rules.mk
* change features
- enable mousekeys and nkro
* use GPIO commands for Status LED
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* use IS_LED_ON macro
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* update compile/flash examples in readme
* :flash doesn't use QMK Toolbox
* added personal CTRL keymap
* added personal dz60rgb keymap
* enabled new rgb effect
* added space cadet shift
* media player track buttons now orange
* updated keymaps with rgb setting and visual HSV setting preview
* fixed source stuff?
* added support for underglow toggle (bugged to all hell)
* everything now behaves as expected when ti comes to RGB toggles, thank god
* removed ifdefs
* changed color of MAS_CRM
* uh, whitespace
* changed rgb positions and modifiers within RGB matrix thing for CTRL and DZ60RGB
* updated keymap to work kindof
* KEYMAP: changed list of rgb effects
* changed CTRL rgb defaults
* KEYMAP: new LED layout for ctrl
* fixed white LED position in indicator
* changed capslock tap timing
* Added new keymap - dz68rgb
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Apply suggestions from code review
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Fixed pin for RGB
* Added support for second revision of vitamins included
* Added rev2 config and switched to #pragma once
* Switch to quantum.h pincontrol
* Fixed left-half check
* Moved revision agnostic code to main header file
* Moved common build options to main makefile
* Referred to rev2 documentation
* JTAG is dissabled in keyboard.c now
* moved EEHANDS to rev1 config
* moved rev2 to use split_common
* Updated default keymaps
* Changed handedness ifdef to allow user-overrides
* Add some space saving defines
* Changed to more sane I2C clock
* Removed rev2 check in matrix.c as rev2 uses split_common
* Removed rev2 check in rev1 only code
* Update debounce constant name
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Switch KEYMAP macro to LAYOUT
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Switch kc_keymap macro to layout_kc
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Switch kc_keymap macro to layout_kc
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Add legacy layout macro alias
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/vitamins_included/rev2/config.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Split readme into revision specific versions
* Updated src to allow LTO
* Renamed readmes to lower-case
* Switched my keyboards to FEED VID
* Fixed markdown lint errors
* fixed readme links
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Maintain keymap backwards compatibility
Co-Authored-By: Joel Challis <git@zvecr.com>
* Switch Quefrency back to I2C (#6161 fixes the lag)
* Update Quefrency keymap
* Add reset and EEPROM reset keybindings so these tasks can be performed
separately, rather than relying on Bootmagic Lite, which performs both
tasks at the same time.
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Update KBD67 keymap
* Add reset and EEPROM reset keybindings so these tasks can be performed
separately, rather than relying on Bootmagic Lite, which performs both
tasks at the same time.
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Move Menu to a layer tap on the Fn key since that's a more natural
location.
* Update 60% Tsangan HHKB layout
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Update 60% ANSI split backspace/right-shift layout
* Add reset and EEPROM reset keybindings so these tasks can be performed
separately, rather than relying on Bootmagic Lite, which performs both
tasks at the same time.
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Update atreus to current code conventions - add multi revision instead of defines
* Remove config.h duplication from user keymaps
* Add breaking change log
* Add missing pragma once
* Branch point for 2019 Aug 30 Breaking Change
* LUFA USB descriptor cleanup (#4871)
* Fix indentation
* Fix braces
* Expand descriptor headers
* Align descriptor elements
* Nicer formatting
* Tidy up preprocessor statements
* Remove VERSION_BCD redefine - LUFA_VERSION_INTEGER is currently 0x170418
* Tidy up comments
* Tweak ordering of HID report elements (no functional changes)
* We don't need all of these newlines
* Move default USB_MAX_POWER_CONSUMPTION closer to where it makes sense
* Ask nicely
* Add some more comments
* Change indentation back to 4 spaces
* Add changelog entry
* Language Keymap extras backport from ZSA fork (#6198)
* Swedish extra keymap refactor
* Fix swedish $ sign definition (#81)
* Fix br abnt2 keymap compilation error
* Add PR changelog doc
* Update PR6198.md
* Enforce clang-format (#6293)
* Enforce clang-format on commit for core files
* forgot about tests
* Migrate ACTION_LAYER_MOMENTARYs to MO() (#5176)
* Migrate ACTION_LAYER_MOMENTARYs to MO()
* Add changelog entry
* Update docs/ChangeLog/20190830/PR5176.md
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Migrate ACTION_BACKLIGHT_* to BL_*
* Add changelog
* Update docs/ChangeLog/20190830/PR6299.md
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Fix indentation
* Fix braces
* Expand descriptor headers
* Align descriptor elements
* Nicer formatting
* Tidy up preprocessor statements
* Remove VERSION_BCD redefine - LUFA_VERSION_INTEGER is currently 0x170418
* Tidy up comments
* Tweak ordering of HID report elements (no functional changes)
* We don't need all of these newlines
* Move default USB_MAX_POWER_CONSUMPTION closer to where it makes sense
* Ask nicely
* Add some more comments
* Change indentation back to 4 spaces
* Add changelog entry
This will manually wipe the EEPROM. This is a hacky solution for when new ranges are added or moved around.
A better (more complicated) solution would be to zero out everything, not just known ranges. But for now, this is a hacky solution that will work.
* default keymap fix for questionmark
Added /? to the default position for a qwerty keyboard. Moved |\ to the left ctrl with the same behaviour as before.
* Small PR adjustments and Keypad optimization
* Update keymap.c
* Update keymap.c
* Add 2015 revision of pegasus hoof to QMK
* Add different version strings
* Fix ansi tkl layout
- temporary JIS mapping, I can't test this as I don't have the hardware
* Reverse engineer JIS layout macro for 2015 Pegasus Hoof
* Linting on 2013.h
* Add more resources to readme
* Update keyboards/bpiphany/pegasushoof/2013/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/bpiphany/pegasushoof/2015/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/bpiphany/pegasushoof/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/bpiphany/pegasushoof/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Try to use core debouncing code
* return changed
* Use helpers
* initial commit
* Add the correct pins and ordering
* create an appropriate keymap macro for the board
* add an appropriate LAYOUT macro
* add a keymap that fits the LAYOUT layout macro
* add QMK Configurator support
* add missing pin D7 and LAYOUT_all
* fix my mistake when I added an extra key to the electrical matrix instead of the physical one
* add qmk configurator support for LAYOUT_all
* Update keyboards/eve/meteor/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/eve/meteor/rules.mk
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* use the default names so BMC still works
* remove mcu rules as per resolution of 6253
* added combos
* minor adjustments, added combos
* Add second encoder, add modifiers to encoders
Added a skeleton for the possibily having a second encoder.
Added 9 modifiers for the first rotary encoder:
- None
General navigation. Page up/down
- SHIFT
Fast navigation. Home/end
- CTRL
Vertical navigation. Up/down
- CTRL+SHIFT
Horizontal navigation. Left/right
- ALT
Audio volume control.
- GUI
Browser navigation(windows). Forward/backward
- ALT+SHIFT
Form navigation. Tab up/down
- ALT+CTRL
Media control. (Play|pause)/mute
- HYPER
Media navigation. Next/prev track
Key codes are stored in `uint16_t encoder_actions[2][9]`
* Add second encoder, add modifiers to encoders
Added a skeleton for the possibily having a second encoder.
Added 9 modifiers for the first rotary encoder:
- None
General navigation. Page up/down
- SHIFT
Fast navigation. Home/end
- CTRL
Vertical navigation. Up/down
- CTRL+SHIFT
Horizontal navigation. Left/right
- ALT
Audio volume control.
- GUI
Browser navigation(windows). Forward/backward
- ALT+SHIFT
Form navigation. Tab up/down
- ALT+CTRL
Media control. (Play|pause)/mute
- HYPER
Media navigation. Next/prev track
Key codes are stored in `uint16_t encoder_actions[2][9]`
* Clean up; added combos
Combos:
- CV: Copy
- XC: Cut
- ZV: Paste
- QP: KC_SLEEP
* Fix LEADER_DICTIONARY to be more useful
* Add documentation
* Minor fixes
* Raise TAPPING_TERM
* testing
* Rearrange modifiers
* Fix kc being stored in uint8 instead of uint16
* Update documentation
* Clean up
* Remove excess comments
* Put encoder_actions in progmem
* Add Zadig 101 to docs
* Add USBasp bootloader name
* Add links to the page
* Note the usual VIDs and PIDs for the bootloaders
* Add "List All Devices" note, just in case
* Talk about keyboard-specific bootloader procedures
* Send users to the new page in "Unknown Device for DFU Bootloader" section
* Halfkay bootloaders are also an exception here
* Update how_keyboards_work.md
bridged the gap between scancodes and keycodes, the doc didn't make the distinction and was ambiguous.
* Update docs/how_keyboards_work.md
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update docs/how_keyboards_work.md
fix typo
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update Layer functions to use layer_state_t in ZSA Boards
* Update Music Mask for ZSA boards
Fixes an issue with the board getting stuck on Adjust layer when activating music mode
* Add Support for SMART LED Toggle to Planck EZ
* Add support for SMART LED toggle in Ergodox EZ
* Ifdef swiss cheeze for Oryx Configurator
* Documentation and updates
* Add Oryx Keymap
* Add option to configure the layers for the Layer Indicator
* Update keymap with better examples
* Make sure eeprom is initialized before reading from it
* Force flush of LED matrix when suspending board
This fixes an issue where the LEDs don't fully clear sometimes when the host system goes to sleep
* Enable RGB Sleeping by default
* Add clarification about planck ez led layer config
* A little easier to read the definition of the GPIO control macro for AVR.
No change in build result.
* Changed to not use GNU statement expression extension.
No change in build result.
* Modified split_common/serial.c to use qmk_firmware standard GPIO control macro.
No change in build result.
* fix PE6 -> E6
* remove some space
* add some comment to config_common.h
* Changed split_common/serial.c to use a newer version of qmk_firmware standard GPIO control macro.
* Additional changes for Layer State typedef compatibility
* Replace biton32 with get_highest_layer in docs
* Change additional layer structure code
* Fix uGFX reference issue
* Remove dynamic_keymap check
* Where did all these extra spaces come from
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Add MAGIC_SWAP_CONTROL_LGUI and MAGIC_UNSWAP_CONTROL_LGUI keycodes
Key codes to swap and unswap the control and windows/cmd keys
* Fix issues with pull request #6110
Renamed swap/unswap lctl and lgui key codes, added key codes to swap/unswap rctl and rgui, and moved new bool inside keycode_config.h struct to the end
* Move new keycodes to the end of the enum (#6110)
* add cases for swapped control and OS keys to mod_config (#6110)
* Add new keycodes to feature_bootmagic.md (#6110)
* Add R+L swap codes to keep in parity with AG_* codes
* Extend Magic range check to include new magic codes
* Update audio docs
* Combine 2 byte ranges into 1 word for EECONFG
Fix names for Keymap config EEPROM
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Optimize RGB Matrix rendering for Ergodox EZ
* Optimize RGB Matrix rendering for Planck EZ
* Update keyboards/planck/ez/config.h
Co-Authored-By: Joel Challis <git@zvecr.com>
* Remove superfluous JTAG disable code
* 32A has differently named register
* Accidentally some operators
* 32A also has different JTAG pins
* Wrap disable_jtag() in an ifndef
* Document this new define
* Rename the define, it conflicts with a LUFA thing
Also, move the ifndef wrapping to the call in keyboard_setup()
* removed some debug prints
* removed unnecessary files, tweaked some things
* rotary encoder button now connected into column 0, row 3
* tweaked keymap and moved encoder control into keymap
* tweaks
* added test keymap
* updated some things to make it easier to work with QMK configurator
* updates after merging latest master in
* fixed a few things
* removed test keymap and all related #ifdefs
* changed some dumbpad default keys, added KC_LOCK
* added image to readme
* added link to PCB github repo
* moved lock key to the rotary encoder pushbutton
* making suggested changes from @fauxpark in https://github.com/qmk/qmk_firmware/pull/6452
* adding bootmagic lite since i'm lazy and haven't soldered on the reset button...
* renamed to
* using 7 underscores for KC_TRNS
* adding my layout (default is for wife)
* updated my own layout, tweaked default keymap to use cleaner switch for encoder control
* removed commented out import from imchipwood keymap, removed unnecessary comment from default layout
* added LED layer control
* flash the layer indicator LEDs at startup
* change layer_state_set_user to layer_state_set_kb
Co-Authored-By: Joel Challis <git@zvecr.com>
* in layer_state_set_kb, return layer_state_set_user
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* remove include of upper level config.h, add pragma once
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* changing default keymap slightly, added config.h for default layout
* change _delay_ms to wait_ms
* replaced locking numlock with numlock
* Update keyboards/dumbpad/dumbpad.c
change `keyboard_pre_init_user` to `keyboard_pre_init_kb`
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/dumbpad/dumbpad.c
adding `keyboard_pre_init_user()` to `keyboard_pre_init_kb()`
Co-Authored-By: Joel Challis <git@zvecr.com>
* fixed some comments about the layer key (MO to TT) and the SUB layer rotary encoder control
* Move default keymap's rules to keyboard level
* Concatenate the two sets of rules
This sets CONSOLE_ENABLE to no, which was being set at the keymap level.
* Wrap the USB Device Description in quotes
Some preventative maintenance. The firmware for the_ruler can't be compiled without this change if `CONSOLE_ENABLE = yes` because this string has a comma, which gets picked up as two arguments by the Command code, instead of one as it should be.
* Linting
- remove firmware size impacts
- remove trailing white space
- visual alignment of rules
* Use QMK's pre-loaded default rules for atmega32u4
* Update readme
- markdown formatting
- update Hardware Availability link (Maple Computing's site has disappeared)
- update Docs links
* Update header files to use #pragma once
* Add universal flash command
* Add bootloader info to I:C boards
* Add support for ATSAM
* Add messages for flash target
* Message cleanup
* Add USB ASP Flashing target
* Make usbasp target more universal
* Add phoney target for usbasp
* Clarify error message when bootloader isn't matched
* Fix Clueboard hotswap gen1 not compiling when LED Matrix is disabled
* Move keymap.json to default keymap folder
* Revert "Move keymap.json to default keymap folder"
This reverts commit 7f28df909d7e4dcc79ab0ff44fe264656b5dfa18.
* Add an alternative method for keyboard discovery to speed up build
* Chain MAKEFLAGS for docker_build.sh
* Slight improvement to number of items sent to sort
* Remove debug line
* Fix line escape
* Added Bulbizarre keymap for the XD75
* Fixed no newline at the end of file
* Update keyboards/xd75/keymaps/bulbizarre/readme.md
Co-Authored-By: MechMerlin <30334081+mechmerlin@users.noreply.github.com>
* Update led status check
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove unnecessary define
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* remove led layer code
* enable PWM on STM32F303
* Unusable PWM code
* Updated PWM Stuff?
* PWM Semi-working
* Both LEDs working at the same time
* Update names
* Add led level functions
* Add LED levels and persistent settings
* Revert change due to issues with timing related code
* Review feedback and minor cleanup
* add Userspace and keymaps
* Adding keymaps for zeal60 and iris
* Created my own tap dance that toggles RGB Mode based on whether I toggled caps lock or not
* parent 578ed42a7f8f986147cad040d50d4ae1d24a32e2
author Seth Barberee <seth.barberee@gmail.com> 1565065903 -0500
committer Seth Barberee <seth.barberee@gmail.com> 1565065903 -0500
move to userspace
add zeal60
* update based on review
* move userspace to github name
* Add some defaults for ATmega32A to mcu_selection.mk
* Remove boilerplate from templates
* Relax INTERRUPT_CONTROL_ENDPOINT and PROGRAM_CMD
* Apply suggestions from code review
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Extend allowed range of tappable keycodes to include modifiers
* Get rid of the magic numbers altogether
* Remove some more magic numbers
* Extract LM() functionality from ACT_LAYER_TAP
* Use ACTION() macro everywhere
* Improve backlight PWM pin support
* I accidentally an equals sign
* Another typo
* Order by pin number
* Throw an error if backlight pin is C4 or C5 on 16/32U4
* Use else for clarity
* Minor alignment adjustments
* Add Kudox Keyboard profile.
* Modified info.json and image link on readme.
* Remove unnecessary codes.
* Set BootLoader caterina.
* Remove duplicated settings on rules.mk.
* Clean up config.h.
* Modified include header path.
* Modified info.json to adjust 4th row keys y position.
* Separate default keymap and my keymap.
* Modified RGB_LED_* settings on kudox/rev1/config.h.
* Add configurations for Kudox Game Keyboard rev1.
* Modified Kudox Game Keyboard readme and keymap.
* Remove unnecessary codes.
* Set BootLoader caterina.
* Remove wrong settings on rules.mk.
* Clean up config.h.
* Modified MATRIX_ROWS on kudox_game/rev1/config.h.
* Modified RGB_LED_NUM on kudox_game/rev1/config.h.
* new keymap for projectkb alice
* update documentation for resetting PCB
* actually need a grave key more than a tilde
* move DFU_ARGS to top level
* cleanup unused keycodes and others
* align with typical ergo layouts. move enter and keep function layer reachable
* Delete null key
`__` key in keymap.c doesn't actually exist on the physical hardware.
Removed key from keymap.c and removed its argument from the layout macro.
* Delete unused keycode aliases
* Replace layer index definitions with an enum
* Replace redundant numpad keycodes with native aliases
* Use native layer change keycodes instead of aliases
* Visually align the keycodes
It makes the keymap pretty.
* Correct Configurator layout data
* Clean up header files
- convert to pragma once include guard
- remove redundant definitions
- remove commented code blocks
* Delete LAYOUT_kc macro
Was copied from ergotravel; not valid for this keyboard.
* Consolidate rev1 rules.mk settings to keyboard level
Previous codebase enabled Backlight at keyboard level then disabled it at revision level.
* Delete unused rules
* Consolidate config.h settings from keymap level to keyboard level
* Modernize keyboard's config.h file
Aligns the keyboard-level config.h file more closely with the current QMK template for AVR keyboards.
* Added nearly perfect config for AMJ66, only missing top right key.
* Correct the layout macro
* Add layout mock-up to amj66.h
* Update and comment out the backlight definitions in config.h
The backlight pin was found to be D4, but there appears to be a bug in QMK that affects this keyboard.
Commenting out for now.
* Try to make a sensible default keymap
* Add testing keymap for FSund
Include the keymap that was being used for testing.
Don't forget to refactor this later into an actually useful keymap.
* Suggestions by fauxpark
- uncomment the backlight configuration
- fix the default keymap
- remove commented MCU rule
- specify the bootloader
- make mental note to not try to write code at 3:30 in the morning
* Add LAYOUT_66_ansi and LAYOUT_66_iso macros
- include QMK Configurator data
- enable Community Layout support
* Add comments about layout variants to amj66.h
* Add #define BACKLIGHT_ON_STATE 1
Partial fix for backlight breathing.
- Requires #5983 to fix fully (confirmed by FSund and fauxpark)
Co-Authored-By: fauxpark <fauxpark@gmail.com>
Co-Authored-By: Filip Sund <filip.sund@gmail.com>
* DEBOUNCING_DELAY -> DEBOUNCE
* Move AMJ66 files into new AMJKeyboard directory
* Correct Manufacturer in USB Device Descriptor
* Remove comment regarding source fork
* Correct the readme
* Update default keymap to match the details given in its readme
* White-space edit fsund_test keymap
Makes its formatting more consistent with other 66% keymaps. No logic changes.
* Linting info.json
Debug-style linting (one key object per line) and minor edits to key labels.
* Remove fsund_test keymap
* Add FSund as a maintainer in info.json
* removed some debug prints
* removed unnecessary files, tweaked some things
* rotary encoder button now connected into column 0, row 3
* tweaked keymap and moved encoder control into keymap
* tweaks
* added test keymap
* updated some things to make it easier to work with QMK configurator
* updates after merging latest master in
* fixed a few things
* removed test keymap and all related #ifdefs
* changed some dumbpad default keys, added KC_LOCK
* added image to readme
* added link to PCB github repo
* moved lock key to the rotary encoder pushbutton
* making suggested changes from @fauxpark in https://github.com/qmk/qmk_firmware/pull/6452
* adding bootmagic lite since i'm lazy and haven't soldered on the reset button...
* renamed to
* using 7 underscores for KC_TRNS
Currently OLED Dirver only supports LF (\n) character in a string to clear out the rest of the current line and advance to the next line for writing. This PR adds support for CR (\r) character as well to advance to the next line, however not clear out the rest of the current line. This is extremely useful when you want to display a multi-line logo using a single array without wiping out exiting lines and flagging the OLED as dirty unnecessarily.
* personal keymap for the planck with sounds
* need that minus and underscore where I can see them
* remove unused block
* some, shall we call them, minor changes?
* I don't think this is required anymore
* initial commit TGR Jane
* lighting support
* use the default keymap lifted from community layouts for LAYOUT_tkl_ansi
* add information regarding reset key, hardware supported, and hardware availability
* document that it supports v1.1 as well thanks to nickheller's confirmation
* update some verbage in the readme
* add QMK Configurator support
* establish switch matrix for three main layouts
* add community layout support
* readme fixes
* Update keyboards/tgr/jane/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/tgr/jane/rules.mk
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/tgr/jane/config.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update MODERN_DOLCH_RED color
* Remove unused RAL_LAL tap dance
* Disable Space Cadet on all boards
* Rework SEND_STRING_CLEAN into CLEAN_MODS, fix DST_P_R/DST_N_A
* Disable unnecessary underglow animations
* Rearrange feature flags in rules.mk files
* Change custom colors from structs to defines
* Add some explicit initializers
* Add MODERN_DOLCH_CYAN color
* Add IS_LAYER_ON_STATE()/IS_LAYER_OFF_STATE() macros
* Add led_set_keymap() template function
* Change underglow color based on Caps/Fn state
* Preserve val when changing underglow colors
* Only trigger Fn light for Fn layer
* Refactor fn_light() and caps_light() slightly
* Add comments to fn_light() and caps_light()
* Xulkal changes
Refactor rgb & encoder menu
Hadron Keymap
Refactor oled menu
* Fixing horizontal OLED data display
* Reverting changes to take to separate prs
* Add Sections and MO(layer)/TG(layer) Example
Major changes:
1. Added sub-section headings to the portion before the examples.
2. Added a new Example 6, that allows MO(layer) and TG(layer) functionality to be embedded within tap dance functions.
Minor Changes:
1. Edited some text to better fit with new sub-headings.
* Update feature_tap_dance.md
* Update feature_tap_dance.md
* basic layout v1.0
* changed KC_TRNS to _______
* most symbols are on double tap, except quote, that was cancer
* better formatting and set toggle for game layer
* added colors to layers to make knowing your current layer easy
* have an empty macro working
* enabled unicode
* moved stuff to my folder and removed edits from communal files
* cleanup
* removed the game layer. Never used it
* made changes requested by drashna and vomindoraan
* got rid of some unnecessary code
* got very basic unicode on mac working
* added ctrl_esc
* more changes as requested by noroadsleft
* more leader additions, removed macros because leader stuff replaces that functionality
* removed an old macro I forgot to remove earlier
* final deletion at noroadsleft request
* changed a line to explicitly specify a purple color.
* Fix my Tap Dance issues after I broke them
* Cleanup and organization of userspace documentation
As well as some additional cleanup of functions due to review of documentation.
* Enable Tapdance on Glow and remove more animations
* Revert to Eager PR debouncing
* Add better check for startup animation
* Move where RGB Matrix defines are listed
* Limit RGB Matrix max val
* Update keyboard for Iris Rev 3 conflicts
* Enable encoder support on planck ez
* Remove is_master check from corne\'s OLED code
* Overhaul OLED screens for my Corne
* One last removal
* Show RGB valu On both sides
* Updates for OLED display info
* Fix compile issues for rgb config
* Disabled Space Cadet for all drashna keymaps
* Fix OLED Screen configs
* Minor OLED Tweaks
* Revert some Iris changes
* Fix song include
* Handle MAKE macro for the Corne boards better
* Add super hacky-hack for eeconfig initialization
* Add audio support for Fractal since Elite Cs support it
* Add defines for keycode steps
* Add White layout
* Update Corne RGB info
* Add fun effects to layer indication for RGB Matrix enabled boards
* Use proper define for product name detection
* Update formatting
* Use custom timeout mechanism for OLED timeout
* Fix up OLED screen HSV code for new HSV structure
* Better handle turning off RGB Matrix when sleeping
* Disable MultiSplash Animation
* Change Iris back to using serial
* Why was RGB disabled?!?!?!
* Limit val in rgb_matrix_layer_helper function
* Remove EECONFIG setting for RGB matrix
* Basic Rev 2 implementation
* Updated LED defines and added Extra encoder support
* Fixed rgb pin assignment
* Physically accurate LED positions
* Single Color Band scrolling left to right effects
* Spirals, Pinwheels, and Documentation....Oh My!
* Spiral effect band thickness adjustments
* Fixing animation spin directions
* Full hand LED positions
* Basic Rev 2 implementation
Updated LED defines and added Extra encoder support
Fixed rgb pin assignment
Physically accurate LED positions
Full hand LED positions
Moving rev2 folder
* RGB Center Point LED position update
* Fixing led config commas
* Fixing led config commas
* fix enter key
* fix enter
* Small changes to default
* update default
* typo fix
* update default
* Fixing defines & led config, turned full hand & extra encoders into rules.mk feature
* Refactored rules.mk to have a post_rules.mk
* Forgot to offset the matrix to led map due to the edge led additions
* Updated LED flags and fixed my keymap
* Update keymap.c
include speed controls for RGB
* Fixing more rules.mk and adding keymap like encoders functionality
* Sol Rev 2 Implementation
* Minor fixes
* Keymap fixes
* Fix Colemak, add lock keys
* fix default keymap to not have Q in the 1 position.
* add tsangan hhkb layout
* add a tsangan default keymap
* clean up the default keymap
* add qmk configurator support for new layout
* [Layout] KBP V60 Type R ISO default
* Remove ifdef
* Apply suggestions from code review
@noroadsleft I've accepted your suggestions. Tried locally any everything works as expected.
Thanks again - this if my first keyboard and first time looking at/ using/ contributing to qmk so I appreciate the feedback 👍
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
info.json file had the wrong name for the JSON key; the macro that is normally named LAYOUT_all by convention is named LAYOUT_60_all on the Zeal60.
Bug flagged by drashna for flight505 on QMK Discord.
* Update snagpad.h
White-space changes only. Making this file easier to read.
* Update info.json
Refactor:
- add labels
- debug linting (one key object per line)
- reorder keys for LAYOUT_numpad_5x4 (fixes QMK Configurator assigning keys to incorrect positions)
* Update readme.md
Refactor to conform to QMK template.
Updated link to The Board Podcast (old link was Error 404).
* Refactor splittest to support multiple dev boards
* Refactor splittest to support multiple dev boards - revert change to number of RGB led
* Refactor splittest to support multiple dev boards - update docs
* Refactor splittest to support multiple dev boards - correct docs
* Refactor splittest to support multiple dev boards - update teensy master logic
* Update IS_COMMAND definition in templates to use MOD_MASK_SHIFT
* Update IS_COMMAND in docs
* Update IS_COMMAND default definition in tmk_core
* Update table in Command docs based on suggestion
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Add Configurator layout data for LAYOUT_hotswap
* Add LAYOUT_std60_split_num0
Requested by 李小安#9728 on QMK Discord.
Standard 60% ANSI layout for the alphanumeric region, with a split-0 Numpad.
Includes a sample keymap.
* Update Docs links on readme
* Change melody96.h to use #pragma once include guard
* Change config.h to use #pragma once include guard
* Add readme for default_std60_split_num0 keymap
* Update x11.h
The original json file that was given by the designer was incorrect. The Print Screen and Pause button is swapped.
* Update space65.c
Fixing the Caps Lock LED.
* Revert "Update space65.c"
This reverts commit 1f5de1abaefadd2e54259999a29bab501da5f67a.
* Remove the need to set NUM_OF_ENCODERS
Instead, calculate the size of the array, and use that instead
* Add hack for split common support
* Remove NUM_OF_ENCODERS from keyboard config
Can be reverted, if needed
* Update the :bootloader target to pass along correct hardware info
* Update make scripts to properly grab the settings (a big thanks to @yanfali)
* Remove LUFA debug warnings
* Initial conversion of vagrant to use qmkfm/base_container
* Fix vagrant when using docker provider
* Workaround for VirtualBox VM restarts
* Generalise Vagrant docs slightly and add FAQ
* Store backlight breathing state in EEPROM
* Reduce backlight_config.level from 6 bits to 4 (max 15 "on" levels)
* Error out if BACKLIGHT_LEVELS is > 15
* Remove mention of default backlight pin in rules.mk template
* Remove pointless comment
Zeroing out spd in eeconfig_init_quantum
Switched to block read & update
Update tmk_core/common/eeconfig.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Fixing init compile error
Update eeconfig.c
Dead / Missing API cleanup
alignment
* Enable Mousekeys on Corne Keyboard by default
For Tessachka and Configurator support
* ENable for default image too
* Remove most of rules.mk for default keymap
* make sure rgblight is enabled by default
from default keymap
* Add out of bound check for Leader Key sequence array
* A shot at advanced C stuff for Leader Key optimization
* Revert most changes
* Change default back
* Include string.h if compiling for ARM
* Use sizeof instead of a number
* Align sendstring LUTs to 9 characters wide
* Replace 0 with XXXXXXX
* Use decimal 128 for LUT size
* Align heading comments
* Add ASCII table comments
* Add missing AltGr LUTs and adjust keycode LUTs accordingly
* Use pragma once
* Correct a couple more keycodes
* Capitalise "BÉPO"
* Also clean up the default tables
* Tidy up Belgian and Norman LUTs
* Add user-overridable callback for cancelling UCIS input
To clean up things from qk_ucis_start_user() for instance.
* restore lost newline to quantum/process_keycode/process_ucis.c
Co-Authored-By: shinmai <aapo.saaristo@gmail.com>
* Script to generate keymap.c from JSON file.
* Support for keymap.json
* Add a warning about the keymap.c getting overwritten.
* Fix keymap generating
* Install the python deps
* Flesh out more of the python environment
* Remove defunct json2keymap
* Style everything with yapf
* Polish up python support
* Hide json keymap.c into the .build dir
* Polish up qmk-compile-json
* Make milc work with positional arguments
* Fix a couple small things
* Fix some errors and make the CLI more understandable
* Make the qmk wrapper more robust
* Add basic QMK Doctor
* Clean up docstrings and flesh them out as needed
* remove unused compile_firmware() function
* Add support for XD004
Also applying the following suggested edits:
Add hardware availability link in readme
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Enable lite bootmagic
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Remove commented out MCU
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Add more ellaborate keymap
Correcting usage of tap_code_16 for modified key, thanks to @drashna
* Add information about bootloader type
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* add keyboard new macro pad "Kuro"
* change main readme.md
* remove not used code from default/keymap.c
* Remove unnecessary code
* Supports info.json
* removed back slash and not used functions.
* update at product link. add japanese messages.
* Added initial files for the Adron 3-key macro pad
* Refactor of "adron_pad" to "ivy", cleaned up the readme and removed un-needed keymap as well.
* Made suggested changes to commit for PR
* Removed unneeded define block from SUBPROJECT_rev1 as it is redundant (Thanks drashna ;) )
* Add missing TD_RSF_RCT tap dance
* Use standard QMK HSV and RGB structs, fix Godspeed colors
* Move PROGMEM after the type in RGB intervals
* Add MODERN_DOLCH_RED color, use it on KBD6X
* Use 255 instead of RGBLIGHT_LIMIT_VAL in color definitions
* Remove IS_COMMAND override on Whitefox
* Hightlight that sudo may be needed
Also added "dfu-programmer: no device present" in so that anyone searching for that particular error can hopefully find the page.
* Use new style of indicating a warning
* Indicate that the FAQ should be read instead of blindly using sudo
* Switch version incrementing to the command put together by @noroadsleft.
* Update util/travis_compiled_push.sh
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* added files for KeyHive Maypad
* updated maypad files and moved honeycomb inside keyhive dir
* fixed file paths, incorporated changes with fauxpark's suggestions, undid honeycomb move
* updated with fixes from PR
* added new lines to end of honeycomb files to fix compiling
* Updated info.json to match the macro name from maypad.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* reordered layout in info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* removed KEYMAP from maypad.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* removed extraneous keymap files
* pulled qmk/master for honeycomb
* added ortho_5x4 and keymap cleanup
* matched identities in maypad.h
* added bootmagic functionality to maypad
* changed bootmagic to lite
* Clarify the rules.mk setup for Unicode
* code point
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Remove "your"
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Undo a line change
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* dot the comma
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Update docs/feature_unicode.md
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* added handwired keyboard wulkan
* added info.json for qmk configurator
* fixed spelling
* enum dont need to be assigned to zero
* removed cflag from readme
* updated rules.mk
* removed unneeded rows from config
* moved unicode to keymap conf
* fix adjust layer and comments for keymap
* Fix up GPIO macros
* Fix up send string macros
`string` arguments must not be parenthesized
* Fix up miscellaneous macros
* Make indentation uniform (4 spaces)
* Make #ifdef vs #if defined usage consistent
* Reorder standard includes
* Revert indentation changes as per review comments
* Revert #if defined(__AVR__) → #ifdef __AVR__ change
* Change 2 space indent to 4 spaces on a couple of lines
* Replace include guard with #pragma once
Using QUANTUM_LIB_SRC prevents the warning when multiple sources add the i2c_master.c file. Boards such as the Ergodox EZ Glow see this warning every time they compile because the board uses the file in general, and because the RGB LED Matrix requires it, as well.
* Add wasdat:konstantin keymap
TODO: Move it to layouts/
* Use HHKB arrow arrangement for mouse keys on KBD6X
* Move KC_APP from Ctrl to M on all boards
* Use RCT_RSF on Melody96
* Set TAP_HOLD_CAPS_DELAY to 50 in userspace
* Use RSF_RCT instead of RCT_RSF
* added iris rev 3 keymap
* stuff
* Update config.h
* Removed personal mapping folder so that I can branch it
* Added personal Iris keymap folder
* added enums, removed break after return, and removed line 3 of keymap.c
* removed process record function
* greenshadowmaker keymap for idobo xd75 massdrop
* remove uneeded config.h
* corrected format to match convention instead of xd75 where I accidentally started from
* fixed errors and added arrows bottom right to match my other layouts
* updated readme
* right arrow fix
* Update keyboards/idobo/keymaps/greenshadowmaker/keymap.c
removing unnecessary part, copied from different keymap
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* added suggested changes
* removed unneded elements
* updates to my iris keymap
* some rational updates to the keymap - let's see how this works
* updates to my iris keymap
* some rational updates to the keymap - let's see how this works
* add mouse keys and remove unused keys and some cleanup
* a little bit more cleanup
* actually enable mousekeys
* fix markdown lint complaints
* fix capitalization
* changes made per suggestions
* initial commit, copied from singa
* default 60_ansi LAYOUT implemented and tested workin
* add rgb underglow support bounded by ifdefs
* edit readme to provide information on reset procedure and on rgb underglow support
* improve the default keymap to have a second layer with function keys and even a RESET
* Add LAYOUT_all macro and discovered that split backspace uses an additional pin on the microcontroller
* fix up last line in readme
* Add QMK Configurator support
* Convert gh60.h to #pragma once include guard
* Lint gh60.h
This commit only changes white space.
* Convert info.json to debug linting
Making this file easier to read.
* Put the label keys first for LAYOUT_60_ansi
* Complete and correct key labels in info.json
* Duplicate LAYOUT as LAYOUT_all
Doing this for backwards compatibility. Has implications for user keymaps.
* Update LAYOUT_all to make sense
The original macro LAYOUT submitted for the GH60 gets a couple of things wrong:
- K49 is placed between Space and Right Alt, when it's actually the right half of a split Backspace
- K3C is assigned before K3D, when K3C is the 1u portion of a 1.75u/1u split Right Shift, and therefore K3D is actually to the left of K3C
The LAYOUT_all macro corrects these issues, but the LAYOUT macro is unchanged, so as to not break user keymaps that depend on it.
This commit also updates the default keymap to use the LAYOUT_all macro, and makes a minor change to the base layer to be more as a user would expect for the corresponding physical layout.
* Correct the layout data for the LAYOUT macro in info.json
Gives proper Configurator rendering.
* Modernize default keymap
Update the default keymap to use more modern QMK conventions.
* Modernize the LED management code
Update the LED management functions to use the GPIO functions, and clean up the led_set_kb() function.
* Update key labels in info.json for LAYOUT_60_ansi_split_rshift
Makes them consistent with the the rest of the file.
* Update Docs links in readme file
* Snowkuma's planck layout.
Heavily influenced by both Planck and SDOTHUMs layouts. I have tried to
implement a comfortable layout with a wide stagger and a minimal set of
key usage.
Still a work in progress, hope it is useful to others.
* Adds simple readme file and images of layout
* Removes unused experimental definitions
* Update readme.md
Adds images of layout to readme.
* Removes accidentally added test keymap .swn .swo .swp files
* Updates config.h replaces include guard
As suggested by @noroadsleft replaces the include guard (ifndef, define
and endif) with just `#pragma once`.
* Replaces two extra KC with inbuilt QMK equivalents
custom_keycodes.h
Replaces `___f___` with the equivalent QMK alias `_______` KC_TRNS
`___x___` with the equivalent QMK alias `XXXXXXX` KC_NO
Updates keymap.c to reflect the changes made.
* Changes keymap.c to include QMK_KEYBOARD_H
Replaces planck.h and action_layer.h includes with the single inclusion
of QMK_KEYBOARD_H which includes action_layer.h automatically.
* Update keyboards/planck/keymaps/snowkuma/keymap.c
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keymap.c
removes unused Coleman key code from enum planck_keycodes
* Update keymap.c removes COLEMAK key code logic
* Initial keymapping
* Removed unneccessary config files
* Update readme.md
* Updated symbol locations, tap dance on parentheses for brackets.
* Update readme.md
* Fixed layout image inconsistencies
* More quality shift key layer control, swapped enter + shift enter
* Keyap tweaks and config cleanup
* Almost compiling, still has layout reference issues.
* Finally compiling. 2x2u layout (default, not mine) had nonexistent keys on it
* Super minor changes
* Ctrl+Bksp after first tap
* Changed bind so un/lock is explicit to work with remote un/locking
* Added keyboard passwords please don't hate me
* Changed backspace functionality and added em dash
* Changed to send_string because it's preferred for macros
* Minor fixes
* Removed global redefinition and fixed possible issue between 6KRO and NKRO
* Cleanup
* Layer names, password layer is OSL over toggle
* Hopefully now in QMK preferred format.
* Blank passwords.c
I realized with me excluding this it wouldn't compile - so adding a blank one.
* Fixed OSLs not cancelling after tapping term
* Matrix change.
KC_NO instead of repeating.
* Unneeded line.
Co-Authored-By: IsaacElenbaas <34344969+IsaacElenbaas@users.noreply.github.com>
* Fixed return statements to work with after-press functions
* External image host
* Removed image from github
* Removed unneccessary rules.mk lines and fixed tabbing
* Typos
* Fixes upon part arrival.
* Final changes and bug fixes
* Preventing KC_NO from waking monitors.
* Fix to rest of matrices
In response to https://github.com/evillemez/qmk_firmware/issues/1—the rest have the same problem.
The switch of k37 for k36 is just for consistency between that and the 2x2u.
* Workaround for #6214, minor changes, CRLF change in passwords because it won't leave my modified no matter what I do.
* Add Pulse 4k, a macropad by Maxr1998
* Some config tweaks
* Remove image note
* Add license headers
* Fix media keys
* Remove Play/pause again as it doesn't work on Linux
* Initial refactor of onekey to support multiple development boards
* Fixes to get teensy lc && 3.2 working
* Add pin tables
* Add caveats to Teensy boards
* Correct bootloader for Elite-C
* [Keyboard] Modernize the KMAC implementation
This brings the matrix implementation more in line with the current
default matrix code.
It also simplifies the implementation quite a bit.
* [Keyboard] Add layout support to KMAC
* Rename layout macros
The Instant60's info.json was updated in #6157. The intention seems to have been supporting Community Layouts, but that feature was not implemented. After checking that the layouts conform, rename the appropriate layout macros.
- rename LAYOUT_ansi as LAYOUT_60_ansi
- rename LAYOUT_tsangan as LAYOUT_60_tsangan_hhkb
- update `default` and `tsangan` keymaps
* Enable Community Layout support
Supported Community Layouts:
- 60_ansi (Instant60 ANSI version)
- 60_tsangan_hhkb (Instant60 Tsangan version)
* keymap simplification and fancy alt tab behaviour
* move symbols around and try ergo numbers
* mess with symbol positions
* f11 and f12 for volume control (for ease of remapping)
* slack unread navigation
* experiment with mods on home row
* mods on symbol layer
* dedicated tab left and tab right keys
* swap next and prev
* remove hold to shift on a and o
* revert to simpler keymap
* restore readme
* point to keymap image
* cmd + cmd -> cmd + ctrl
* expand readme
* slack unread channel navigation
* Update keyboards/planck/keymaps/callum/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* return true from cmd handling block
* [keyboard] TA-65 by maartenwut
Add ta65 to QMK with 4 layouts
* Simplify config.h
* Simplify keymap
* Update bootloader
- confirmed to be qmk-dfu by maartenwut
* Update keyboards/ta65/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Review feedback
- fauxpark recommendations
- noroadsleft recommendations
* Repair info.json structure
JSON objects were not properly nested according to the QMK specification.
* Switch info.json to "debug linting"
So I can read the file more easily.
* Remove k2c and k31 from LAYOUT_tsangan
k2c was the Non-US Hash position, and k31 was the Non-US Backslash position, but this layout is intended for ANSI.
* Correct LAYOUT_tsangan data in info.json
* Update tsangan keymap to use updated LAYOUT_tsangan macro correctly
* Rename LAYOUT_tsangan to LAYOUT_ansi_tsangan
Increased clarity.
* Rename tsangan keymap as default_ansi_tsangan
Per QMK Keyboard Guidelines.
* Fix object ordering for ISO layouts in info.json
ISO Enter's object was out of sequence in both layouts.
* Rename ISO keymaps per QMK Keyboard Guidelines
- rename iso keymap as default_iso
- rename iso_tsangan keymap as default_iso_tsangan
* Add default_ansi keymap
For user reference.
* Enable Community Layout support
LAYOUT_ansi and LAYOUT_iso conform to the 65_ansi and 65_iso Community Layouts, respectively.
- rename LAYOUT_ansi to LAYOUT_65_ansi
- rename LAYOUT_iso to LAYOUT_65_iso
- update keymaps as appropriate
- add LAYOUTS rule to rules.mk
* Disambiguate key labels in info.json
* Remove trailing white space from info.json
* Update keyboards/ta65/keymaps/maartenwut/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Add omnikeyish keyboard support.
* remove out of date comment
* PCB Rev 1.1 moved Row5's pin to E6, because the teensy++ hangs an onboard LED off D6.
* Move string.h include to .c file
* Add pcb kicad link.
* Add info.json
* Move macro programming to numlock's keyposition, the most useless key on the post model M layout. Force numlock enabled on host at init time, so you're not stuck without a numpad (hopefully)
* Make the macro blink function toggle LEDs from their previous state.
* Use incorrect but code style compliant opening curly bracing style.
* Make PCB rev 1.1 the default Omnikeyish config, as the author has the only rev 1.0 boards that'll ever be.
* Fix silly spelling error in 3 defines
* First set of review changes.
* Layout macro and keymap defined using it.
* Layout macros for the northgate factory plates.
* minor rearrangements
* ALL the layouts.
* Forgot ultra-t in info.json
* fixed issue with LED indicators
corrected error in info.json
* fixed issue with led indictors
* added fix for key_count to info.json for westfoxtrot/aanzee
* fix to support config.qmk.fm correctly and remove unused key from matrix for westfoxtrot/aanzee
* fix for caps_lock led
* Update readme.md
* Fix breathing always on for soft PWM
* Remove reference to hardware PWM pins in BACKLIGHT_BREATHING description
Now, breathing will only be unsupported when Timers 1 and 3 are both used by Audio
* Document BACKLIGHT_ON_STATE and its purpose
* Move layout macros to revision folders
* Update Planck EZ layout macros
Planck EZ only supports one layout (centered 2u spacebar). Deleted all the other macros.
* Flesh out QMK Configurator support
Give each Planck revision its own info.json file.
* Readme updates
- give each revision its own readme
- add the Planck EZ to the main Planck readme
* Fix layout macro for Planck EZ
Previous matrix didn't compile because the electrical matrix defined a k3b location, which was unused by the physical arguments.
Drashna was kind enough to confirm the Planck EZ's matrix for me.
Co-authored-by: Drashna Jaelre <drashna@live.com>
* Pretend the Planck EZ supports ortho_4x12 layout
The hardware doesn't, but doing so prevents CI errors because the default keymap uses LAYOUT_planck_grid.
Going to pretend LAYOUT_ortho_4x12 is a valid layout for the Planck EZ.
* Update Planck EZ's URL in info.json
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* added keyboard_layout_jopr
* making it compile
* #pragma once instead of #ifndef and #define
* renamed and added keymap
renamed old "default" to "modded_white", added new "default" that resembles an ISO 105-key layout
* reordered keyboards/jopr/info.json to match order o layout array
* implemented most suggestions
* fixed missing ;
* fixed bootloader setting for rules.mk
* adopted standard layout matrix naming convention
* "fixed" commented-out code in keymaps
* changes to keymap layers and LEDs
Turns out adding a layer for ROYA-modified keycodes is more trouble than it's worth and works better by just defining a ROYA key.
Also, LEDs were set up incorrectly.
Lastly, implemented SysReq-Warning LED.
* moved forced NumLock code
just in case either it or the CapsLock & ScrlLock update code wouldn't both work otherwise
* rearranged media keycodes
* replaced Shifted keycodes with basic ones
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* implemented suggestions by noroadsleft
* Apply suggestions from code review
Make ISO-Enter QMK Configurator-friendly
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update readme.md
* Update keyboards/jopr/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* moved keyboard to handwired folder
It was said that personal passion projects belong in there, even if they're not actually handwired
* Update readme.md
* added personal CTRL keymap
* added personal dz60rgb keymap
* enabled new rgb effect
* added space cadet shift
* media player track buttons now orange
* updated keymaps with rgb setting and visual HSV setting preview
* fixed source stuff?
* added support for underglow toggle (bugged to all hell)
* everything now behaves as expected when ti comes to RGB toggles, thank god
* removed ifdefs
* changed color of MAS_CRM
* uh, whitespace
* changed rgb positions and modifiers within RGB matrix thing for CTRL and DZ60RGB
* updated keymap to work kindof
* KEYMAP: changed list of rgb effects
* changed CTRL rgb defaults
* KEYMAP: new LED layout for ctrl
* fixed white LED position in indicator
* changed capslock tap timing
* Fix backlight breathing on C6
* Account for ATmega32A's single TIMSK register (MT40)
* Document hardware PWM on D4 for ATmega32A
* Add C6 and D4 to BACKLIGHT_PIN description
* new keymap for the hasu with media keys and mac layout
* switch escape and grave
* switch to the usual default
* with play and stop
* add reset on fn layer
* add mouse buttons, move reset, update copyright
* changes to keymaps
* changes to userspace
* changes to userspace
* removed reference to fc660c keymap which no longer exists from userspace readme
* removed preonic keymap
* Fix typo for RGBLIGHT config values
It doesn't make a difference right now since these are the defaults in
rgblight.h (which I'm just setting explicitly since some of the keyboard
configs change these defaults). However, I'd rather be explicit, so
fixing my typo. :)
* Remove mouse keys layer from Quefrency keymap
It's a fun idea, but I never use it in practice.
* Planck: layout macro refactor
Unified layout macro names across AVR and ARM boards.
Currently certain layout macros are specific to either AVR or ARM when used in the QMK Configurator. If an AVR-specific macro is used for a Planck rev. 6, or an ARM-specific macro on a rev. 5 or earlier, the user receives a compile error.
* Update keyboards/planck/planck.h per @drashna
Changed KC_LAYOUT_ortho_4x12 alias to LAYOUT_kc_ortho_4x12.
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Add KC_KEYMAP alias for LAYOUT_kc macro
per @drashna
Update keyboards/planck/planck.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Fix LAYOUT_planck_1x2uC macro for Planck rev6
Thanks to drashna for testing.
* Fix inline comment regarding revisions
* Add specific info.json file for Planck rev6
* Adding led support for Plaid
* Adding led support for Plaid
* Update readme.md
Fixing bad markdown
* Adding my personal keymap
* Clarifying LED instructions / formatting
* modify oled_driver to support SH1106
also:
- improve mechanism to specify which OLED IC we use
- comment calc_bounds()
- give OLED_COLUMN_OFFSET a default value
- inline comment re: OLED MEMORY_MODE and SH1106
- update docs/feature_oled_driver.h for SH1106 support and related changes
- docs: OLED: note we have tested SSD1306 on ARM boards (per @XScorpion2)
- define out MEMORY_MODE when using SH1106 OLED driver
* document that SSD1306 128x64 on AVR works
Per @XScorpion2: https://github.com/qmk/qmk_firmware/pull/5787#discussion_r291837842
* Add vlukash CrKbd keymap to support trackpad adapter.
The trackpad adapter uses Elite-C board that has five extra pins.
Also SPI pins are taken for trackpad, keymap config updates column data
pins for matrix scan.
* Update vlukash keymap
* Enable pointing devide, configure mouse BTN1
* Set TAPPING_TERM to 300
* Add support for the BlackBerry 8520 trackpad
* Add vlukash keymap for master-right no-trackpad version
* Remap backspace
* Set EXTRAKEY_ENABLE = yes
* Update thumb keys mappings
* Set bootloader to atmel-dfu
* Sync keymap
* Add scrolling support
* Make debug LEDS conditional
* Add support for both flex and no-flex PCBs
* Add readme and rename root folders
* Update readme file with blog link
* Fix readme file formatting
* Remove ADJUST keycode, code cleanup.
* Add Win key to the keymap.
* add calbatr0ss dz60 layout
* add media controls
* add media next/prev controls
* add base layer for windows and macos
* swap right ctrl and menu
* missing bracket
* update gitignore
* niu_mini uses dfu bootloader rather than the afrdude bootloader
modified: readme.md
* Change rules in rules.mk to reflect the bootloader change
modified: keyboards/niu_mini/rules.mk
* Add 60_ansi_split_bs_rshift layout to DZ60
I know there's already a lot of DZ60 layout macros, and #4668 suggests
they should be refactored at some point, but since this is one of the
standard layouts already in QMK that this PCB supports, I figured it was
okay to add so that DZ60 keyboards can share this layout with other
keyboards.
* New 60% ANSI split backspace/right-shift layout
I'm using this on a DZ60, but it should work fine on most 60% PCBs. It's
basically a HHKB layout with a standard ANSI bottom row (3x 1.25U mods,
6.25U spacebar, 4x 1.25U mods).
* martenwuut's original code commit
* delete random directory that is the same as the parent directory
* get this compiling
* update readmes
* add manufacturer
* fix up the keymap error and replace KC_A with KC_1
* add verc support which is basically just at trimmed down verb
* update keymap readme to specify which redscarf it is
* add parent level readme
* fix grammar
* fix up readmes and put in alternative name for PCBs
* add configurator support for the ver.c pcb
* add configurator support for Ver.B (RS78) pcb
* add iso support for Ver.C (RS68)
* change DEBOUNCING_DELAY to just DEBOUNCE
* remove K2C to fit the default layouts
* fix keymap
* fixup configurator layout with split backspace
A delay of 10ms seems sufficient. Otherwise, media keys tapped from the
encoder of my BDN9 macropad only seem to get picked up by the OS
(Windows 10) some of the time.
* Candybar: updated rules.mk
Disabled console and command to get compiled size under flash space limitations.
* Candybar: Enable LINK_TIME_OPTIMIZATION_ENABLE
* [Keymap] iris@nstickney: improve RGB init
Perfecting the rgb backlight initialization with a delay for each
color; also start and stop the animation at the "default layer"
color.
* [Keymap] iris,ergodox@nstickney fix FN on SYMB
The function key was not operational on the SYMB and SYSH layers due
to other keycodes being mapped over MO() on those layers. The
offending keycodes have been moved to other keys.
* [Keymap] add @nstickney's userspace
Pulled common code out to a userspace directory for my iris and
ergodox keymaps.
* [Keymap] iris@nstickney add image to README
Added an image from keyboard-layout-editor.com to meet the README
standard.
* iris@nstickney hue values now `uint8_t` (#6050)
* Remove all Copyrighted Sounds and Songs
This removes any song that has a license/copyright on them.
Additionally, it adds the license information for any song that remains.
* Add removed song list
Can be reverted if we'd rather do that
* Use newer coding conventions
* Fix typo
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Revert copyright date
* Update quantum/audio/song_list.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* faq_general.md to Chinese
faq_general.md to Chinese
faq finished
* custom_quantum_functions.md to Chinese
custom_quantum_functions.md to Chinese
* custom_quantum_functions.md fix
custom_quantum_functions.md fix
* custom_quantum_functions.md fix translate
custom_quantum_functions.md fix translate
* !ver.English! _summary.md bug fix
_summary.md bug fix of English doc. add".md" behind "feature_combo"
* !ver.English! custom_quantum_functions.md fix#5869
custom_quantum_functions.md in English : delete redundant "is" . issue#5869
* !ver.English! how_keyboards_work.md link fix
change
https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
to
https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_input
"#Hexadecimal_code_input" not exist
* !English! how_keyboards_work.md add missing "t"
Tied to a specific OS a a time (need recompilation when changing OS);
change to
Tied to a specific OS at a time (need recompilation when changing OS);
* _summary.md improve translation
_summary.md improve translation
* reference_glossary.md into Chinese
reference_glossary.md into Chinese
术语表翻译,这个术语表英文版似乎不太全,应该补充英文版,并在中文版添加其他具有中国特色的术语。
* Dimple: fix unintended LED behaviour
The LED was always-on if the custom keymap did not call dimple_led_off()
at least once.
* Dimple: LED code fixup
* correct indicator light states.
function of indicator lights was inverted. these changes correct that.
* flesh out keymaps pre production
* Enable extrakey in rules
* 8-Pack Macropad
* Added MANUFACTUTER to config.h
* Fix the mirrored keymaps by creating rev1.1 and rev1.2 layouts, then using them in the keymaps
* fixes from code review comments
* Use revisions to manage the different layouts for rev1.1 and rev1.2
* Add DEFAULT_FOLDER to fix default build failures
* code review comments fixes
* code review comments fixes
I2C timing parameters were seemingly set up for an STM32F303 target MCU, at a specific clock speed. This commit allows specifying the timing parameters via config.h, allowing other STM32 MCUs to be targeted, potentially at different clock frequencies.
Alternate function modes for the I2C pins are now also configurable, allowing for remapping to other pins.
* Generate project, fill in the details
* Repair json
* Separate keymaps to numpad and all-1U
* Apply suggestions from code review
Co-Authored-By: Elliot Powell <32494740+e11i0t23@users.noreply.github.com>
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Begin work
* Make things a tad easier to read
* Fix spacing
* Get things compiling
* Build a variety of generic keymaps
* Correct RGB pin
* Add configurator json
* Apply suggestions from code review
Co-Authored-By: Elliot Powell <32494740+e11i0t23@users.noreply.github.com>
Co-Authored-By: MechMerlin <30334081+mechmerlin@users.noreply.github.com>
* Remove JJ50 data from YMD96
JJ50 was actually added as its own keyboard when this was added in #2546. It should have been taken out then, but wasn't.
* Update ymd96.h
- use #pragma once include guard
- remove redundant file includes
* Update LAYOUT_iso macro to K<row><col> notation
* Update LAYOUT_custom macro to K<row><col> notation
* Update LAYOUT_default macro to K<row><col> notation
* Refactor default keymap
* Rename readme file to lowercase
* Rename layers enum and default layer
- renamed layers enum to layer_names
- proposed by fauxpark in Issue 5977, and I like the idea
- https://github.com/qmk/qmk_firmware/issues/5977#issuecomment-495924338
- renamed the base layer to _DEFAULT
- I think it looks nicer.
* initial commit
* remove mentions of oe and replace with le
* add new layout macros with the spacebar change
* add rgb underglow support
* Update keyboards/exclusive/e6v2/le_bmc/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/exclusive/e6v2/le_bmc/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* belgian layout had no sendstring definition
* backtick was not defined for belgian sendstring
* slash definition was wrong for belgian sendstring
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* use BE_ keys whenever we can
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* ^ can be sent as a normal key (not a dead key) with altgr+para
* changed rgb positions and modifiers within RGB matrix thing for CTRL and DZ60RGB
* changed CTRL corner LEDs + centered horizontally
* whoops - changed CTRL's underglow LEDs back to the underglow flag
* whitespace
* I changed the right file this time
* Fixed DZ60RGB left shift out of position
* Expand info.json formatting to one line per key
This is a white-space-only change. Make it easier for me to read the file.
* Make sure every key object has a label
Going to be using them shortly.
* Insert key identifiers from v1.h into info.json labels
Shows where each key is located in the switch matrix.
* Move K5O to its correct location on the top row
* Adjust white space in v1.h
At this point, the macros for LAYOUT and LAYOUT_75_ansi are 100% identical, except for their names.
* Redefine LAYOUT_75_ansi as an alias of LAYOUT
No need for two code blocks with the same data.
* Correct visual positioning in info.json
- move Pause 1u to the right
- move K5O to the top row, between Print Screen and Pause
- move Enter key 1u to the left and 1u wider (1.25u to 2.25u)
* Delete key identifiers from info.json labels
Don't need them anymore now that we know where everything is.
I'm calling K5O as ScrLk so it has a label, even though that's not actually what it is.
Also gave the Spacebar a label because I prefer when all the keys have labels.
* Enable 75_ansi Community Layout support
* Reassign layout macro as LAYOUT_75_ansi and delete macro alias
Configure the codebase so LAYOUT_75_ansi is the only layout macro available.
* Add key_count key to info.json data
* added personal CTRL keymap
* added personal dz60rgb keymap
* enabled new rgb effect
* added space cadet shift
* media player track buttons now orange
* updated keymaps with rgb setting and visual HSV setting preview
* fixed source stuff?
* added support for underglow toggle (bugged to all hell)
* everything now behaves as expected when ti comes to RGB toggles, thank god
* removed ifdefs
* changed color of MAS_CRM
* uh, whitespace
* changed rgb positions and modifiers within RGB matrix thing for CTRL and DZ60RGB
* updated keymap to work kindof
* KEYMAP: changed list of rgb effects
* changed CTRL rgb defaults
* KEYMAP: new LED layout for ctrl
* adds spacetime keyboard
* removes custom tap and mod functions
this commit replaces tap_key, control_key and shift_key with built-in
tap_code16.
* changes thumb layer and makes left palm key ralt
* Add support for LSJ Ares
Thanks to the other ports which have made this port possible.
* Update Ares code per request
* More changes to Ares
* Update Ares rules.mk
Co-Authored-By: Maartenwut <maartenwut@gmail.com>
* Remove escaping backslashes from Ares default keymap
* mostly done with first version of Ellipse Rev1 software
* mostly done, error with backlight breathing
* more testing and changing default keymaps
* ready for first release attempt
* fix newline in readme
* fix copyright and extraneous declarations and symbols
* remove more excess backslashes
* fixed more formatting
* feat-user-kuatsure: abstract symbol row out
* feat-user-kuatsure: abstract grouped bracket, brace, paren out
* fix-preonic-kuatsure: remove eol as requested by @drashna
* feat-user-kuatsure: add KC_MAKE and KC_FLSH
thanks to @drashna for the help
* chore-preonic-kuatsure: remove auto shift
* chore-user-kuatsure: move leader seq's to macro syntax
* feat-user-kuatsure: add `KC_VRSN` key
plus use it preonic keymap
* chore-user-kuatsure: namespace keyboard macros `KB`
* chore-preonic-kuatsure: move some keyboardy keys around
* chore-preonic-kuatsure: remove parens, brackets, braces from lower
* chore-user-kuatsure: move tmux window shifts to dbl press leaders
* feat-user-kuatsure: add a computer lock leader seq
* fix-preonic-kuatsure: go back to lower brackets
* chore-preonic-kuatsure: clear out raise
* feat-various-kuatsure: add meh + tab mod tap
* chore-preonic-kuatsure: `raise` eats `game_mod` layer
* fix-preonic-kuatsure: reverse pg up and pg down
* chore-user-kuatsure: add double tap to turn off music
* chore-user-kuatsure: move like seqs together
* chore-preonic-kuatsure: add a few more items to the num pad on raise
* feat-user-kuatsure: re-enable td for <> keys
* chore-user-kuatsure: give a little more grace period for leader
* fix-user-kuatsure: give lock leader a gui buffer
no timer or anything, but alfred doesn't boot up as quickly as I would like sometimes
gui doesn't do anything but gives a little bit of a time bump
* fix-user-kuatsure: changes from @drashna review
* Switch Quefrency from flaky I2C back to serial
* Lower mouse wheel speed on Quefrency slightly
* Migrate common settings to userspace
* Enable Bootmagic Lite for consistent reset to bootloader.
* Turn off some undesired features across all keyboards.
* Remove EEPROM reset keybinding from all keyboards since Bootmagic Lite
also does an EEPROM reset.
* Set backlight and underglow increments consistently across all
keyboards since lots of them like to override the deafults.
* Set mouse keys consistently across all keyboards.
* Update function layer keymap images
* translate docs into Mandarin Chinese
translate
faq_debug.md
into Chinese
* translate faq_build.md into Chinese
translate faq_build.md into Chinese
* faq_keymap.md to zh-cn
faq_keymap.md to zh-cn
* Added customisations and README
* Tweak keymap: word traversal/deletion
* Add w and b word traversal/deletion keycodes.
* Add fine volume control key codes, but don't use them, because they
conflict with other key codes. `A` somehow got remapped to fine
volume up.
* Set mousekey delay to zero
* Use SAFE_RANGE for key codes.
* Update keymap and README
Add new mouse-specific layer 3, activated by pressing and holding space.
Add brightness controls to layer 4 (previously, layer 3).
Update README:
* New keyboard-layout mockup image.
* Add actual link to kbdfans.cn.
* Update layer descriptions.
* Fix indentation in keymap.c
* Use _______ over KC_TRNS to increase readability
* Custom keys: use #define over process_record_user
* Use enum for naming layers
* Rename README.md -> readme.md
* Keep ASCII art consistent with keymap
* Possible fix for xyverz ortho keymap: define RGBLED_NUM
* Update DZ60 keymap; TODO store old keymap under different directory?
* Change RGUI to RALT because 7u spacebar is too long
* Save old bottom row keymap
* Update Iris keymap: replace backslash with grv
* Add ortho_4x12 layout
* Added Delete key to Iris keymap
* Move delete key
* Oh look a new keyboard
* ortho4x12: get an adjust layer back
* Remove jj40 keymap, add custom power draw #define
* Set WhiteFox to advertise only 100mA of power draw
* Update WhiteFox keymap
* Update WF keymap (2)
* Remove lets_split keymap, update community krusli keymap
* Add #define for BACKLIGHT_LEVELS (unused)
* Update Whitefox keymap
* Add YD60 from auto-generated kbfirmware files
* Bring files up to speed with new standards
* Fix: KEYMAP -> LAYOUT
* Fix keymap differences (DZ60 -> YD60)
* Update keymap
* Update README
* Fix RShift position
* Specify that the port is for the YD60MQ variant
* Update keyboards/iris/keymaps/krusli/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix Iris and Let's Split keymaps
* Remove unused keymap file
* Use #include QMK_KEYBOARD_H
* Add atmel-dfu selection to yd60
* Rename dir to YD60MQ, update definitions
* Use new convenience macros/functions for led_set_user
* Use #pragma once
* Change all ?= to = in rules.mk
* Use pragma once for yd60mq.h
* Take out DZ60 and Iris changes
* Remove now-removed Iris folder
* Revert adding ortho_4x12
* Revert on xyverz ortho_4x12 keymap
* Undo deleting JJ40 keymap files
* Don't revert beyond upstream jj40 state
* Extra files from earlier commit is to be deleted
* Remove WhiteFox keymap not in upstream yet
* Re-add my Let's Split keymap
* Revert keymap changes
* Cleanup: indentation
* Update keyboards/yd60mq/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/yd60mq/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Cleanup & move kb backlighting code to yd60mq.c
* Update README, rename to lowercase
* Update README: rename to lowercase
* Update README with links and picture of PCB
* Remove PREVENT_STUCK_MODIFIERS
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Set Quefrency bootloader correctly for Elite-C
* Update Quefrency layout to be more like HHKB
* Update KBD67 layout to be more like HHKB
* Add keymap for BDN9 macropad
* Keyboard: add treeadstone48
* rename layout defines
* Use of pragma once
* move common include code
* fixed info.json
* change keymap layout from kc to normal
* fix alpha revision keymap
* fixed info.json
* remove USE_Link_Time_Optimization
* Add center sprit keymap for nomu30
* Re-enable Audio
And there was much rejoicingmake keebio/iris/rev2:drashna AUDIO_ENABLE=yes!
* Re-add debounce to ergodox EZ
* Fix rgb matrix helper function
* Make sure that RGM Matrix is checked properly
* Fix merge commit?
* Disable more RGB matrix modes
* Increase Debounce for Ergodox EZ
The performance improvements have made it necessary, actually
* Consolidate RGB Matrix layer indication function
And changes to iris
* Fix lighting issue for gamepad
* Update Corne Keyboard configuration
* Update Corne Keyboard layout
* Update KC_MAKE macro to better handle crkbd split
* Tweaks to Corne Keyboard Layout
* Enable RGB Matrix Sleep
* Update my code to use layer_state_t typedef
* rename bmc due to confusion as the bmc from r2 is different
* update readme
* Update keyboards/exclusive/e6v2/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* use pragma once
* remove custom matrix
* remove custom i2c code in favor of QMK's i2c_master
* rename to all lower case readme
* update readme
* turn off bootmagic as it doesn't work anyway
* Update keyboards/pearl/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Adding an AUDIO_CLICKY_DELAY_DURATION configurable value to the AUDIO_CLICKY feature.
* Tweaking my community keymap to work better with my rev 4 planck.
* Typedef'ed layer_state_t to uint32_t.
This enables future work with layer_state_t to uint8_t for optimization purposes.
* Removed accidental xeal60 commit
* Revert to egyptian brackets, added sizeof(layer_state_t) so when layer_state_t is redefined it will automagically work.
* Add additional typedefs
* Add checks for setting layer state
* Update tmk_core/common/action_layer.h
Co-Authored-By: alex-ong <the.onga@gmail.com>
* Revert commit.
* adding my keymap for the KUMO
* edited the readme file
* edited some more files
* edited some more files
* edited files from feedback
* edited one more files from feedback
* edited rules
* fix the things the stupid script broke
* create an appropriate LAYOUT macro using LAYOUT_tkl_ansi
* create an appropriate keymap stolen from the phantom default keymap
* add correct pins used and rgb led numbers
* change vendor and device name
* add QMK Configurator support
* fix up RGB underglow
* update readme
* introduce new layout macro tkl_iso
* add QMK Configurator support for new layout macro
* enable backlight and add community layout support
* Increase delay for Hold-Tap register for CAPSLOCK
Because it seems that the 80ms delay wasn't too much
* Screw it, make the caps delay a define and make it configurable
* initial commit
* copy paste with some fixes the code from fox lab leaf60 repo
* add 60_ansi and 60_hhkb and community layout support
* add QMK Configurator support
* turn bootmagic to lite and turn on rgb and backlights
* disable some features so firmware isn't too big
* initial commit for hotswap leaf60
* add hotswap support
* edits for consistency
* add a generic leaf60 readme
* turn off console and command to save firmware space
* not enabling sleep led enable
* not enabling sleep led enable
* had one extra key in 60_hhkb
* get rid of limit val define
* Update keyboards/foxlab/leaf60/hotswap/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/foxlab/leaf60/hotswap/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/foxlab/leaf60/universal/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* add rgblight_set_effect_range()
* implement effect range
* Arrange the order of function list in rgblight.h .
* update docs/feature_rgblight.md
* fix RGBLIGHT_RAINBOW_SWIRL_RANGE default value
* add example code about Utility Functions
* add example code about direct operation functions
* When RGBLIGHT_SPLIT is defined, the following function has no meaning and is invalidated.
* rgblight_setrgb_master(r, g, b)
* rgblight_setrgb_slave(r, g, b)
* rgblight_sethsv_master(h, s, v)
* rgblight_sethsv_slave(h, s, v)
* add temporary test code for rgblight_set_effect_range
* fix rgblight_effect_knight() bug
* Test End. Revert "add temporary test code for rgblight_set_effect_range"
This reverts commit 5680cddd012d68b2db75a532862a7fef250f8973.
This is a Neo2 inspired layout that is meant to be fully usable on
MacOS when used with the default US QWERTY/ABC Extended keymap.
Neo2 layers 1-4 have been almost fully implemented in hardware.
Layers 5 and 6 (greek and mathematical symbols) have been left
out for now as most of them aren't available on the default
keymaps.
Layer toggling for layer 3 on the right hand side utilizes a
tap-toggle approach that is a combination of MO & LT macros.
This is required to allow sending Y when tapped, @ when tapped
while the SHIFT modifier is active and support momentarily
toggling the layer while the key is held.
* trying to make my global keymap
* refactoring the old keymap using userspace
* getting there
* move readme and remove community layout
* use pragma once instead of ifndefs
* just make iris work
* iris decent
* better naming
* add some modifiers on the home row
* use symbol and sysctl layers
* fix up
* a bit faster
* add < and > on symbol layer
* apparently im not using z all that much..
* okok
* fix up stuff
* led init is back
* bring back led indicators
* Update keyboards/ergotravel/keymaps/pvinis/config.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* not needed
* not needed
* delete these for now, until I use the userspace code
* remove katamari from here. made a new pr for it
* lower case
* drashna suggestion :)
* move files to correct place
* fix missing command
* First publish of roguepullreqest programmer dvorak planck layout
* Removed junk line
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Removed layer songs
Removed layer songs for cleanliness. Will use them later.
* Update keyboards/planck/keymaps/roguepullrequest/readme.md
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Made basic LSHIFT framework but is not working. Listed other tapdances.
* Got LSHIFT to work
* Added working RSHIFT
* Added working TD_S
* Cleaned up LEFT and RIGHT [ { ] } on the UPPER layer.
* Cleaned up layout.
* Reenabled audio space is not needed right now.
* Added tap dances and layout image
* Started dactylmanuform layout
* Revert "Started dactylmanuform layout"
This reverts commit 5ef48e4a23de14db9b843d85d3250e1bf4426817.
* Started mousepad version of BDN9...wont compile for some reason.
* Fixed BDN9 mousepad layout
* Added readme.md to mousepad bdn9 layout.
* Updated readme.md for mousepad bdn9 layout.
Fixed the tables to finally work.
* Unslashed the mousepad keymap for the BDN9
* remove not need file
* set RGBLIGHT_SPLIT
* set RGBLIGHT by layer
* exchange LED color on layer
* Update keyboards/hecomi/alpha/rules.mk
I misunderstand RGBLIGHT_SPLIT
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Fix LAYOUT_60_iso_split_space_bs_rshift to match comments and Configurator
* Fix LAYOUT_60_iso_split_space_bs_rshift to match comments and Configurator
* Initial Zygomorph 5x6 code
Split is not working yet
* layout changes
implement 4 row config option (not done yet), remove layout comments in layout.c
* Zygomorph layouts for 5x12, 5x6, 4x12, and 4x6
Also, info.json *should* be nearly usable
for the configurator
* temporary fix for pin D5 being broken
* show D5 issue comment
* add build notes
* Pin B7 broken in split why?
* remove fix
* Fix some pin assignments
* begin to fix keymap
* Create new 5x6 layout
* update key positions
* Initial Zygomorph 5x6 code
Split is not working yet
* layout changes
implement 4 row config option (not done yet), remove layout comments in layout.c
* Zygomorph layouts for 5x12, 5x6, 4x12, and 4x6
Also, info.json *should* be nearly usable
for the configurator
* temporary fix for pin D5 being broken
* show D5 issue comment
* add build notes
* Pin B7 broken in split why?
* remove fix
* Fix some pin assignments
* begin to fix keymap
* Create new 5x6 layout
* Rough first pass at split common conversion.
Keymap cleanup to cover just the basics.
Broke OLED code out into separate example.
* Fix readme
* Removal of old encoder / oled driver, fix for layout macros
* small update
* xulkal zygomorph keymaps
* Removed the LED_MIRRORED option as leds are always mirrored on Zygomorph
* Xulkal keymaps update
* split rgb light support
* fix line endings
* Apply suggestions from code review
Co-Authored-By: zvecr <git@zvecr.com>
* More layout and compile fixes from pr review
* Cleaning up rules.mk files
* Apply suggestions from code review
Co-Authored-By: zvecr <git@zvecr.com>
* Updating defaults
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Added check for pressed to clear space cadet
* Found some docs to update
* Update docs/quantum_keycodes.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Changes from PR
* Fix white space on z150_blackheart.h
* Update z150_blackheart.h to use #pragma once include guard
* Update z150_blackheart.h to use QMK-preferred K<row><col> notation
* Add QMK Configurator support
* Refactor the keymaps
- refactor the keymaps into separate files for each layout macro
- give credit where credit is due
- white space update (four-space indent)
* Make Hardware Availability link in readme a rich text link
* Convert LED indicators to GPIO commands
* Elevate Indicator LED set-up and toggling to keyboard level
* project creation and config.h import
* fix name
* cleanup
* layout for left
* working left with feather pins
* full keymap
* ?
* let's do this
* non working twimaster version
* it fucking works!
* bluetooth!
* cleanup
* use auto output for ADAFRUIT_BLE
* remove auto from custom matrix
* better ble auto
* fix f1
* revert
* fix ble
* update readme
* Update readme.md
* Update readme.md
* translate newbs.md into Madarin Chinese
translate newbs.md into Madarin Chinese
* translate docs into Mandarin Chinese
translate getting_started_github.md into Mandarin Chinese
* translate getting_started_getting_help.md into Mandarin Chinese
translate getting_started_getting_help.md into Mandarin Chinese
* contributing.md to Chinese
Personify QMK as a girl named Q酱 . It can make more developer read this document and contribute QMK.
* getting_started_introduction.md to Chinese
getting_started_introduction.md to Chinese
* faq.md to Chinese
faq.md to Chinese
* crlf2lf getting_started_introduction.md
ending line fix getting_started_introduction.md
* crlf2lf contributing.md
crlf2lf contributing.md
* clean up rgb matrix extern usage
Moved rgb matrix boiler plate into macros
Rebased onto typing heatmap pr
* Fixing the reversed frame buffer access in digital rain
* Fixing digital rain & typing heatmap if keyreactive effects are not enabled
* Apply suggestions from code review
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Adding parenthesizes to DRIVER_LED_TOTAL where necessary
* Updated docs
* added notes about parentheses
* Improve Animation docs with example
- example to reduce flash footprint of animations using RGBLIGHT_EFFECT_ defines
* Re-order the effects list
* Update docs/feature_rgblight.md
Co-Authored-By: yanfali <yanfali@gmail.com>
* Update docs/feature_rgblight.md
Co-Authored-By: yanfali <yanfali@gmail.com>
* Update docs/feature_rgblight.md
Co-Authored-By: yanfali <yanfali@gmail.com>
* Introduce line breaks
* Add title for animation speed section
* Organize Animation Defines Into Groups
* Use the RGB EFFECT recommended by mtei in docs
- has the most modes, and STATIC_LIGHT can't really be disabled.
* Use more accurate titles for effects and animation
- accidentally put a toggle in settings
* Norman layout with Lower and Raise layers working
* Add keymap_extra def for Norman layout
* Re-org'ed the modifiers as explained in the Readme
* Corrected colour legend for KLE that the Readme links to
* Use #pragma once in header file
* Use pragma once and move user config to config.h
* Move definitions to the right file and correct link in Readme
* Move def of NM_COLN to the logical place in header file
* Add sendstring_norman.h for when the laptop layout is not QWERTY
* Update quantum/keymap_extras/sendstring_norman.h
Co-Authored-By: lehoff <torben.lehoff@gmail.com>
* initial commit and script error fixes
* add matrix and pin definitions along with LAYOUT macro
* add an appropriate keymap
* add num lock led support
* turn on bootmagic lite along with backlight led support
* add QMK Configurator support
* initial commit
* fix script issues
* define pins used and electrical matrix size and an appropriate LAYOUT macro
* add an appropriate keymap
* turn on bootmagic lite and backlight support
* Add QMK Configurator support
* add caps lock led support
* update readme with group buy links
* initial commit
* fixup script issues
* define pins used and create an appropriate LAYOUT macro
* create an appropriate keymap
* turn on backlight and bootmagic lite
* add QMK Configurator support
* fixup readme
* remove doubly defined KC_TRNS from keymap
* add support for Caps lock and Scroll lock LEDs
* Initial conversion of the rgb_led struct
* Converting last keyboard & updating effects to take advantage of the new structure
* New struct should not be const
* Updated docs
* Changing define ___ for no led to NO_LED
* Missed converting some keymap usages of the old struct layout
slave backlight was always on - as get_backlight_level() doesn't
indicate if the backlight is enabled or not.
also updated the corosponding code for serial transport to stop peeking
directly at 'internal' backlight_config structure.
* Disable a bunch of reactive modes
* Enable rgb matrix for Corne Keyboard
* Convert CRKBD to rgb matrix
* Add Gergo keyboard layout
* Make Diablo 3 tap dance better
* Add basic support for Planck EZ
* Fix RGB Matrix stuff
* Fix keycodes for Planck EZ
* Update CRKBD OLED stuff
* Fix typo for sleep on ergodox glow
* Improve my gergo layout
* Scrolling OLED key logger!
* Change gergo layout
* Hnadle unicode keycodes if unicode is disabled
* Disable COMMAND/CONSOLE for gergo
* Fix right side control
* Re-enable LTO for all platforms
Since I got updated arm gcc binaries that no longer error out on lto
* Update formatting to match newer community standards
Poor 2 space
* Re-alight startup animation to use new HUE range
* Streamline gitlab ci scripts
* Disabled Space Cadet
* Add support for breathing table
* Enable new LTO Option
And clean up defines that will now be repeatitive
* Remove vscode settings
* Additional formatting cleanup of config.h files
* Add FnLk to Melody96 bottom row
* Update conditional in userspace makefile
Thanks @drashna
* Add F keys to Melody96 Fn layer
* Add FN_ESC alias to userspace
* Update KBD6X keymap
* Fix RGB_MATRIX_ENABLE constant name in #if
* Remove trailing \ from LAYOUT macro calls
* Set RGB mode on EEPROM reset in KBD6X
* Swap right and middle mouse buttons in KBD6X
* Rearrange RGB controls in KBD6X
* Update keycode aliases, replace CLEAR with DEL_NXT in KBD6X
Add Clear to KBD6X as RCtrl+`
* Convert code to 4 space indents
* Tweak RCTRL layer functionality
* Replace NUMPAD custom keycode with layer state logic
* Update RGB_MATRIX_ENABLE check
Co-Authored-By: vomindoraan <vomindoraan@gmail.com>
* Re-fix Mousekey Movements
After the new movement model was instroduced, it broke diagonal momement, again. Reapplying fix from #3147 to both old and new acceleration method.
* Make diagonal mouse report checks more readable
Co-Authored-By: drashna <drashna@live.com>
* added personal CTRL keymap
* added personal dz60rgb keymap
* enabled new rgb effect
* added space cadet shift
* media player track buttons now orange
* updated keymaps with rgb setting and visual HSV setting preview
* fixed source stuff?
* added support for underglow toggle (bugged to all hell)
* everything now behaves as expected when ti comes to RGB toggles, thank god
* removed ifdefs
* changed color of MAS_CRM
* uh, whitespace
* fixed issue with LED indicators
corrected error in info.json
* fixed issue with led indictors
* added fix for key_count to info.json for westfoxtrot/aanzee
* fix to support config.qmk.fm correctly and remove unused key from matrix for westfoxtrot/aanzee
The code as originally listed didn't work for me, but replacing `unregister_code16(LALT(KC_TAB));` with `unregister_code(KC_LALT);` fixes the problem and causes the macro to work as intended.
Thanks to folks on Discord for helping me figure this out.
* docker_build.sh: Docker requires access to hosts devices
This also runs the container interactively which allows the user to
interupt the build with Ctrl-C.
* docker_build.sh: Mount /dev via $usb_args instead
* remove files that contributed to default hex file creation
* fix up rgb pcb rules and config that previously depended on rules and config in a parent directory
* use #pragma once
* turn on backlight breathing and use #pragma once
* fix config.h and rules.mk to not depend on the parent directory
* use #pragma once
* removed keyboard info.jsons in favor of a shared one
* add in hhkb layout and shared info.json file
* fixup readme file
* remove cruft
* use bootmagic lite over yes
* fix config path and use pragma once
* commit PR fixes
* update manufacturer
* set bootloader correctly
* Expose unicode_saved_mods
* Add UNICODEMAP shift pair functionality and XS keycode
* Add XS to keycode reference documentation
* Pick pair index based on both Shift and Caps Lock state
* Add XS to Unicode feature docs
* Clean up process_unicode* headers
* Extract unicode_map index calculation into function
* Pick pair index as XOR rather than OR of Shift and Caps states
* unicode_input_start() has to be called before the unicode_map index is calculated
* Replace unicodemap_input_error() with more generic unicode_input_cancel()
* Replace register+tap+unregister with tap_code16(LCTL(LSFT(KC_U)))
* UNICODE_OSX_KEY → UNICODE_KEY_OSX, UNICODE_WINC_KEY → UNICODE_KEY_WINC
* Make keycode range checks more robust
* Fix keycode range checks for different input modes
* Add UNICODE_KEY_LNX, update docs
* QK_UNICODEMAP_SHIFT → QK_UNICODEMAP_PAIR
* XS → XP, update docs
* Tweak Unicode docs
* Use recently added MOD_MASK_SHIFT and IS_HOST_LED_ON helpers
* Update Unicode table in docs/keycodes.md
* Update Unicode docs per review comments
* Replace references to Mac OS X with macOS in Unicode docs
* As of v0.9.0, WinCompose supports all possible code points
* Expand descriptions in XP docs
* Update keycode table and cycling docs
* Further expand cycling docs
* Add DFU Suffix for ARM boards
* Blindly flash DFU SUFFIX ARGS for now
* Fix commented out check
* Fix DFU Suffix Argument check
Thank you jack!
* Update Travis CI Scripts to include dfu-util
So we can get dfu-suffix as well
* Manually add dfu-suffix package
* Use external repo for newer version of dfu-util
One that includes dfu-suffix
* Update .travis.yml
* Silence unnecessary output from dfu-suffix
The insertion point for `$(patsubst %.c,%.clib,$(LIB_SRC))` must be after all normal `SRC += ..` . I modified it to be so.
Because LIB_SRC and SRC are assumed to be used in pairs. Similarly, QUANTUM_LIB_SRC and QUANTUM_SRC are assumed to be used in pairs.
translate
newbs_getting_started.md
newbs_building_firmware.md
newbs_flashing.md
newbs_testing_debugging.md
newbs_best_practices.md
newbs_learn_more_resources.md
into Mandarin Chinese
Specifically, to fix some edge cases, and keep the handling consistent, the userspace folder should not actually be added at the end. Ideally, it should be added after the keymap paths, but before the keyboard's path.
This issue was discovered in #5484, and the fix created by mtei.
* If RGBLIGHT_EFFECT_BREATHE_CENTER is undefined, use fixed breathe table instead of exp() and sin()
* Change rgblight breathing table size to be easily selectable.
add RGBLIGHT_BREATHE_TABLE_SIZE macro for customize breathing effect.
* Add compatibility for LAYOUTS = planck_mit planck_grid
* Add compatibility for LAYOUTS = ortho_4x12
* Remove planck_grid community support from Plaid
* First publish of roguepullreqest programmer dvorak planck layout
* Removed junk line
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Removed layer songs
Removed layer songs for cleanliness. Will use them later.
* Update keyboards/planck/keymaps/roguepullrequest/readme.md
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Made basic LSHIFT framework but is not working. Listed other tapdances.
* Got LSHIFT to work
* Added working RSHIFT
* Added working TD_S
* Cleaned up LEFT and RIGHT [ { ] } on the UPPER layer.
* Cleaned up layout.
* Reenabled audio space is not needed right now.
* Added tap dances and layout image
* Started dactylmanuform layout
* Revert "Started dactylmanuform layout"
This reverts commit 5ef48e4a23de14db9b843d85d3250e1bf4426817.
* Adjusted the linear led table and hsv_to_rgb to better handle 255 hue
* small math adjustments to better handle specific uint8_t rounding and overflows
* Remove dependency on sortedcontainers
* Sort dictionary on output
* Externalize writing of keymap.c into function
- serialize layers into one flat list
* Add encoding
* Generate JSON keymap in addition to keymap.c
* Replace XXXXXX with KC_NO
* Added support for BM16S keyboard.
* Update keyboards/bm16s/bm16s.h
Co-Authored-By: bontakun <ben@bontakun.net>
* Update keyboards/bm16s/bm16s.h
Co-Authored-By: bontakun <ben@bontakun.net>
* Cleaned up a bunch of unneeded stuff.
* Made layout name match.
* Changed rules file to have correct bootloader and indention. Updated readme to reflect availability on krepublic. Updated keymap to have more obvious RGB controls.
* Removed unnecessary file.
* Fixed grammar in readme.
Co-Authored-By: bontakun <ben@bontakun.net>
* Migrated to autogenerated layout config, without issue.
* Renamed LAYOUT to match community standards.
* Move lib8tion header-defined constant into implementation file, add to build
* Move b_m16_interleave initializtion to lib8tion.c, change build to include lib8tion.c in QUANTUM_LIB_SRC
* Remove left-over whitespace
* Move lib8tion include by RGB_MATRIX_ENABLE code in makefile
* Revert build changes and change lib8tion b_m16_interleave constant to static
* Adding ortho_4x12 & planck_mit layouts for KBD4X.
* Adding LAYOUT_kc_ortho_4x12 macro to KBD4x.
* Turn off console for KBD4X so firmware size falls within limit.
* Revamped custom effects approach
See docs for example usage
* push-up RGB Matrix default mode
Override default effect using RGB_MATRIX_STARTUP_MODE.
Useful on boards without EEPROM support
(*cough* Massdrop ALT/CTRL *cough*)
* update docs
* Planck: Copy contents of Planck rules.mk to each revision
* Planck: Delete Planck rules.mk
* Planck: Concatenate duplicate rules
Concatenate rules that are set and then overridden into one setting.
* Preonic: Copy contents of Preonic rules.mk to each revision
* Preonic: Delete Preonic rules.mk
* Preonic: Concatenate duplicate rules
Concatenate rules that are set and then overridden into one setting.
* Planck: Delete non-specific Bootloader settings from revs. 1 and 2
Deleted BOOTLOADER setting code block, as the checks were only valid for revs. 3-5 and the Planck Light.
Neither Planck rev1 or rev2 set the bootloader via rules.mk, so there's no setting of BOOTLOADER in their rules.mk files.
* Preonic: Fix BOOTLOADER settings code blocks
* Preonic: delete extra blank lines from rules.mk files
* Preonic: delete AVR-type hardware config blocks from rev3
* Update Planck and Preonic readme files
- update Hardware Supported
- update/add Install Examples
- update Docs paragraph
* Enable Bootmagic Lite where it is disabled
Enabled Bootmagic Lite for:
- Planck Light
- Planck revs. 1-5
- Preonic revs. 1 and 2
* Remove `planck_grid` from LAYOUTS rule for all Planck revisions
Community has landed on `ortho_4x12`, which is already set; `planck_grid` is redundant.
* Update code for compatibility with latest QMK
* Added compatibility with Planck rev6
* use wait_ms instead of _delay_ms
* removed unnecessary rules
* disable audio on rev4 only
* A better new_project.sh
* Fix docstrings
* Use single quotes for anything not shown to user
* Missed this docstring
* Simplify get_git_username()
Thanks @vomindoraan
* chmod +x
* Add docstring for print_error()
* Break up git username call into multiple lines
* Use with statement here
* Conform to PEP 8 even more
* Turn it back into a shell script
* chmod +x again
* Update docs to reflect new keyboard generator usage
* Tweak wording slightly
* Trim trailing whitespace
* Don't actually need to escape the newlines here
* As I suspected, you can pass shift a number
* Prepend ./ to match the other code block
* Minor syntax tweaks
* The username token has changed
* Replace name in the readme too
* Make some reasonable assumptions about the presence of Git
* Add initial keyboard layout for Quefrency
* Add RGB config and keybindings for Quefrency
* Move Quefrency wheel keys to more convenient place
* Actually switch from serial to I2C
Commit 64708c6 updated the comment, not the #define. D'oh!
* [Keyboard] Update Gergo to use newer Ergodox Matrix code
And update layout macros to be correct
* Almost forgot the json file
* Remove board specific defines for i2c timeout
* Start to standardize macro timer
* Update Fractal layout
Specifically, limit the RGB Lighting, since it's too many for the power, and only have the KITT annimation on the front
* Update Iris keymap to use I2C for transport
* Remove TAP_CODE_DELAY from keyboard in favor of global setting
* Remove Woodpad
Since it\'s no longer in my possession
* Only enable LTO on AVR boards
* Run matrix_scans while doing startup light
* Run matrix_scan to get split keyboard code synced properly
* Fix rgb mode
* Remove custom debouncing settings
* Make RGB Light Startup Animation optional
* Fix opt def
* Remove extra tap code delay value
* Fix references to keebio boards
* Add support for LP Iris keyboard
* Add backlight code
* Make startup animation optional
* Update gitlab ci script
* Remove port declaration
* Revert avrgcc changes to gitlab ci file
* Don't re-set mods
* Remove MACRO_TIMER define
* Add custom name for crkbd
* Add name for Prime M pad
* Add names for ortho 4x12 boards
* Add some additional handling for rgb init
* Change thumb clusters on ergodox
* Switch Orthodox to I2C
* Fix Space in ergodox keymap
* Use OSL for ergodox layout
* Ugh, can't find a good layout
* Fix typo
* Fix up animation startup
* Cries in AVR
* Fix makefiles for ergodox ez boards
* Add support for "secret songs" in my userspace
* Reset debounce to 5ms for Ergodox EZ
* Fix gitlab CI yaml file
* More crying in AVR
* Cannot use rgb light and rgb matrix at the same time due to the WS2812 rgb matrix PR until the "Coexistance" PR is merged
* Update ODox for split common and i2c
* Add split config
* Impement Split code
* Add support for xscorpion OLED code
* Add OLED display config
* Fix OLED screen font
* Get OLED set up in vertical mode
* Remove old OLED code
* add per key support for crkbd
* Fix split changes
* RGB Tweeaks
* More OLED tweaks
* Fix rotation stuff
* Fix more OLED stuff
* Remove custom Debounce from Ergodox layout since it's no longer needed
With my XD60, I noticed that when typing the backlight was flickering.
The XD60 doesn't have the backlight wired to a hardware PWM pin.
I assumed it was a timing issue in the matrix scan that made the PWM
lit the LED a bit too longer. I verified it because the more keys that
were pressed, the more lighting I observed.
This patch makes the software PWM be called during CPU interruptions.
It works almost like the hardware PWM, except instead of using
the CPU waveform generation, the CPU will fire interruption
when the LEDs need be turned on or off.
Using the same timer system as for hardware PWM, when the counter
will reach OCRxx (the current backlight level), an Output Compare
match interrupt will be fired and we'll turn the LEDs off.
When the counter reaches its maximum value, an overflow interrupt
will be triggered in which we turn the LEDs on.
This way we replicate the hardware backlight PWM duty cycle.
This gives a better time stability of the PWM computation than pure
software PWM, leading to a flicker free backlight.
Since this is reusing the hardware PWM code, software PWM also supports
backlight breathing.
Note that if timer1 is used for audio, backlight will use timer3, and if
timer3 is used for audio backlight will use timer1.
If both timers are used for audio, then this feature is disabled and we
revert to the matrix scan based PWM computation.
Signed-off-by: Brice Figureau <brice@daysofwonder.com>
* added info.json for ymd96
* fix layout for keymap_custom macrom, correct info.json for default layout
* add info layout for iso
* add info layout for iso
* align layout name, added maintainer username
* layout case fix
* layout case fix
* fix overlapping keys
* match layouts to keymaps.
* Define RGB colors
Define RGB colors and pass them to the rgblight functions, instead of
defining multiple macros.
* Add new color definitions support for RGB Matrix
* Add/clarify info about new color definitions in Docs
* Add deprecation warning banner to rgblight_list.h
* initial commit
* get rid of some of the vanilla code
* set up matrix and pins
* Create LAYOUT macro and an appropriate keymap
* support for caps lock LED
* add some documentation to the doro67 parent readme
* align the language used in the several readme files
* initial commit
* get rid of some of the vanilla code
* set up matrix and pins
* Create LAYOUT macro and an appropriate keymap
* support for caps lock LED
* add some documentation to the doro67 parent readme
* align the language used in the several readme files
* Use RGB Matrix and fix enter key bug
* fix formatting
* remove merge conflict artifacts
* make a more useful default keymap
* add configurator support for the RGB pcb
* fix rgb matrix based on new info. Multipler should be reversed
* forgot to actually set the pin output for caps lock led
* fix offset keys in layer 1 keymap
* code cleanup
* use macros for the rgb_led calculations struct
* set RGB led num to 67 as I mistakenly counted the caps lock led
* cleanup config.h file
* add RGB note in readme
* get consistent naming in config file
* fix some inconsistencies
* readjust matrix and get rid of macros based on drashna's suggestions
* add keymap
* fix readme title
* renamed README.md to lowercase, fix typo
* renamed README.md to lowercase, for real
* add double spaces for github
* lowercase name in readme
* rename directory to lowercase
* Make Signum 3.0 compatible with default ortho_4x12 layout
* Disable unicode map by default
* Add missing backspace key
* Add missing delete key
* Fix broken gui right command
* Move MO5 to a different key an add Esc to L4
* Move MO5 to a different key
* Add Del and Bspace to layer 4
* add I2C_slave_buffer_t to quantum/split_common/transport.c
Improvements to ease the maintenance of the I2C slave buffer layout. And this commit does not change the compilation results.
* add temporary pdhelix(Patched Helix) code
* temporary cherry-pick from #5020
add new version(#5020) quantum/rgblight.[ch], quantum/rgblight_modes.h
* add post_config.h support to build_keyboard.mk
* add quantum/rgblight_post_config.h, quantum/split_common/post_config.h
Add quantum/rgblight_post_config.h and quantum/split_common/post_config.h using POST_CONFIG_H variable of build_keyboard.mk.
quantum/rgblight_post_config.h additionally defines RGBLIGHT_SPLIT if RGBLED_SPIT is defined.
quantum/split_common/post_config.h defines RGBLIGHT_SPLIT additionally when master-slave communication is I2C.
* Change split_common's transport.c I2C to use the synchronization feature of rgblight.c
* Change split_common's transport.c serial to use the synchronization feature of rgblight.c
* test RGBLIGHT_SPLIT on keyboards/handwired/pdhelix
* Test End Revert "test RGBLIGHT_SPLIT on keyboards/handwired/pdhelix"
This reverts commit 80118a6bbd3d9fc4c7797fef0c34bc67aa73aa98.
[x] make RGBLIGHT_TEST=1 handwired/pdhelix/i2c:default
[x] make RGBLIGHT_TEST=2 handwired/pdhelix/i2c:default (same RGBLIGHT_TEST=3)
[x] make RGBLIGHT_TEST=3 handwired/pdhelix/i2c:default
[x] make RGBLIGHT_TEST=1 handwired/pdhelix/pd2:default
[x] make RGBLIGHT_TEST=2 handwired/pdhelix/pd2:default
[x] make RGBLIGHT_TEST=3 handwired/pdhelix/pd2:default
[x] make RGBLIGHT_TEST=1 handwired/pdhelix/pd2_2oled:default
[x] make RGBLIGHT_TEST=2 handwired/pdhelix/pd2_2oled:default
[x] make RGBLIGHT_TEST=3 handwired/pdhelix/pd2_2oled:default
* Test End, Revert "temporary cherry-pick from #5020"
This reverts commit d35069f68bda0c50370442a5c7aae60c2f4ce5c0.
* Test End, Revert "add temporary pdhelix(Patched Helix) code"
This reverts commit aebddfc1a879796afae297ef0723a4fe73af3660.
* temporarily cherry-pick from #5020 to see if it passes the travis-ci test.
add new version(#5020) quantum/rgblight.[ch], quantum/rgblight_modes.h
* Passed the travis-ci test. Revert "temporarily cherry-pick from #5020 to see if it passes the travis-ci test."
This reverts commit 647c0a9755eb6a05f76d09b2d59bce67b85a841f.
* update docs/config_options.md
* update split_common/transport.c, improves maintainability of serial transaction IDs.
No change in build result.
* temporary cherry-pick from #5020
* fix build fail keebio/iris/rev3:default
* fix build fail lets_split_eh/eh:default
* Revert "temporary cherry-pick from #5020"
This reverts commit be48ca1b4515366a097af8dd1cd7b28b7ee09947.
* temporary cherry-pick from #5020 (0.6.336)
* Revert "temporary cherry-pick from #5020 (0.6.336)"
This reverts commit 978d26a8b3cf0acc485838a7d76d6128b77c630c.
* temporary cherry-pick from #5020 (0.6.336)
* add temporary file that is rgblight.c call graph
* add rgblight_update_hook()
* update rgblight-call-graph.dot (temporary file)
* add more hook point
* add TODO comment
* temporary Revert "add TODO comment"
This reverts commit df6165aac9b3a31d1d3e31ce52aadc134b84eac2.
* temporary Revert "add more hook point"
This reverts commit 64592b06f3bcdaac47c59f922018a273bef76776.
* temporary Revert "add rgblight_update_hook()"
This reverts commit 432b74c912ed4333e6633e20a1bcda10c6a10eaf.
* add rgblight_update_hook()
* add more hook point
* add TODO comment
* implement rgblight_update_hook()
* remove rgblight_update_hook(), add RGBLIGHT_SPLIT_SET_CHANGE_XXXX
rgblight_update_hook() is too large.
change to simple flag setting.
* shrink rgblight_config_t
* implement rgblight_update_sync()
Note: The animation synchronization process has not been implemented yet.
* update quantum/rgblight-call-graph.dot (temporary file)
* rmove quantum/rgblight-call-graph.dot (temporary file)
* update rgblight.c
* Add temporary code to Helix keyboard 'five_rows' keymap to test rgblight.c .
* fix build break rgblight_update_sync() when all animation off
* fix quantum/rgblight.c:rgblight_disable_XX() add RGBLIGHT_SPLIT_SET_CHANGE_MODE
* quantum/rgblight.c change code order: move rgblight_update_sync()
* add mode_base_table[] to quantum/rgblight.c
* quantum/rgblight.c use mode_base_table[] and rgblight_status.base_mode
* quantum/rgblkght.c animation timer integration
* quantum/rgblkght.c add animation sync for split keyboard
* fix mode_base_table[] and snake effect
* fix build break keyboards/mxss.
keyboards/mxss's local rgblight.c need old version rgblight.h
* rgblight.c: fix animation sync
* quantum/rgblight.c: fix snake effect sync
* quantum/rgblight.c: animation sync interverl 30 sec
* quantum/rgblight.c: fix rgblight_effect_rainbow_swirl() and rgblight_effect_knight()
* quantum/rgblight.c: add macro RGBLIGHT_SPLIT_ANIMATION
* cherry-pick from 'rgblight_modes.h sample implementation'
* fix RGBLIGHT_SPLIT_ANIMATION check position
* Update temporary code in Helix keyboard 'five_rows' keymap to test rgblight.c
* Reduce the firmware size by 1500 bytes when rgblight_effect_breathing() is enabled.
* Changed to rgblight_sethsv_eeprom_helper() for easier reading.
* add fail-safe code to quantum/rgblight.c:rgblight_task(),rgblight_timer_enable()
* remove temporary code in Helix keyboard 'five_rows' keymap
* quantum/rgblight.c: add split-keyboard master side sync functions
add functions:
uint8_t rgblight_get_change_flags(void);
void rgblight_clear_change_flags(void);
void rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo);
change function:
void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom);
* Change rgblight_update_sync() to use write_to_eeprom.
* remove TODO comment from quantum/rgblight.h
* Revert "fix build break keyboards/mxss."
This reverts commit 90b9a1aa7d8af226751500e49e3ea0214cc4e024.
(Separated this change into the newly opened PR #5461.)
* Revert "Reduce the firmware size by 1500 bytes when rgblight_effect_breathing() is enabled."
This reverts commit b61004e63e82cf5334cee4def4ba10cffa88885f.
* update quantum/rgblight.c: Code size reduction when not using RGBLIGHT_SPLIT.
* Add temporary code to Helix keyboard 'five_rows' keymap to test rgblight.c .
* add temporary pdhelix(Patched Helix) code
* Add temporary code to split_common/transport.c to test rgblight.c.
* Finish testing rgblight.c with helix keyboard.
Revert "Add temporary code to Helix keyboard 'five_rows' keymap to test rgblight.c ."
This reverts commit 0bf81a4723a977adc0cb09b4272ee5c9b4f2bbbb.
* Finish testing rgblight.c with quantum/split_common code.
Revert "Add temporary code to split_common/transport.c to test rgblight.c."
This reverts commit 71db3e24eef40d4c455fb9fd1664e4487c9d927a.
* remove temporary pdhelix(Patched Helix) code
This reverts commit 5287e51a394741bcb6028c7cfc0dd0c984645f76.
* Added description of RGBLIGHT_SPLIT macro to docs/feature_rgblight.md.
* add RGBLIGHT_SPLIT_SET_CHANGE_HSVS to rgblight_init()
* Changed to restart animation only when changing mode.
When changing hue, sat and val, the animation is not restarted and continues.
Patch from https://github.com/qmk/qmk_firmware/issues/3657#issuecomment-415147411
Long story short, in avr-gcc pre-8.2, reset_key was assigned to a memory area that was in a normal range, but when 8.2 came out, that memory got moved to an out of range area, causing errors like 0x800293 out of range. Apparently, this was fixed up in avr-gcc, but we haven't seen a release with the fix yet (we expected it in 8.3, but that didn't happen for some reason).
What this commit does is move the reset_key back to the original memory location it was in before.
* Reduce CRKBD firmware size by reducing layer numbers
* Update layer output code based on mtei's suggestion/code
* Fix spacing
* Revert "Update layer output code based on mtei's suggestion/code"
This reverts commit 036d347db309170afd5676e694adfda69f912615.
Unfortunately, because this is NOT in the keymap itself, the layer macros aren't accessible and will error on commit
* Add comment for future person
When waking from suspend, only enable the LED drivers if they were not previously set to disabled by the user. This functionality was removed by the recent updates to adapt Massdrop keyboards to QMK RGB Matrix. Affects Massdrop CTRL and ALT keyboards compiled using Massdrop Configurator mode.
* First publish of roguepullreqest programmer dvorak planck layout
* Removed junk line
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Update keyboards/planck/keymaps/roguepullrequest/keymap.c
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Removed layer songs
Removed layer songs for cleanliness. Will use them later.
* Update keyboards/planck/keymaps/roguepullrequest/readme.md
Co-Authored-By: roguepullrequest <roguepullrequest@users.noreply.github.com>
* Made basic LSHIFT framework but is not working. Listed other tapdances.
* Got LSHIFT to work
* Added working RSHIFT
* Added working TD_S
* Cleaned up LEFT and RIGHT [ { ] } on the UPPER layer.
* Cleaned up layout.
* Reenabled audio space is not needed right now.
* Add files via upload
* kingwangwong
* kingwangwong
* revisions and adding atom40
* revisions for 5626
* revisions for 5626
* revisions for 5626.
* revisions for 5626, re added safe range
* revisions for 5626, added qmkkeyboard
* revisions for 5626, quefrency
Assuming I understand this correctly, this should set the max scancode to E7 (RGUI), which is the last listed code in the main list (everything else use for internal QMK/TMK stuff).
* Port DIRECT_PINS from split_common/matrix.c to matrix.c
* Reorder matrix.c to remove foward declaration and match split_common/matrix.c
* Refactor nano to use DIRECT_PINS
* Reorder matrix.c to remove foward declaration and match split_common/matrix.c
* Add DIRECT_PINS documentation
* Reorder matrix.c to remove foward declaration and match split_common/matrix.c - fix logic from inherited from split_common
* Add DIRECT_PINS documentation - review comments
* Revert "Update build instructions and Dockerfile to download submodules"
This reverts commit 93210547bd.
* Update build tools docs based on feedback
* Fix bad link in build tools docs
* RGB Matrix overhaul
Breakout of animations to separate files
Integration of optimized int based math lib
Overhaul of rgb_matrix.c and animations for performance
* Updating effect function api for future extensions
* Combined the keypresses || keyreleases define checks into a single define so I stop forgetting it where necessary
* Moving define RGB_MATRIX_KEYREACTIVE_ENABLED earlier in the include chain
* Adds the Planck EZ, 3737 RGB, fixes out-of-tune notes
* fix bug in quantum/rgb_matrix_drivers.c
Co-Authored-By: jackhumbert <jack.humb@gmail.com>
* update command setting to the correct default
* correct rgb config
* remove commented-out lines
* update docs for the 3737
* Update docs/feature_rgb_matrix.md
Co-Authored-By: jackhumbert <jack.humb@gmail.com>
Since combos keep local state about what keys have been previously pressed, when combos are layered, multiple keypresses will register for any key with multiple combos assigned to it. In order to fix this, I switched process_combo to use a global keycode / keyrecord register and timer. When a keypress is consumed by a combo, it gets stored in the register and the timer is updated; when the next keypress takes too long or a key is pressed that isn't part of any combo, the buffer is emitted and the timer reset. This has a few side effects. For instance, I couldn't _not_ fix combo keys printing out of order while also fixing this bug, so combo keys print in order correctly when a combo fails. since combos no longer have local timers, the logic around when combos time out has changed. now that there is a single timer pressing any combo key (including one in a different combo) will reset the timer for all combos, making combo entry a little more lenient. Since combos no longer have local keycode / keyrecord state, there is an edge case where incomplete combo keys can be consumed. if you have a combo for a+s = tab and a combo for b+n = space, if you press a+b+n, only a space will be emitted. This is because when b+n completes successfully, it drops the register.
* Refactor 4x4 in line with current ps2avrgb template
* Add backlight pwm bodge till #4324 lands
* Disable bootmagic lite as it seems to not work on atmega32a/bootloadHID
* remove unneeded uart setting
* use pragma once everywhere
* remove custom matrix support
* fixup readme
* set bootmagic to lite
* remove dependency on custom i2c code
* use the right header files and function calls
* remove bootmagic support as it doesn't work on bmc boards
* readme merge artifacts removal
* pragma once it all
* put amnesia's name everywhere
* fixup readme
* remove custom matrix
* remove unneccessary configs
* disable bootmagic
* remove custom i2c in favor of i2c_master
* fix rgb led num
* add in rgb underglow support
* Refactor jj40 in line with current ps2avrgb template
* Disable bootmagic lite as it seems to not work on atmega32a/bootloadHID
* Add backlight pwm bodge till #4324 lands
* Increase planck keymap compatibility
* use pragma once
* modified readme with maintainer info
* remove rev1 for the time being
* QMK Configurator support for 60_ansi and 60_ansi_split_bs_rshift
* add hhkb layout and QMK Configurator support
* fix compile issue due to missing DEVICE_VER
* use a saner and less complicated default layout
* remove unused file
* fix up LAYOUT_all and formatting along with QKM Configurator support
* turn on bootmagic lite as the hardware reset switch isn't in a standard position
* remove default folder
* Added Waldo keyboard base files and default keymap
* Updated Waldo files and added keymap for split shift and split backspace
* Updated meta-data for the Waldo board
* Apply suggestions from code review
Committing suggestions for real this time.
Co-Authored-By: That-Canadian <Poole.Chris.11@gmail.com>
* Made suggested changes that were not explicitly made.
* Add keyboard Signum 3.0 for the elite-c
* Update readme.md
* Remove unused macros
* Use bootmagic lite instead of full
* Add warning to keymap.c that it's auto-generate
* Add description for customizing keyboard layouts
* Make generate_km.py executable
* Make right shift available in numpad layer
* Update keyboards/signum/3_0/elitec/readme.md
Co-Authored-By: jceb <jceb@e-jc.de>
* Update keyboards/signum/3_0/elitec/readme.md
Co-Authored-By: jceb <jceb@e-jc.de>
* Fix typo in symbol name
* remove dependency on custom i2c code
* missed a pragma once
* fix readme install instructions
* config.h cleanup
* make the bootmagic key not the same bmc reset key
* disable bootmagic functionality as it doesn't seem to work on atmega32a bmc boards
* remove custom i2c code in favor of QMK i2c_master
* clean up config file
* fix pyusb install instructions
* fix naming in usbconfig.h
* disable bootmagic as it does not work for bmc boards
* Update macros and keycode handling
- Update NUBS_Z macro so it repeats when held down
- Number row now uses numpad keycodes if Right Alt is being held
- coding conventions and formatting update
- switched to four-space indent
- reformatted a block comment
* Update readme files
* remove unneeded uart setting
* use pragma once everywhere
* remove custom matrix support
* fixup readme
* set bootmagic to lite
* remove dependency on custom i2c code
* use the right header files and function calls
* On i2c_init, enable two wire interface, twi interrupt, and slave
address ACK along with pull up resistors.
* thanks to some testing by drashna, we know that setting TWI doesn't work for all boards. Putting the new code into an ifdef block
* Add new keyboard: NQG
* Delete .gitignore
.gitignore removed
Originally used to ignore .DS_Store files from being committed.
* Changed Maintainer information
Maintainer link now points to a github account.
* Add customizable tapping terms
* Add Documentation
* Fix function
* Fixes
* It's not a pointer
* Add debugging output
* Update documentation to be at least vaguely accurate
* Use `get_tapping_term(tapping_key.event)` instead
`e` doesn't include column and row information, properly. It registers as 255, regardless of the actual keypress.
However `tapping_key.event` actually gives the correct column and row information. It appears be the correct structure to use.
In fact, it looks like the issue is that `e` is actually the "TICK" structure, as defined in keyboard.h
* Use variable tapping term value rather than define
* Silly drashna - tapping_key.event, not event
* add get_event_keycode() function
* Fix typo
Co-Authored-By: drashna <drashna@live.com>
* Remove post_process_record_quantum since it's the wrong PR
* Update quantum/quantum.c
Co-Authored-By: drashna <drashna@live.com>
* Better handle ifdef statement for permissive hold
Since we can't be sure that tapping term is actually 500
* Update quantum.c comments based on feedback
* Clean up get_tapping_term function
Clean up function so that users don't need to call the event function, and instead only check the keycode
* Add ability to run functionality on and off
* Make ifdef's more compact
* initial commit of budget96
* non logic changes
* add my name to readme
* update matrix.c
* make the matrix representation of the layout macro
* fix up LAYOUT macro
* add missing character
* initial keymap commit
* put KC_NO where they belong
* basic keymap
* fix matrix row and col definition
* The diagram I was sent and the pins used I was sent were in opposite order from each other. This should fix the issues
* update the readme
* change up manufacturer for budget96
* update copyright date
* fix up the switch matrix and provide a keymap
* forgot the keymap
* other matrix fixes
* missing a few keys in the switch matrix
* messed up the row tracing
* tweak keymap a bit
* use a lower case k
* fix spacing for markdown rendering
* put in the reset key documentation
* clean up the file a little
* use LAYOUT_96_ansi
* add a second layer for lighting controls
* add in lighting support
* add QMK Configurator support
* use pragma once
* remove un needed matrix.c
* convert to GPIO methods
* turn on rgblight_enable and get rid of custom matrix
* set bootloadhid_bootloader to 1
* set bootmagic to lite and set it to k50
* add reset information to readme
* use i2c_master instead of custom i2c
* restore the custom i2c code
* introduce reset key and eep_rst in function layer 1
* fix up pip3 install commands
* fix up device and manufacturer names
* remove un needed comments
* add an ALL layout macro along with QMK Configurator support
* move budget96 into donutcables directory since he actually has different boards
* add a short donut cables blurb taken from his website
* update readme for make instructions to point to the new path
* Update keyboards/donutcables/budget96/config.h
Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com>
* Update keyboards/donutcables/budget96/readme.md
Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com>
* Update keyboards/donutcables/budget96/info.json
Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com>
* turn on backlight
* Update keyboards/donutcables/budget96/readme.md
Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com>
* remove extra UART and BOOTLOADER settings that are not needed
* Added first configuration for handwired hacked motosped keyboard
* Added first keymap
* Fixed h file key layout
* Swapped Y and Z in default keymap
* Added name, email and description
* Moved hacked motospeed keyboard to handwired
* Changed make command in readme
* Formatted readme to be displayed properly with markdown
* Formatted keymap and layout to better reflect the physical keyboard
* Fixed info.json
* Update keyboards/handwired/hacked_motospeed/info.json
Co-Authored-By: Deckweiss <Deckweiss75@gmail.com>
* Removed .directory from .gitignore
Co-Authored-By: Deckweiss <Deckweiss75@gmail.com>
* Minor changes and cleanup
* Update keyboards/handwired/hacked_motospeed/hacked_motospeed.h
Added back newline needed for properly parsing
Co-Authored-By: Deckweiss <Deckweiss75@gmail.com>
* Adding new keymap folder for goadmaster
* add switch break
* zeal60 rgb backlight files
* modified for red caps lock key
* Remove return statement
* Files removed
* Add new RGB options
* Back to original file
* Keyboard: add treeadstone48
* rename layout defines
* Use of pragma once
* move common include code
* fixed info.json
* change keymap layout from kc to normal
* fix alpha revision keymap
* fixed info.json
* remove USE_Link_Time_Optimization
* Initial portover of the doro68.json with corrected column pins.
* Initial setup of LAYOUT_ansi and it's use in the default keymap.
* Added F keys to default kemap on layer 1.
* Added split space (and everything else) layout and a base keymap to be updated.
* Renamed split_space to multi.
* Changed product_id for doro.
* Created a basic doro LAYOUT_iso and default keymap.
* Copied over basic layout and keymap.
* Added readme.md for doro67 multi.
* Removed basic keyboad layout and keymap because it's a separate PCB.
* Added backlight controls to the various keymaps.
* Added explicit backlight pin define.
* Increased number of backlight levels for flexibility.
* Removed unnecessary line slashes and unified keymcaps.
* Corrected ISO layout and switched position with multi.
* Added keymap readme.md files.
* Corrected ISO keymap.
* Added Layouts to info.json for toolbox.
* Re-added slashes as they were necessary here...
* Corrected info.json/keymap discreptancies.
* Updated copyright messages (and fixed small readme error).
* Added missing line break spaces in readme.md
Co-Authored-By: ShadeDream <nick@shadedream.com>
* Keymap alignments on default_multi readme.md
Co-Authored-By: ShadeDream <nick@shadedream.com>
* Keymap alignments on default_multi readme.md
Co-Authored-By: ShadeDream <nick@shadedream.com>
* Keymap alignments on default_multi readme.md
Co-Authored-By: ShadeDream <nick@shadedream.com>
* Small alignment adjustment on the default keymap readme.md
Co-Authored-By: ShadeDream <nick@shadedream.com>
* use pragma once where applicable
* remove ?
* update default keymap readme
* remove un need include
* update readme with newbs guide
* set underglow and backlight to be on by default, and explicitly set them to no for the default keymap to handle the non Polestar case.
* put mine and benlyall's name in the code
* update readme
* port Massdrop CTRL/ALT to use RGB Matrix
Co-authored-by: Matt Schneeberger <helluvamatt@gmail.com>
* Massdrop lighting support working
This commit is to get the Massdrop lighting code working again through use of the compilation define USE_MASSDROP_CONFIGURATOR added to a keymap's rules.mk.
Added keymaps for both CTRL and ALT named default_md and mac_md. These should be used if the Massdrop style lighting is desired.
* Updating config based on testing results with patrickmt & compile errors
* Updates for PR5328
For CTRL and ALT:
Moved location of new RGB Matrix macros from config_led.h to config.h.
Added RGB_MATRIX_LED_FLUSH_LIMIT (time between flushes) to config.h for correct LED driver update timing.
Re-added missing breathing code for when Massdrop configurator mode is defined.
* remove prilik keymap form PR
* Implemented Eager Per Row debouncing algorithm.
Good for when fingers can only press one row at a time (e.g. when keyboard is wired so that "rows" are vertical)
* Added documentation for eager_pr
* Ported ergodox_ez to eager_pr debouncing.
* Removed check for changes in matrix_scan.
* Added further clarification in docs.
* Accidental merge with ergodox_ez
* Small cleanup in eager_pr
* Forgot to debounce_init - this would probably cause seg-faults.
* first [ass at pulling out common duck library functions
* use new library in jetfire
* use new library in duck lightsaver
* use new library in octagon v2
* put Device into the library
* refactor send_value
* refactor send_value and send_color
* use pragma once
* use pragma once
* use pragma once
* use pragma once
* rename backlight_led to indicator_leds to match with other duck boards
* rename enum
* make #define names consistent
* rename ducklib to duck_led
* update rules.mk ?= to =
* put rgb in the correct order
* add debounce debugging printouts
* turn on bootmagic lite and set it to the top left most key commonly programmed as Escape
* add reset key documentation
* fix that typo
* Update keyboards/duck/duck_led/duck_led.c
Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com>
* include the correct library
* initial commit
* get rid of some of the vanilla cookie cutter code
* Put in the matrix size and the pins
* add LAYOUT macro and a suitable keymap
* Add QMK Configurator support
* set bootmagic to lite
* put a RESET key into the default keymap
* edit kyuu readme file for description and quantrik.com link
* Update keyboards/quantrik/kyuu/config.h
Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com>
* fix captilization of keyboard name
* fix keymap wrapping issue and add MO key
* preserve RESET key location
* use one of the macros
* RGB Matrix overhaul
Breakout of animations to separate files
Integration of optimized int based math lib
Overhaul of rgb_matrix.c and animations for performance
* Updating effect function api for future extensions
* Combined the keypresses || keyreleases define checks into a single define so I stop forgetting it where necessary
* Moving define RGB_MATRIX_KEYREACTIVE_ENABLED earlier in the include chain
* Add tennie
* Jacobs Functions
* Switch back to normal layout
* Remove define from old template
* Fix broken keymaps
* Correct style errors, add bootlite
* Update readmes. Rename test keymap
* Missed comma
* Switch rgb from init to post init
Added Fantasie Impromptu and Nocturne Op. 9 No. 1 in B flat minor by Chopin
Added Isabella's Lullaby from The Promised Neverland
Added Renai Circulation and Platinum Disco from Monogatari
Added Terra's theme from Final Fantasy 6
* Updated iris, planck, and xd75 keymaps
* Added brightness down and up to commented layout of Symbol layer.
* updated config files for planck and iris
* removed unnecessary include lines from iris and planck config files
* updated XD75's PC layer and its NAVPC toggle layer
* fixed typo in alias declaration for C_BSPS
* changed alias names for BSPC toggle keys
The other bépo layouts were a bit too complex/weird or without LED code
and hard to transition to for new users. This config is a good base for
bépo users.
* Updated iris, planck, and xd75 keymaps
* Added brightness down and up to commented layout of Symbol layer.
* updated config files for planck and iris
* removed unnecessary include lines from iris and planck config files
@@ -8,8 +8,17 @@ Our users, contributors, and collaborators are expected to treat each other with
* The use of sexualized language or imagery
* Unwelcome advances, sexual or otherwise
* Deliberate intimidation, stalking, or following
* Insults or derogatory comments, or personal or political attacks
* Publishing others’ private information without explicit permission
* Sustained disruption of talks or other events
* Other conduct which could reasonably be considered inappropriate in a professional setting
* Advocating for, or encouraging, any of the above behaviour
If someone is violating this Code of Conduct you may email hello@qmk.fm to bring your concern to the Members. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
# Reporting
If someone is violating this Code of Conduct, please email hello@qmk.fm or reach out to one of the Collaborators to bring it to our attention. All complaints will be reviewed and investigated.
QMK will seek to use the least punitive means available to resolve an issue. If the circumstances require asking an offender to leave, we will do that.
Reports will be taken and kept in strict confidence. You will not be required to confront an offender directly.
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.
This document marks the inaugural Breaking Change merge. A list of changes follows.
## Core code formatting with clang-format
* All core files (`drivers/`, `quantum/`, `tests/`, and `tmk_core/`) have been formatted with clang-format
* A travis process to reformat PR's on merge has been instituted
* You can use the new CLI command `qmk cformat` to format before submitting your PR if you wish.
## LUFA USB descriptor cleanup
* Some code cleanups related to the USB HID descriptors on AVR keyboards, to make them easier to read and understand
* More information: see https://github.com/qmk/qmk_firmware/pull/4871
* No behaviour changes anticipated and no keymaps modified
## Migrating `ACTION_LAYER_MOMENTARY()` entries in `fn_actions` to `MO()` keycodes
*`fn_actions` is deprecated, and its functionality has been superseded by direct keycodes and `process_record_user()`
* The end result of removing this obsolete feature should result in a decent reduction in firmware size and code complexity
* All keymaps affected are recommended to switch away from `fn_actions` in favour of the [custom keycode](https://docs.qmk.fm/#/custom_quantum_functions) and [macro](https://docs.qmk.fm/#/feature_macros) features
## Update Atreus to current code conventions
* Duplicate include guards have bypassed the expected header processing behavior
* All keymaps affected are recommended to remove duplication of `<keyboard>/config.h` to `<keyboard>/keymaps/<user>/config.h` and only provide overrides at the keymap level
## Backport changes to keymap language files from ZSA fork
* Fixes an issue in the `keymap_br_abnt2.h` file that includes the wrong source (`keymap_common.h` instead of `keymap.h`)
* Updates the `keymap_swedish.h` file to be specific to swedish, and not just "nordic" in general.
* Any keymaps using this will need to remove `NO_*` and replace it with `SE_*`.
## Update repo to use LUFA as a git submodule
*`/lib/LUFA` removed from the repo
* LUFA set as a submodule, pointing to qmk/lufa
* This should allow more flexibility with LUFA, and allow us to keep the sub-module up to date, a lot more easily. It was ~2 years out of date with no easy path to fix that. This prevents that from being an issue in the future
## Migrating `ACTION_BACKLIGHT_*()` entries in `fn_actions` to `BL_` keycodes
*`fn_actions` is deprecated, and its functionality has been superseded by direct keycodes and `process_record_user()`
* All keymaps using these actions have had the relevant `KC_FN*` keys replaced with the equivalent `BL_*` keys
* If you currently use `KC_FN*` you will need to replace `fn_actions` with the [custom keycode](https://docs.qmk.fm/#/custom_quantum_functions) and [macro](https://docs.qmk.fm/#/feature_macros) features
## Remove `KC_DELT` alias in favor of `KC_DEL`
*`KC_DELT` was a redundant, undocumented alias for `KC_DELETE`
* It has been removed and all its uses replaced with the more common `KC_DEL` alias
* Around 90 keymaps (mostly for ErgoDox boards) have been modified as a result
QMK (*Quantum Mechanical Keyboard*) is an open source community that maintains QMK Firmware, QMK Toolbox, qmk.fm, and these docs. QMK Firmware is a keyboard firmware based on the [tmk\_keyboard](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). It has also been ported to ARM chips using ChibiOS. You can use it to power your own hand-wired or custom keyboard PCB.
## How to Get It
If you plan on contributing a keymap, keyboard, or features to QMK, the easiest thing to do is [fork the repo through Github](https://github.com/qmk/qmk_firmware#fork-destination-box), and clone your repo locally to make your changes, push them, then open a [Pull Request](https://github.com/qmk/qmk_firmware/pulls) from your fork.
Otherwise, you can either download it directly ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), or clone it via git (`git@github.com:qmk/qmk_firmware.git`), or https (`https://github.com/qmk/qmk_firmware.git`).
## How to Compile
Before you are able to compile, you'll need to [install an environment](getting_started_build_tools.md) for AVR or/and ARM development. Once that is complete, you'll use the `make` command to build a keyboard and keymap with the following notation:
make planck/rev4:default
This would build the `rev4` revision of the `planck` with the `default` keymap. Not all keyboards have revisions (also called subprojects or folders), in which case, it can be omitted:
make preonic:default
## How to Customize
QMK has lots of [features](features.md) to explore, and a good deal of [reference documentation](http://docs.qmk.fm) to dig through. Most features are taken advantage of by modifying your [keymap](keymap.md), and changing the [keycodes](keycodes.md).
This page describes how to setup debugging for ARM MCUs using an SWD adapter and open-source/free tools. In this guide we will install GNU MCU Eclipse IDE for C/C++ Developers and OpenOCD together with all the necessary dependencies.
This guide is catered towards advance users and assumes you can compile an ARM compatible keyboard on your machine using the MAKE flow.
## Installing the software
The main objective here is to get the MCU Eclipse IDE correctly installed on our machine. The necessary instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide.
### The xPack Manager
This tool is a software package manager and it is used to help us get the necessary dependencies.
XPM runs using Node.js so grab that from [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the installation was successful.
XPM installation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version.
### The ARM Toolchain
Using XPM it is very easy to install the ARM toolchain. Enter the command `xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc`.
### Windows build tools
If you are using windows you need to install this!
Now it's time to install your programmer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere.
If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufacturer of your tool.
### OpenOCD
This dependency allows SWD access from GDB and it is essential for debugging. Run `xpm install --global @gnu-mcu-eclipse/openocd`.
### Java
Java is needed by Eclipse so please download it from [here](https://www.oracle.com/technetwork/java/javase/downloads/index.html).
### GNU MCU Eclipse IDE
Now its finally time to install the IDE. Use the Release page [here](https://github.com/gnu-mcu-eclipse/org.eclipse.epp.packages/releases/) to get the latest version.
## Configuring Eclipse
Open up the Eclipse IDE we just downloaded. To import our QMK directory select File -> Import -> C/C++ -> Existing code as Makefile Project. Select next and use Browse to select your QMK folder. In the tool-chain list select ARM Cross GCC and select Finish.
Now you can see the QMK folder on the left hand side. Right click it and select Properties. On the left hand side, expand MCU and select ARM Toolchain Paths. Press xPack and OK. Repeat for OpenOCD Path and if you are on windows for Build Tool Path. Select Apply and Close.
Now its time to install the necessary MCU packages. Go to Packs perspective by selecting Window -> Open Perspective -> Others -> Packs. Now select the yellow refresh symbol next to the Packs tab. This will take a long time as it is requesting the MCU definitions from various places. If some of the links fail you can probably select Ignore.
When this finishes you must find the MCU which we will be building/debugging for. In this example I will be using the STM32F3 series MCUs. On the left, select STMicroelectonics -> STM32F3 Series. On the middle window we can see the pack. Right click and select Install. Once that is done we can go back to the default perspective, Window -> Open Perspective -> Others -> C/C++.
We need to let eclipse know the device we intent to build QMK on. Right click on the QMK folder -> Properties -> C/C++ Build -> Settings. Select the Devices tab and under devices select the appropriate variant of your MCU. For my example it is STM32F303CC
While we are here let's setup the build command as well. Select C/C++ Build and then the Behavior tab. On the build command, replace `all` with your necessary make command. For example for a rev6 Planck with the default keymap this would be `planck/rev6:default`. Select Apply and Close.
## Building
If you have setup everything correctly pressing the hammer button should build the firmware for you and a .bin file should appear.
## Debugging
### Connecting the Debugger
ARM MCUs use the Single Wire Debug (SWD) protocol which comprises of the clock (SWCLK) signal and the data (SWDIO) signal. Connecting this two wires and ground should be enough to allow full manipulation of the MCU. Here we assume that the keyboard will be powered though USB. The RESET signal is not necessary as we can manually assert it using the reset button. For a more advance setup, the SWO signal can be used which pipes printf and scanf asynchronously to the host but for our setup we will ignore it.
NOTE: Make sure the SWCLK and SWDIO pins are not used in the matrix of your keyboard. If they are you can temporarily switch them for some other pins.
### Configuring the Debugger
Right click on your QMK folder, select Debug As -> Debug Configuration. Here double click on GDB OpenOCD Debugging. Select the debugger tab and enter the configuration necessary for your MCU. This might take some fiddling and googleing to find out. The default script for the STM32F3 is called stm32f3discovery.cfg. To let OpenOCD know, in the Config options enter `-f board/stm32f3discovery.cfg`.
NOTE: In my case this configuration script requires editing to disable the reset assertion. The locations of the scripts can be found in the actual executable field usually under the path `openocd/version/.content/scripts/board`. Here I edited `reset_config srst_only` to `reset_config none`.
Select Apply and Close.
### Running the Debugger.
Reset your keyboard.
Press the bug icon and if all goes well you should soon find yourself in the debug perspective. Here the program counter will pause at the beginning of the main function and way for you to press Play. Most of the features of all debuggers work on ARM MCUs but for exact details google is your friend!
A QMK collaborator is a keyboard maker or designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users and customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements:
* **Have a PCB available for sale.** Unfortunately there's just too much variation and complications with handwired keyboards.
* **Maintain your keyboard in QMK.** This may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core that might break or render any custom code redundant.
* **Approve and merge keymap pull requests for your keyboard.** We like to encourage users to contribute their keymaps for others to see and work from when creating their own.
If you feel you meet these requirements, shoot us an email at hello@qmk.fm with an introduction and some links to your keyboard!
This document describes QMK's Breaking Change process. A Breaking Change is any change which modifies how QMK behaves in a way that in incompatible or potentially dangerous. We limit these changes so that users can have confidence that updating their QMK tree will not break their keymaps.
The breaking change period is when we will merge PR's that change QMK in dangerous or unexpected ways. There is a built-in period of testing so we are confident that any problems caused are rare or unable to be predicted.
## What has been included in past Breaking Changes?
* [2019 Aug 30](ChangeLog/20190830.md)
## When is the next Breaking Change?
The next Breaking Change is scheduled for Nov 29.
### Important Dates
* [x] 2019 Sep 21 - `future` is created. It will be rebased weekly.
* [ ] 2019 Nov 01 - `future` closed to new PR's.
* [ ] 2019 Nov 01 - Call for testers.
* [ ] 2019 Nov 27 - `master` is locked, no PR's merged.
* [ ] 2019 Nov 29 - Merge `future` to `master`.
* [ ] 2019 Nov 30 - `master` is unlocked. PR's can be merged again.
## 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.
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.
Criteria for acceptance:
* PR is complete and ready to merge
* PR has a ChangeLog
# Checklists
This section documents various processes we use when running the Breaking Changes process.
## Rebase `future` from `master`
This is run every Friday while `future` is open.
Process:
```
cd qmk_firmware
git checkout master
git pull --ff-only
git checkout future
git rebase master
git push --force
```
## Creating the `future` branch
This happens immediately after the previous `future` branch is merged.
*`qmk_firmware` git commands
* [ ]`git checkout master`
* [ ]`git pull --ff-only`
* [ ]`git checkout -b future`
* [ ] Edit `readme.md`
* [ ] Add a big notice at the top that this is a testing branch.
* [ ] Include a link to this document
* [ ]`git commit -m 'Branch point for <DATE> Breaking Change'`
* [ ]`git tag breakpoint_<YYYY>_<MM>_<DD>`
* [ ]`git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
* [ ]`git push origin future`
* [ ]`git push --tags`
## 4 Weeks Before Merge
*`future` is now closed to new PR's, only fixes for current PR's may be merged
* Post call for testers
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 1 Week Before Merge
* Announce that master will be closed from <2DaysBefore> to <DayofMerge>
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 2 Days Before Merge
* Announce that master is closed for 2 days
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## Day Of Merge
*`qmk_firmware` git commands
* [ ]`git checkout future`
* [ ]`git pull --ff-only`
* [ ]`git rebase origin/master`
* [ ] Edit `readme.md`
* [ ] Remove the notes about `future`
* [ ] Roll up the ChangeLog into one file.
* [ ]`git commit -m 'Merge point for <DATE> Breaking Change'`
This page describes how to setup and use the QMK CLI.
# Overview
The QMK CLI makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
* [Global CLI](#global-cli)
* [Local CLI](#local-cli)
* [CLI Commands](#cli-commands)
# Requirements
The CLI requires Python 3.5 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt).
# Global CLI
QMK provides an installable CLI that can be used to setup your QMK build environment, work with QMK, and which makes working with multiple copies of `qmk_firmware` easier. We recommend installing and updating this periodically.
## Install Using Homebrew (macOS, some Linux)
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
```
brew tap qmk/qmk
brew install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
## Install Using easy_install or pip
If your system is not listed above you can install QMK manually. First ensure that you have python 3.5 (or later) installed and have installed pip. Then install QMK with this command:
```
pip3 install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
## Packaging For Other Operating Systems
We are looking for people to create and maintain a `qmk` package for more operating systems. If you would like to create a package for your OS please follow these guidelines:
* Follow best practices for your OS when they conflict with these guidelines
* Document why in a comment when you do deviate
* Install using a virtualenv
* Instruct the user to set the environment variable `QMK_HOME` to have the firmware source checked out somewhere other than `~/qmk_firmware`.
# Local CLI
If you do not want to use the global CLI there is a local CLI bundled with `qmk_firmware`. You can find it in `qmk_firmware/bin/qmk`. You can run the `qmk` command from any directory and it will always operate on that copy of `qmk_firmware`.
**Example**:
```
$ ~/qmk_firmware/bin/qmk hello
Ψ Hello, World!
```
## Local CLI Limitations
There are some limitations to the local CLI compared to the global CLI:
* The local CLI does not support `qmk setup` or `qmk clone`
* The local CLI always operates on the same `qmk_firmware` tree, even if you have multiple repositories cloned.
* The local CLI does not run in a virtualenv, so it's possible that dependencies will conflict
# CLI Commands
## `qmk compile`
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm> or compile keymaps in the repo.
**Usage for Configurator Exports**:
```
qmk compile <configuratorExport.json>
```
**Usage for Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
## `qmk cformat`
This command formats C code using clang-format. Run it with no arguments to format all core code, or pass filenames on the command line to run it on specific files.
**Usage**:
```
qmk cformat [file1] [file2] [...] [fileN]
```
## `qmk config`
This command lets you configure the behavior of QMK. For the full `qmk config` documentation see [CLI Configuration](cli_configuration.md).
Configuration for QMK CLI is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set.
## Simple Example
As an example let's look at the command `qmk compile --keyboard clueboard/66/rev4 --keymap default`.
There are two command line arguments that could be read from configuration instead:
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
Now I can run `qmk compile` without specifying my keyboard and keymap each time.
## Setting User Defaults
Sometimes you want to share a setting between multiple commands. For example, multiple commands take the argument `--keyboard`. Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument.
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
# CLI Documentation (`qmk config`)
The `qmk config` command is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form:
<subcommand|general|default>[.<key>][=<value>]
## Setting Configuration Values
You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full `<section>.<key>` form.
Example:
```
$ qmk config default.keymap=default
default.keymap: None -> default
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Reading Configuration Values
You can read configuration values for the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value.
### Entire Configuration Example
qmk config
### Whole Section Example
qmk config compile
### Single Key Example
qmk config compile.keyboard
### Multiple Keys Example
qmk config user compile.keyboard compile.keymap
## Deleting Configuration Values
You can delete a configuration value by setting it to the special string `None`.
Example:
```
$ qmk config default.keymap=None
default.keymap: default -> None
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Multiple Operations
You can combine multiple read and write operations into a single command. They will be executed and displayed in order:
This document has useful information for developers wishing to write new `qmk` subcommands.
# Overview
The QMK CLI operates using the subcommand pattern made famous by git. The main `qmk` script is simply there to setup the environment and pick the correct entrypoint to run. Each subcommand is a self-contained module with an entrypoint (decorated by `@cli.subcommand()`) that performs some action and returns a shell returncode, or None.
# Subcommands
[MILC](https://github.com/clueboard/milc) is the CLI framework `qmk` uses to handle argument parsing, configuration, logging, and many other features. It lets you focus on writing your tool without wasting your time writing glue code.
Subcommands in the local CLI are always found in `qmk_firmware/lib/python/qmk/cli`.
Let's start by looking at an example subcommand. This is `lib/python/qmk/cli/hello.py`:
```python
"""QMK Python Hello World
This is an example QMK CLI script.
"""
frommilcimportcli
@cli.argument('-n','--name',default='World',help='Name to greet.')
@cli.subcommand('QMK Hello World.')
defhello(cli):
"""Log a friendly greeting.
"""
cli.log.info('Hello, %s!',cli.config.hello.name)
```
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
# User Interaction
MILC and the QMK CLI have several nice tools for interacting with the user. Using these standard tools will allow you to colorize your text for easier interactions, and allow the user to control when and how that information is displayed and stored.
## Printing Text
There are two main methods for outputting text in a subcommand- `cli.log` and `cli.echo()`. They operate in similar ways but you should prefer to use `cli.log.info()` for most general purpose printing.
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.5/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
You should never use the format operator (`%`) directly, always pass values as arguments.
### Logging (`cli.log`)
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
Sometimes you simply need to print text outside of the log system. This is appropriate if you are outputting fixed data or writing out something that should never be logged. Most of the time you should prefer `cli.log.info()` over `cli.echo`.
### Colorizing Text
You can colorize the output of your text by including color tokens within text. Use color to highlight, not to convey information. Remember that the user can disable color, and your subcommand should still be usable if they do.
You should generally avoid setting the background color, unless it's integral to what you are doing. Remember that users have a lot of preferences when it comes to their terminal color, so you should pick colors that work well against both black and white backgrounds.
Colors prefixed with 'fg' will affect the foreground (text) color. Colors prefixed with 'bg' will affect the background color.
There are also control sequences that can be used to change the behavior of
ANSI output:
| Control Sequences | Description |
|-------------------|-------------|
| {style_bright} | Make the text brighter |
| {style_dim} | Make the text dimmer |
| {style_normal} | Make the text normal (neither `{style_bright}` nor `{style_dim}`) |
| {style_reset_all} | Reset all text attributes to default. (This is automatically added to the end of every string.) |
| {bg_reset} | Reset the background color to the user's default |
| {fg_reset} | Reset the foreground color to the user's default |
# Arguments and Configuration
QMK handles the details of argument parsing and configuration for you. When you add a new argument it is automatically incorporated into the config tree based on your subcommand's name and the long name of the argument. You can access this configuration in `cli.config`, using either attribute-style access (`cli.config.<subcommand>.<argument>`) or dictionary-style access (`cli.config['<subcommand>']['<argument>']`).
Under the hood QMK uses [ConfigParser](https://docs.python.org/3/library/configparser.html) to store configurations. This gives us an easy and straightforward way to represent the configuration in a human-editable way. We have wrapped access to this configuration to provide some nicities that ConfigParser does not normally have.
## Reading Configuration Values
You can interact with `cli.config` in all the ways you'd normally expect. For example the `qmk compile` command gets the keyboard name from `cli.config.compile.keyboard`. It does not need to know whether that value came from the command line, an environment variable, or the configuration file.
You can set configuration values in the usual ways.
Dictionary style:
```
cli.config['<section>']['<key>'] = <value>
```
Attribute style:
```
cli.config.<section>.<key> = <value>
```
## Deleting Configuration Values
You can delete configuration values in the usual ways.
Dictionary style:
```
del(cli.config['<section>']['<key>'])
```
Attribute style:
```
del(cli.config.<section>.<key>)
```
## Writing The Configuration File
The configuration is not written out when it is changed. Most commands do not need to do this. We prefer to have the user change their configuration deliberitely using `qmk config`.
You can use `cli.save_config()` to write out the configuration.
## Excluding Arguments From Configuration
Some arguments should not be propagated to the configuration file. These can be excluded by adding `arg_only=True` when creating the argument.
Example:
```
@cli.argument('-o', '--output', arg_only=True, help='File to write to')
Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines:
* We indent using four (4) spaces (soft tabs)
* We use a modified One True Brace Style
* Opening Brace: At the end of the same line as the statement that opens the block
* Closing Brace: Lined up with the first character of the statement that opens the block
* Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line.
* Optional Braces: Always include optional braces.
* Good: if (condition) { return false; }
* Bad: if (condition) return false;
* We encourage use of C style comments: `/* */`
* Think of them as a story describing the feature
* Use them liberally to explain why particular decisions were made.
* Do not write obvious comments
* If you not sure if a comment is obvious, go ahead and include it.
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
* We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`)
* We accept both forms of preprocessor if's: `#ifdef DEFINED` and `#if defined(DEFINED)`
* If you are not sure which to prefer use the `#if defined(DEFINED)` form.
* Do not change existing code from one style to the other, except when moving to a multiple condition `#if`.
* Do not put whitespace between `#` and `if`.
* When deciding how (or if) to indent directives keep these points in mind:
* Readability is more important than consistency.
* Follow the file's existing style. If the file is mixed follow the style that makes sense for the section you are modifying.
* When choosing to indent you can follow the indention level of the surrounding C code, or preprocessor directives can have their own indent level. Choose the style that best communicates the intent of your code.
Here is an example for easy reference:
```c
/* Enums for foo */
enumfoo_state{
FOO_BAR,
FOO_BAZ,
};
/* Returns a value */
intfoo(void){
if(some_condition){
returnFOO_BAR;
}else{
return-1;
}
}
```
# Auto-formatting with clang-format
[Clang-format](https://clang.llvm.org/docs/ClangFormat.html) is part of LLVM and can automatically format your code for you, because ain't nobody got time to do it manually. We supply a configuration file for it that applies most of the coding conventions listed above. It will only change whitespace and newlines, so you will still have to remember to include optional braces yourself.
Use the [full LLVM installer](http://llvm.org/builds/) to get clang-format on Windows, or use `sudo apt install clang-format` on Ubuntu.
If you run it from the command-line, pass `-style=file` as an option and it will automatically find the .clang-format configuration file in the QMK root directory.
If you use VSCode, the standard C/C++ plugin supports clang-format, alternatively there is a [separate extension](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat) for it.
Some things (like LAYOUT macros) are destroyed by clang-format, so either don't run it on those files, or wrap the sensitive code in `// clang-format off` and `// clang-format on`.
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
* We target Python 3.5 for compatability with all supported platforms.
* We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments
* Think of them as a story describing the feature
* Use them liberally to explain why particular decisions were made.
* Do not write obvious comments
* If you not sure if a comment is obvious, go ahead and include it.
* We require useful docstrings for all functions.
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
* Some of our practices conflict with the wider python community to make our codebase more approachable to non-pythonistas.
# YAPF
You can use [yapf](https://github.com/google/yapf) to style your code. We provide a config in [setup.cfg](setup.cfg).
# Imports
We don't have a hard and fast rule for when to use `import ...` vs `from ... import ...`. Understandability and maintainability is our ultimate goal.
Generally we prefer to import specific function and class names from a module to keep code shorter and easier to understand. Sometimes this results in a name that is ambiguous, and in such cases we prefer to import the module instead. You should avoid using the "as" keyword when importing, unless you are importing a compatability module.
Imports should be one line per module. We group import statements together using the standard python rules- system, 3rd party, local.
Do not use `from foo import *`. Supply a list of objects you want to import instead, or import the whole module.
## Import Examples
Good:
```
from qmk import effects
effects.echo()
```
Bad:
```
from qmk.effects import echo
echo() # It's unclear where echo comes from
```
Good:
```
from qmk.keymap import compile_firmware
compile_firmware()
```
OK, but the above is better:
```
import qmk.keymap
qmk.keymap.compile_firmware()
```
# Statements
One statement per line.
Even when allowed (EG `if foo: bar`) we do not combine 2 statements onto a single line.
Function names, variable names, and filenames should be descriptive; eschew abbreviation. In particular, do not use abbreviations that are ambiguous or unfamiliar to readers outside your project, and do not abbreviate by deleting letters within a word.
Always use a .py filename extension. Never use dashes.
## Names to Avoid
* single character names except for counters or iterators. You may use "e" as an exception identifier in try/except statements.
* dashes (-) in any package/module name
* __double_leading_and_trailing_underscore__ names (reserved by Python)
# Docstrings
To maintain consistency with our docstrings we've set out the following guidelines.
* Use markdown formatting
* Always use triple-dquote docstrings with at least one linebreak: `"""\n"""`
* First line is a short (<70char)descriptionofwhatthefunctiondoes
QMK is nearly infinitely configurable. Wherever possible we err on the side of allowing users to customize their keyboard, even at the expense of code size. That level of flexibility makes for a daunting configuration experience, however.
There are two main types of configuration files in QMK- `config.h` and `rules.mk`. These files exist at various levels in QMK and all files of the same type are combined to build the final configuration. The levels, from lowest priority to highest priority, are:
* QMK Default
* Keyboard
* Folders (Up to 5 levels deep)
* Keymap
## QMK Default
Every available setting in QMK has a default. If that setting is not set at the Keyboard, Folder, or Keymap level this is the setting that will be used.
## Keyboard
This level contains config options that should apply to the whole keyboard. Some settings won't change in revisions, or most keymaps. Other settings are merely defaults for this keyboard and can be overridden by folders and/or keymaps.
## Folders
Some keyboards have folders and sub-folders to allow for different hardware configurations. Most keyboards only go 1 folder deep, but QMK supports structures up to 5 folders deep. Each folder can have its own `config.h` and `rules.mk` files that are incorporated into the final configuration.
## Keymap
This level contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
# The `config.h` File
This is a C header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere. The `config.h` file shouldn't be including other `config.h` files, or anything besides this:
#include "config_common.h"
## Hardware Options
*`#define VENDOR_ID 0x1234`
* defines your VID, and for most DIY projects, can be whatever you want
*`#define PRODUCT_ID 0x5678`
* defines your PID, and for most DIY projects, can be whatever you want
*`#define DEVICE_VER 0`
* defines the device version (often used for revisions)
* COL2ROW or ROW2COL - how your matrix is configured. COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows.
* key combination that allows the use of magic commands (useful for debugging)
*`#define USB_MAX_POWER_CONSUMPTION 500`
* sets the maximum power (in mA) over USB for the device (default: 500)
*`#define USB_POLLING_INTERVAL_MS 10`
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
*`#define F_SCL 100000L`
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
## Features That Can Be Disabled
If you define these options you will disable the associated feature, which can save on code size.
*`#define NO_DEBUG`
* disable debugging
*`#define NO_PRINT`
* disable printing/debugging using hid_listen
*`#define NO_ACTION_LAYER`
* disable layers
*`#define NO_ACTION_TAPPING`
* disable tap dance and other tapping features
*`#define NO_ACTION_ONESHOT`
* disable one-shot modifiers
*`#define NO_ACTION_MACRO`
* disable old style macro handling: MACRO() & action_get_macro
*`#define NO_ACTION_FUNCTION`
* disable calling of action_function() from the fn_actions array (deprecated)
## Features That Can Be Enabled
If you define these options you will enable the associated feature, which may increase your code size.
*`#define FORCE_NKRO`
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
*`#define STRICT_LAYER_RELEASE`
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
## Behaviors That Can Be Configured
*`#define TAPPING_TERM 200`
* how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
*`#define TAPPING_TERM_PER_KEY`
* enables handling for per key `TAPPING_TERM` settings
*`#define RETRO_TAPPING`
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
* See [Retro Tapping](feature_advanced_keycodes.md#retro-tapping) for details
*`#define TAPPING_TOGGLE 2`
* how many taps before triggering the toggle
*`#define PERMISSIVE_HOLD`
* makes tap and hold keys trigger the hold if another key is pressed before releasing, even if it hasn't hit the `TAPPING_TERM`
* See [Permissive Hold](feature_advanced_keycodes.md#permissive-hold) for details
*`#define IGNORE_MOD_TAP_INTERRUPT`
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the `TAPPING_TERM` for both keys.
* See [Mod tap interrupt](feature_advanced_keycodes.md#ignore-mod-tap-interrupt) for details
*`#define TAPPING_FORCE_HOLD`
* makes it possible to use a dual role key as modifier shortly after having been tapped
* See [Hold after tap](feature_advanced_keycodes.md#tapping-force-hold)
* Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle)
*`#define LEADER_TIMEOUT 300`
* how long before the leader key times out
* If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped.
*`#define LEADER_PER_KEY_TIMING`
* sets the timer for leader key chords to run on each key press rather than overall
*`#define LEADER_KEY_STRICT_KEY_PROCESSING`
* Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`.
*`#define ONESHOT_TIMEOUT 300`
* how long before oneshot times out
*`#define ONESHOT_TAP_TOGGLE 2`
* how many taps before oneshot toggle is triggered
*`#define QMK_KEYS_PER_SCAN 4`
* Allows sending more than one key per scan. By default, only one key event gets
sent via `process_record()` per scan. This has little impact on most typing, but
if you're doing a lot of chords, or your scan rate is slow to begin with, you can
have some delay in processing key events. Each press and release is a separate
event. For a keyboard with 1ms or so scan times, even a very fast typist isn't
going to produce the 500 keystrokes a second needed to actually get more than a
few ms of delay from this. But if you're doing chording on something with 3-4ms
scan times? You probably want this.
*`#define COMBO_COUNT 2`
* Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature.
*`#define COMBO_TERM 200`
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
*`#define TAP_CODE_DELAY 100`
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
*`#define TAP_HOLD_CAPS_DELAY 80`
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
## RGB Light Configuration
*`#define RGB_DI_PIN D7`
* pin the DI on the WS2812 is hooked-up to
*`#define RGBLIGHT_ANIMATIONS`
* run RGB animations
*`#define RGBLED_NUM 12`
* number of LEDs
*`#define RGBLIGHT_SPLIT`
* Needed if both halves of the board have RGB LEDs wired directly to the RGB output pin on the controllers instead of passing the output of the left half to the input of the right half
*`#define RGBLED_SPLIT { 6, 6 }`
* number of LEDs connected that are directly wired to `RGB_DI_PIN` on each half of a split keyboard
* First value indicates number of LEDs for left half, second value is for the right half
* When RGBLED_SPLIT is defined, RGBLIGHT_SPLIT is implicitly defined.
*`#define RGBLIGHT_HUE_STEP 12`
* units to step when in/decreasing hue
*`#define RGBLIGHT_SAT_STEP 25`
* units to step when in/decreasing saturation
*`#define RGBLIGHT_VAL_STEP 12`
* units to step when in/decreasing value (brightness)
*`#define RGBW_BB_TWI`
* bit-bangs TWI to EZ RGBW LEDs (only required for Ergodox EZ)
## Mouse Key Options
*`#define MOUSEKEY_INTERVAL 20`
*`#define MOUSEKEY_DELAY 0`
*`#define MOUSEKEY_TIME_TO_MAX 60`
*`#define MOUSEKEY_MAX_SPEED 7`
*`#define MOUSEKEY_WHEEL_DELAY 0`
## Split Keyboard Options
Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk
*`SPLIT_TRANSPORT = custom`
* Allows replacing the standard split communication routines with a custom one. ARM based split keyboards must use this at present.
### Setting Handedness
One thing to remember, the side that the USB port is plugged into is always the master half. The side not plugged into USB is the slave.
There are a few different ways to set handedness for split keyboards (listed in order of precedence):
1. Set `SPLIT_HAND_PIN`: Reads a pin to determine handedness. If pin is high, it's the left side, if low, the half is determined to be the right side
2. Set `EE_HANDS` and flash `eeprom-lefthand.eep`/`eeprom-righthand.eep` to each half
* For boards with DFU bootloader you can use `:dfu-split-left`/`:dfu-split-right` to flash these EEPROM files
* For boards with Caterina bootloader (like stock Pro Micros), use `:avrdude-split-left`/`:avrdude-split-right`
* For boards with ARM DFU bootloader (like Proton C), use `:dfu-util-split-left`/`:dfu-util-split-right`
3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default)
4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half
#### Defines for handedness
*`#define SPLIT_HAND_PIN B7`
* For using high/low pin to determine handedness, low = right hand, high = left hand. Replace `B7` with the pin you are using. This is optional, and if you leave `SPLIT_HAND_PIN` undefined, then you can still use the EE_HANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses.
*`#define EE_HANDS` (only works if `SPLIT_HAND_PIN` is not defined)
* Reads the handedness value stored in the EEPROM after `eeprom-lefthand.eep`/`eeprom-righthand.eep` has been flashed to their respective halves.
*`#define MASTER_RIGHT`
* Master half is defined to be the right half.
### Other Options
*`#define USE_I2C`
* For using I2C instead of Serial (defaults to serial)
*`#define SOFT_SERIAL_PIN D0`
* When using serial, define this. `D0` or `D1`,`D2`,`D3`,`E6`.
*`#define MATRIX_ROW_PINS_RIGHT { <row pins> }`
*`#define MATRIX_COL_PINS_RIGHT { <col pins> }`
* If you want to specify a different pinout for the right half than the left half, you can define `MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT`. Currently, the size of `MATRIX_ROW_PINS` must be the same as `MATRIX_ROW_PINS_RIGHT` and likewise for the definition of columns.
* If you want to specify a different direct pinout for the right half than the left half, you can define `DIRECT_PINS_RIGHT`. Currently, the size of `DIRECT_PINS` must be the same as `DIRECT_PINS_RIGHT`.
*`#define RGBLED_SPLIT { 6, 6 }`
* See [RGB Light Configuration](#rgb-light-configuration)
*`#define SELECT_SOFT_SERIAL_SPEED <speed>` (default speed is 1)
* Sets the protocol speed when using serial communication
* Speeds:
* 0: about 189kbps (Experimental only)
* 1: about 137kbps (default)
* 2: about 75kbps
* 3: about 39kbps
* 4: about 26kbps
* 5: about 20kbps
*`#define SPLIT_USB_DETECT`
* Detect (with timeout) USB connection when delegating master/slave
* Default behavior for ARM
* Required for AVR Teensy
*`#define SPLIT_USB_TIMEOUT 2500`
* Maximum timeout when detecting master/slave when using `SPLIT_USB_DETECT`
# The `rules.mk` File
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
## Build Options
*`DEFAULT_FOLDER`
* Used to specify a default folder when a keyboard has more than one sub-folder.
*`FIRMWARE_FORMAT`
* Defines which format (bin, hex) is copied to the root `qmk_firmware` folder after building.
*`SRC`
* Used to add files to the compilation/linking list.
*`LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
## AVR MCU Options
*`MCU = atmega32u4`
*`F_CPU = 16000000`
*`ARCH = AVR8`
*`F_USB = $(F_CPU)`
*`OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT`
*`BOOTLOADER = atmel-dfu` with the following options:
*`atmel-dfu`
*`lufa-dfu`
*`qmk-dfu`
*`halfkay`
*`caterina`
*`bootloadHID`
*`USBasp`
## Feature Options
Use these to enable or disable building certain features. The more you have enabled the bigger your firmware will be, and you run the risk of building a firmware too large for your MCU.
*`BOOTMAGIC_ENABLE`
* Virtual DIP switch configuration
*`MOUSEKEY_ENABLE`
* Mouse keys
*`EXTRAKEY_ENABLE`
* Audio control and System control
*`CONSOLE_ENABLE`
* Console for debug
*`COMMAND_ENABLE`
* Commands for debug and configuration
*`COMBO_ENABLE`
* Key combo feature
*`NKRO_ENABLE`
* USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
*`AUDIO_ENABLE`
* Enable the audio subsystem.
*`RGBLIGHT_ENABLE`
* Enable keyboard underlight functionality
*`LEADER_ENABLE`
* Enable leader key chording
*`MIDI_ENABLE`
* MIDI controls
*`UNICODE_ENABLE`
* Unicode
*`BLUETOOTH_ENABLE`
* Legacy option to Enable Bluetooth with the Adafruit EZ-Key HID. See BLUETOOTH
*`BLUETOOTH`
* Current options are AdafruitEzKey, AdafruitBLE, RN42
*`SPLIT_KEYBOARD`
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
*`CUSTOM_MATRIX`
* Allows replacing the standard matrix scanning routine with a custom one.
*`DEBOUNCE_TYPE`
* Allows replacing the standard key debouncing routine with an alternative or custom one.
*`WAIT_FOR_USB`
* Forces the keyboard to wait for a USB connection to be established before it starts up
*`NO_USB_STARTUP_CHECK`
* Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
*`LINK_TIME_OPTIMIZATION_ENABLE`
= Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
## USB Endpoint Limitations
In order to provide services over USB, QMK has to use USB endpoints.
These are a finite resource: each microcontroller has only a certain number.
This limits what features can be enabled together.
If the available endpoints are exceeded, a build error is thrown.
The following features can require separate endpoints:
*`MOUSEKEY_ENABLE`
*`EXTRAKEY_ENABLE`
*`CONSOLE_ENABLE`
*`NKRO_ENABLE`
*`MIDI_ENABLE`
*`RAW_ENABLE`
*`VIRTSER_ENABLE`
In order to improve utilisation of the endpoints, the HID features can be combined to use a single endpoint.
By default, `MOUSEKEY`, `EXTRAKEY`, and `NKRO` are combined into a single endpoint.
The base keyboard functionality can also be combined into the endpoint,
by setting `KEYBOARD_SHARED_EP = yes`.
This frees up one more endpoint,
but it can prevent the keyboard working in some BIOSes,
as they do not implement Boot Keyboard protocol switching.
Combining the mouse also breaks Boot Mouse compatibility.
The mouse can be uncombined by setting `MOUSE_SHARED_EP = no` if this functionality is required.
👍🎉 First off, thanks for taking the time to read this and contribute! 🎉👍
Third-party contributions help us grow and improve QMK. We want to make the pull request and contribution process useful and easy for both contributors and maintainers. To this end we've put together some guidelines for contributors to help your pull request be accepted without major changes.
* [Project Overview](#project-overview)
* [Coding Conventions](#coding-conventions)
* [General Guidelines](#general-guidelines)
* [What does the Code of Conduct mean for me?](#what-does-the-code-of-conduct-mean-for-me)
## I Don't Want to Read This Whole Thing! I Just Have a Question!
If you'd like to ask questions about QMK you can do so on the [OLKB Subreddit](https://reddit.com/r/olkb) or on [Discord](https://discord.gg/Uq7gcHh).
Please keep these things in mind:
* It may take several hours for someone to respond to your question. Please be patient!
* Everyone involved with QMK is donating their time and energy. We don't get paid to work on or answer questions about QMK.
* Try to ask your question so it's as easy to answer as possible. If you're not sure how to do that these are some good guides:
QMK is largely written in C, with specific features and parts written in C++. It targets embedded processors found in keyboards, particularly AVR ([LUFA](http://www.fourwalledcubicle.com/LUFA.php)) and ARM ([ChibiOS](http://www.chibios.com)). If you are already well versed in Arduino programming you'll find a lot of the concepts and limitations familiar. Prior experience with Arduino is not required to successfully contribute to QMK.
<!-- FIXME: We should include a list of resources for learning C here. -->
# Where Can I Go for Help?
If you need help you can [open an issue](https://github.com/qmk/qmk_firmware/issues) or [chat on Discord](https://discord.gg/Uq7gcHh).
# How Do I Make a Contribution?
Never made an open source contribution before? Wondering how contributions work in QMK? Here's a quick rundown!
0. Sign up for a [GitHub](https://github.com) account.
1. Put together a keymap to contribute, [find an issue](https://github.com/qmk/qmk_firmware/issues) you are interested in addressing, or [a feature](https://github.com/qmk/qmk_firmware/issues?q=is%3Aopen+is%3Aissue+label%3Afeature) you would like to add.
2. Fork the repository associated with the issue to your GitHub account. This means that you will have a copy of the repository under `your-GitHub-username/qmk_firmware`.
3. Clone the repository to your local machine using `git clone https://github.com/github-username/repository-name.git`.
4. If you're working on a new feature consider opening an issue to talk with us about the work you're about to undertake.
5. Create a new branch for your fix using `git checkout -b branch-name-here`.
6. Make the appropriate changes for the issue you are trying to address or the feature that you want to add.
7. Use `git add insert-paths-of-changed-files-here` to add the file contents of the changed files to the "snapshot" git uses to manage the state of the project, also known as the index.
8. Use `git commit -m "Insert a short message of the changes made here"` to store the contents of the index with a descriptive message.
9. Push the changes to your repository on GitHub using `git push origin branch-name-here`.
10. Submit a pull request to [QMK Firmware](https://github.com/qmk/qmk_firmware/pull/new/master).
11. Title the pull request with a short description of the changes made and the issue or bug number associated with your change. For example, you can title an issue like so "Added more log outputting to resolve #4352".
12. In the description of the pull request explain the changes that you made, any issues you think exist with the pull request you made, and any questions you have for the maintainer. It's OK if your pull request is not perfect (no pull request is), the reviewer will be able to help you fix any problems and improve it!
13. Wait for the pull request to be reviewed by a maintainer.
14. Make changes to the pull request if the reviewing maintainer recommends them.
15. Celebrate your success after your pull request is merged!
# Coding Conventions
Most of our style is pretty easy to pick up on. If you are familiar with either C or Python you should not have too much trouble with our local styles.
We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making.
* Separate PRs into logical units. For example, do not submit one PR covering two separate features, instead submit a separate PR for each feature.
* Check for unnecessary whitespace with `git diff --check` before committing.
* Make sure your code change actually compiles.
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return any errors.
* Keyboards: Make sure that `make keyboard:all` does not return any errors.
* Core: Make sure that `make all` does not return any errors.
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
```
Adjust the fronzlebop for the kerpleplork
The kerpleplork was intermittently failing with error code 23. The root cause was the fronzlebop setting, which causes the kerpleplork to activate every N iterations.
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
```
!> **IMPORTANT:** If you would like to contribute a bugfix or improvement to user code, such as non-default keymaps, userspace and layouts, be sure to tag the original submitter of the code in your PR. Many users, regardless of skill level with Git and GitHub, may be confused or frustrated at their code being modified without their knowledge.
## Documentation
Documentation is one of the easiest ways to get started contributing to QMK. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren't sure where or how to jump in please [reach out for help](#where-can-i-go-for-help)!
You'll find all our documentation in the `qmk_firmware/docs` directory, or if you'd rather use a web based workflow you can click "Suggest An Edit" at the top of each page on http://docs.qmk.fm/.
When providing code examples in your documentation, try to observe naming conventions used elsewhere in the docs. For example, standardizing enums as `my_layers` or `my_keycodes` for consistency:
```c
enummy_layers{
_FIRST_LAYER,
_SECOND_LAYER
};
enummy_keycodes{
FIRST_LAYER=SAFE_RANGE,
SECOND_LAYER
};
```
## Keymaps
Most first-time QMK contributors start with their personal keymaps. We try to keep keymap standards pretty casual (keymaps, after all, reflect the personality of their creators) but we do ask that you follow these guidelines to make it easier for others to discover and learn from your keymap.
* Write a `readme.md` using [the template](documentation_templates.md).
* All Keymap PR's are squashed, so if you care about how your commits are squashed you should do it yourself
* Do not lump features in with keymap PR's. Submit the feature first and then a second PR for the keymap.
* Do not include `Makefile`s in your keymap folder (they're no longer used)
* Update copyrights in file headers (look for `%YOUR_NAME%`)
## Keyboards
Keyboards are the raison d'être for QMK. Some keyboards are community maintained, while others are maintained by the people responsible for making a particular keyboard. The `readme.md` should tell you who maintains a particular keyboard. If you have questions relating to a particular keyboard you can [Open An Issue](https://github.com/qmk/qmk_firmware/issues) and tag the maintainer in your question.
We also ask that you follow these guidelines:
* Write a `readme.md` using [the template](documentation_templates.md).
* Keep the number of commits reasonable or we will squash your PR
* Do not lump core features in with new keyboards. Submit the feature first and then submit a separate PR for the keyboard.
* Name `.c`/`.h` file after the immediate parent folder, eg `/keyboards/<kb1>/<kb2>/<kb2>.[ch]`
* Do not include `Makefile`s in your keyboard folder (they're no longer used)
* Update copyrights in file headers (look for `%YOUR_NAME%`)
## Quantum/TMK Core
Before you put a lot of work into building your new feature you should make sure you are implementing it in the best way. You can get a basic understanding of QMK by reading [Understanding QMK](understanding_qmk.md), which will take you on a tour of the QMK program flow. From here you should talk to us to get a sense of the best way to implement your idea. There are two main ways to do this:
* [Chat on Discord](https://discord.gg/Uq7gcHh)
* [Open an Issue](https://github.com/qmk/qmk_firmware/issues/new)
Feature and Bug Fix PR's affect all keyboards. We are also in the process of restructuring QMK. For this reason it is especially important for significant changes to be discussed before implementation has happened. If you open a PR without talking to us first please be prepared to do some significant rework if your choices do not mesh well with our planned direction.
Here are some things to keep in mind when working on your feature or bug fix.
* **Disabled by default** - memory is a pretty limited on most chips QMK supports, and it's important that current keymaps aren't broken, so please allow your feature to be turned **on**, rather than being turned off. If you think it should be on by default, or reduces the size of the code, please talk with us about it.
* **Compile locally before submitting** - hopefully this one is obvious, but things need to compile! Our Travis system will catch any issues, but it's generally faster for you to compile a few keyboards locally instead of waiting for the results to come back.
* **Consider revisions and different chip-bases** - there are several keyboards that have revisions that allow for slightly different configurations, and even different chip-bases. Try to make a feature supported in ARM and AVR, or automatically disabled on platforms it doesn't work on.
* **Explain your feature** - Document it in `docs/`, either as a new file or as part of an existing file. If you don't document it other people won't be able to benefit from your hard work.
We also ask that you follow these guidelines:
* Keep the number of commits reasonable or we will squash your PR
* Do not lump keyboards or keymaps in with core changes. Submit your core changes first.
* Write [Unit Tests](unit_testing.md) for your feature
* Follow the style of the file you are editing. If the style is unclear or there are mixed styles you should conform to the [coding conventions](#coding-conventions) above.
## Refactoring
To maintain a clear vision of how things are laid out in QMK we try to plan out refactors in-depth and have a collaborator make the changes. If you have an idea for refactoring, or suggestions, [open an issue](https://github.com/qmk/qmk_firmware/issues), we'd love to talk about how QMK can be improved.
# What Does the Code of Conduct Mean for Me?
Our [Code of Conduct](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.
For a lot of people a custom keyboard is about more than sending button presses to your computer. You want to be able to do things that are more complex than simple button presses and macros. QMK has hooks that allow you to inject code, override functionality, and otherwise customize how your keyboard behaves in different situations.
This page does not assume any special knowledge about QMK, but reading [Understanding QMK](understanding_qmk.md) will help you understand what is going on at a more fundamental level.
## A Word on Core vs Keyboards vs Keymap
We have structured QMK as a hierarchy:
* Core (`_quantum`)
* Keyboard/Revision (`_kb`)
* Keymap (`_user`)
Each of the functions described below can be defined with a `_kb()` suffix or a `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level.
When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` before executing anything else- otherwise the keymap level function will never be called.
# Custom Keycodes
By far the most common task is to change the behavior of an existing keycode or to create a new keycode. From a code standpoint the mechanism for each is very similar.
## Defining a New Keycode
The first step to creating your own custom keycode(s) is to enumerate them. This means both naming them and assigning a unique number to that keycode. Rather than limit custom keycodes to a fixed range of numbers QMK provides the `SAFE_RANGE` macro. You can use `SAFE_RANGE` when enumerating your custom keycodes to guarantee that you get a unique number.
Here is an example of enumerating 2 keycodes. After adding this block to your `keymap.c` you will be able to use `FOO` and `BAR` inside your keymap.
```c
enummy_keycodes{
FOO=SAFE_RANGE,
BAR
};
```
## Programming the Behavior of Any Keycode
When you want to override the behavior of an existing key, or define the behavior for a new key, you should use the `process_record_kb()` and `process_record_user()` functions. These are called by QMK during key processing before the actual key event is handled. If these functions return `true` QMK will process the keycodes as usual. That can be handy for extending the functionality of a key rather than replacing it. If these functions return `false` QMK will skip the normal key handling, and it will be up to you to send any key up or down events that are required.
These function are called every time a key is pressed or released.
### Example `process_record_user()` Implementation
This example does two things. It defines the behavior for a custom keycode called `FOO`, and it supplements our Enter key by playing a tone whenever it is pressed.
Call this function to get the last received LED state. This is useful for reading the LED state outside `led_set_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
For convenience, you can use the `IS_HOST_LED_ON(led_name)` and `IS_HOST_LED_OFF(led_name)` macros instead of calling and checking `host_keyboard_leds()` directly.
## Setting Physical LED State
Some keyboard implementations provide convenience methods for setting the state of the physical LEDs.
### Ergodox Boards
The Ergodox implementations provide `ergodox_right_led_1`/`2`/`3_on`/`off()` to turn individual LEDs on or off, as well as `ergodox_right_led_on`/`off(uint8_t led)` to turn them on or off by their index.
In addition, it is possible to specify the brightness level of all LEDs with `ergodox_led_all_set(uint8_t n)`; of individual LEDs with `ergodox_right_led_1`/`2`/`3_set(uint8_t n)`; or by index with `ergodox_right_led_set(uint8_t led, uint8_t n)`.
Ergodox boards also define `LED_BRIGHTNESS_LO` for the lowest brightness and `LED_BRIGHTNESS_HI` for the highest brightness (which is the default).
# Keyboard Initialization Code
There are several steps in the keyboard initialization process. Depending on what you want to do, it will influence which function you should use.
These are the three main initialization functions, listed in the order that they're called.
*`keyboard_pre_init_*` - Happens before most anything is started. Good for hardware setup that you want running very early.
*`matrix_init_*` - Happens midway through the firmware's startup process. Hardware is initialized, but features may not be yet.
*`keyboard_post_init_*` - Happens at the end of the firmware's startup process. This is where you'd want to put "customization" code, for the most part.
!> For most people, the `keyboard_post_init_user` function is what you want to call. For instance, this is where you want to set up things for RGB Underglow.
## Keyboard Pre Initialization code
This runs very early during startup, even before the USB has been started.
Shortly after this, the matrix is initialized.
For most users, this shouldn't be used, as it's primarily for hardware oriented initialization.
However, if you have hardware stuff that you need initialized, this is the best place for it (such as initializing LED pins).
### Example `keyboard_pre_init_user()` Implementation
This example, at the keyboard level, sets up B0, B1, B2, B3, and B4 as LED pins.
This is called when the matrix is initialized, and after some of the hardware has been set up, but before many of the features have been initialized.
This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependant on where it's started.
### `matrix_init_*` Function Documentation
* Keyboard/Revision: `void matrix_init_kb(void)`
* Keymap: `void matrix_init_user(void)`
## Keyboard Post Initialization code
This is ran as the very last task in the keyboard initialization process. This is useful if you want to make changes to certain features, as they should be initialized by this point.
### Example `keyboard_post_init_user()` Implementation
This example, running after everything else has initialized, sets up the rgb underglow configuration.
```c
voidkeyboard_post_init_user(void){
// Call the post init code.
rgblight_enable_noeeprom();// enables Rgb, without saving settings
rgblight_sethsv_noeeprom(180,255,255);// sets the color to teal/cyan without saving
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING+3);// sets mode to Fast breathing without saving
Whenever possible you should customize your keyboard by using `process_record_*()` and hooking into events that way, to ensure that your code does not have a negative performance impact on your keyboard. However, in rare cases it is necessary to hook into the matrix scanning. Be extremely careful with the performance of code in these functions, as it will be called at least 10 times per second.
### Example `matrix_scan_*` Implementation
This example has been deliberately omitted. You should understand enough about QMK internals to write this without an example before hooking into such a performance sensitive area. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/Uq7gcHh).
### `matrix_scan_*` Function Documentation
* Keyboard/Revision: `void matrix_scan_kb(void)`
* Keymap: `void matrix_scan_user(void)`
This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot.
You should use this function if you need custom matrix scanning code. It can also be used for custom status output (such as LEDs or a display) or other functionality that you want to trigger regularly even when the user isn't typing.
# Keyboard Idling/Wake Code
If the board supports it, it can be "idled", by stopping a number of functions. A good example of this is RGB lights or backlights. This can save on power consumption, or may be better behavior for your keyboard.
This is controlled by two functions: `suspend_power_down_*` and `suspend_wakeup_init_*`, which are called when the system board is idled and when it wakes up, respectively.
### Example suspend_power_down_user() and suspend_wakeup_init_user() Implementation
```c
voidsuspend_power_down_user(void){
rgb_matrix_set_suspend_state(true);
}
voidsuspend_wakeup_init_user(void){
rgb_matrix_set_suspend_state(false);
}
```
### Keyboard suspend/wake Function Documentation
* Keyboard/Revision: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
* Keymap: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
# Layer Change Code
This runs code every time that the layers get changed. This can be useful for layer indication, or custom layer handling.
### Example `layer_state_set_*` Implementation
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example
The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status)
# Persistent Configuration (EEPROM)
This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU.
* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated.
### Example Implementation
This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work!
In your keymap.c file, add this to the top:
```c
typedefunion{
uint32_traw;
struct{
boolrgb_layer_change:1;
};
}user_config_t;
user_config_tuser_config;
```
This sets up a 32 bit structure that we can store settings with in memory, and write to the EEPROM. Using this removes the need to define variables, since they're defined in this structure. Remember that `bool` (boolean) values use 1 bit, `uint8_t` uses 8 bits, `uint16_t` uses up 16 bits. You can mix and match, but changing the order can cause issues, as it will change the values that are read and written.
We're using `rgb_layer_change`, for the `layer_state_set_*` function, and use `keyboard_post_init_user` and `process_record_user` to configure everything.
Now, using the `keyboard_post_init_user` code above, you want to add `eeconfig_read_user()` to it, to populate the structure you've just created. And you can then immediately use this structure to control functionality in your keymap. And It should look like:
```c
voidkeyboard_post_init_user(void){
// Call the keymap level matrix init.
// Read the user config from EEPROM
user_config.raw=eeconfig_read_user();
// Set default layer, if enabled
if(user_config.rgb_layer_change){
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom_cyan();
rgblight_mode_noeeprom(1);
}
}
```
The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
This will cause the RGB underglow to be changed ONLY if the value was enabled. Now to configure this value, create a new keycode for `process_record_user` called `RGB_LYR`. Additionally, we want to make sure that if you use the normal RGB codes, that it turns off Using the example above, make it look this:
returnfalse;// Skip all further processing of this key
caseKC_ENTER:
// Play a tone when enter is pressed
if(record->event.pressed){
PLAY_NOTE_ARRAY(tone_qwerty);
}
returntrue;// Let QMK send the enter press/release events
caseRGB_LYR:// This allows me to use underglow as layer indication, or as normal
if(record->event.pressed){
user_config.rgb_layer_change^=1;// Toggles the status
eeconfig_update_user(user_config.raw);// Writes the new status to EEPROM
if(user_config.rgb_layer_change){// if layer state indication is enabled,
layer_state_set(layer_state);// then immediately update the layer color
}
}
returnfalse;break;
caseRGB_MODE_FORWARD...RGB_MODE_GRADIENT:// For any of the RGB codes (see quantum_keycodes.h, L400 for reference)
if(record->event.pressed){//This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
if(user_config.rgb_layer_change){// only if this is enabled
user_config.rgb_layer_change=false;// disable it, and
eeconfig_update_user(user_config.raw);// write the setings to EEPROM
}
}
returntrue;break;
default:
returntrue;// Process all other keycodes normally
}
}
```
And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EEP_RST` keycode or [Bootmagic](feature_bootmagic.md) functionallity. For example, if you want to set rgb layer indication by default, and save the default valued.
```c
voideeconfig_init_user(void){// EEPROM is getting reset!
user_config.raw=0;
user_config.rgb_layer_change=true;// We want this enabled by default
eeconfig_update_user(user_config.raw);// Write default value to EEPROM now
// use the non noeeprom versions, to write these values to EEPROM too
rgblight_enable();// Enable RGB by default
rgblight_sethsv_cyan();// Set it to CYAN by default
rgblight_mode(1);// set to solid by default
}
```
And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to.
### 'EECONFIG' Function Documentation
* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(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.
# Custom Tapping Term
By default, the tapping term is defined globally, and is not configurable by key. For most users, this is perfectly fine. But in come cases, dual function keys would be greatly improved by different timeouts 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 `TAPPING_TERM`.
To enable this functionality, you need to add `#define TAPPING_TERM_PER_KEY` to your `config.h`, first.
## 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_tget_tapping_term(uint16_tkeycode){
switch(keycode){
caseSFT_T(KC_SPC):
returnTAPPING_TERM+1250;
caseLT(1,KC_GRV):
return130;
default:
returnTAPPING_TERM;
}
}
```
### `get_tapping_term` 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 a user level function is useful here, so no need to mark it as such.
This page exists to document best practices when writing documentation for QMK. Following these guidelines will help to keep a consistent tone and style, which will in turn help other people more easily understand QMK.
# Page Opening
Your documentation page should generally start with an H1 heading, followed by a 1 paragraph description of what the user will find on this page. Keep in mind that this heading and paragraph will sit next to the Table of Contents, so keep the heading short and avoid long strings with no whitespace.
Example:
```
# My Page Title
This page covers my super cool feature. You can use this feature to make coffee, squeeze fresh oj, and have an egg mcmuffin and hashbrowns delivered from your local macca's by drone.
```
# Headings
Your page should generally have multiple "H1" headings. Only H1 and H2 headings will included in the Table of Contents, so plan them out appropriately. Excess width should be avoided in H1 and H2 headings to prevent the Table of Contents from getting too wide.
# Styled Hint Blocks
You can have styled hint blocks drawn around text to draw attention to it.
### Important
```
!> This is important
```
Renders as:
!> This is important
### General Tips
```
?> This is a helpful tip.
```
Renders as:
?> This is a helpful tip.
# Documenting Features
If you create a new feature for QMK, create a documentation page for it. It doesn't have to be very long, a few sentences describing your feature and a table listing any relevant keycodes is enough. Here is a basic template:
```markdown
# My Cool Feature
This page describes my cool feature. You can use my cool feature to make coffee and order cream and sugar to be delivered via drone.
## My Cool Feature Keycodes
|Long Name|Short Name|Description|
|---------|----------|-----------|
|KC_COFFEE||Make Coffee|
|KC_CREAM||Order Cream|
|KC_SUGAR||Order Sugar|
```
Place your documentation into `docs/feature_<my_cool_feature>.md`, and add that file to the appropriate place in `docs/_sidebar.md`. If you have added any keycodes be sure to add them to `docs/keycodes.md` with a link back to your feature page.
This page documents the templates you should use when submitting new Keymaps and Keyboards to QMK.
## Keymap `readme.md` Template
Most keymaps have an image depicting the layout. You can use [Keyboard Layout Editor](http://keyboard-layout-editor.com) to create an image. Upload it to [Imgur](http://imgur.com) or another hosting service, please do not include images in your Pull Request.
Below the image you should write a short description to help people understand your keymap.
Make example for this keyboard (after setting up your build environment):
make planck/rev4: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).
```
There needs to be two spaces at the end of the `Keyboard Maintainer` and `Hardware Supported` lines for it to render correctly with Markdown.
QMK presents itself to the host as a regular HID keyboard device, and as such requires no special drivers. However, in order to flash your keyboard on Windows, the bootloader device that appears when you reset the board often *does*.
There are two notable exceptions: the Caterina bootloader, usually seen on Pro Micros, and the Halfkay bootloader shipped with PJRC Teensys, appear as a serial port and a generic HID device respectively, and so do not require a driver.
We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have set up the development environment with Msys2 or WSL, the `qmk_install.sh` script will have asked if you want it to install the drivers for you.
## Installation
Put your keyboard into bootloader mode, either by hitting the `RESET` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic](feature_bootmagic.md) docs for more details). Some boards use [Command](feature_command.md) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
Some keyboards may have specific instructions for entering the bootloader. For example, the [Bootmagic Lite](feature_bootmagic.md#bootmagic-lite) key (default: Escape) might be on a different key, e.g. Left Control; or the magic combination for Command (default: Left Shift+Right Shift) might require you to hold something else, e.g. Left Control+Right Control. Refer to the board's README file if you are unsure.
To put a device in bootloader mode with USBaspLoader, tap the `RESET` button while holding down the `BOOT` button.
Alternatively, hold `BOOT` while inserting the USB cable.
Zadig will automatically detect the bootloader device. You may sometimes need to check **Options → List All Devices**.
- For keyboards with Atmel AVR MCUs, the bootloader will be named something similar to `ATm32U4DFU`, and have a Vendor ID of `03EB`.
- USBasp bootloaders will appear as `USBasp`, with a VID/PID of `16C0:05DC`.
- AVR keyboards flashed with the QMK-DFU bootloader will be named `<keyboard name> Bootloader` and will also have the VID `03EB`.
- For most ARM keyboards, it will be called `STM32 BOOTLOADER`, and have a VID/PID of `0483:DF11`.
!> If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is probably not in bootloader mode. The arrow will be colored orange and you will be asked to confirm modifying a system driver. **Do not** proceed if this is the case!
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. For flashing a USBaspLoader device via command line with msys2, the `libusbk` driver is recommended, otherwise `libusb-win32` will work fine if you are using QMK Toolbox for flashing.

Finally, unplug and replug the keyboard to make sure the new driver has been loaded. If you are using the QMK Toolbox to flash, exit and restart it too, as it can sometimes fail to recognize the driver change.
## Recovering from Installation to Wrong Device
If you find that you can no longer type with the keyboard, you may have installed the driver onto the keyboard itself instead of the bootloader. You can easily confirm this in Zadig - a healthy keyboard has the `HidUsb` driver installed on all of its interfaces:

Open the Device Manager and look for a device that looks like your keyboard.

Right-click it and hit **Uninstall device**. Make sure to tick **Delete the driver software for this device** first.

Click **Action → Scan for hardware changes**. At this point, you should be able to type again. Double check in Zadig that the keyboard device(s) are using the `HidUsb` driver. If so, you're all done, and your board should be functional again!
This page covers questions about building QMK. If you haven't yet done so, you should read the [Build Environment Setup](getting_started_build_tools.md) and [Make Instructions](getting_started_make_guide.md) guides.
## Can't Program on Linux
You will need proper permissions to operate a device. For Linux users, see the instructions regarding `udev` rules, below. If you have issues with `udev`, a work-around is to use the `sudo` command. If you are not familiar with this command, check its manual with `man sudo` or [see this webpage](https://linux.die.net/man/8/sudo).
An example of using `sudo`, when your controller is ATMega32u4:
$ sudo dfu-programmer atmega32u4 erase --force
$ sudo dfu-programmer atmega32u4 flash your.hex
$ sudo dfu-programmer atmega32u4 reset
or just:
$ sudo make <keyboard>:<keymap>:dfu
Note that running `make` with `sudo` is generally ***not*** a good idea, and you should use one of the former methods, if possible.
### Linux `udev` Rules
On Linux, you'll need proper privileges to access the MCU. You can either use
`sudo` when flashing firmware, or place these files in `/etc/udev/rules.d/`. Once added run the following:
### Serial device is not detected in bootloader mode on Linux
Make sure your kernel has appropriate support for your device. If your device uses USB ACM, such as
Pro Micro (Atmega32u4), make sure to include `CONFIG_USB_ACM=y`. Other devices may require `USB_SERIAL` and any of its sub options.
## Unknown Device for DFU Bootloader
Issues encountered when flashing keyboards on Windows are most often due to having the wrong drivers installed for the bootloader, or none at all.
Re-running the QMK installation script (`./util/qmk_install.sh` from the `qmk_firmware` directory in MSYS2 or WSL) or reinstalling the QMK Toolbox may fix the issue. Alternatively, you can download and run the [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) package manually.
If that doesn't work, then you may need to download and run Zadig. See [Bootloader Driver Installation with Zadig](driver_installation_zadig.md) for more detailed information.
## WINAVR is Obsolete
It is no longer recommended and may cause some problem.
See [TMK Issue #99](https://github.com/tmk/tmk_keyboard/issues/99).
## USB VID and PID
You can use any ID you want with editing `config.h`. Using any presumably unused ID will be no problem in fact except for very low chance of collision with other product.
Most boards in QMK use `0xFEED` as the vendor ID. You should look through other keyboards to make sure you pick a unique Product ID.
Also see this.
https://github.com/tmk/tmk_keyboard/issues/150
You can buy a really unique VID:PID here. I don't think you need this for personal use.
This is an issue with updating on brew, causing symlinks that avr-gcc depend on getting mangled.
The solution is to remove and reinstall all affected modules.
```
brew rm avr-gcc
brew rm dfu-programmer
brew rm dfu-util
brew rm gcc-arm-none-eabi
brew rm avrdude
brew install avr-gcc
brew install dfu-programmer
brew install dfu-util
brew install gcc-arm-none-eabi
brew install avrdude
```
### avr-gcc 8.1 and LUFA
If you updated your avr-gcc to above 7 you may see errors involving LUFA. For example:
`lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:380:5: error: 'const' attribute on function returning 'void'`
For now, you need to rollback avr-gcc to 7 in brew.
```
brew uninstall --force avr-gcc
brew install avr-gcc@8
brew link --force avr-gcc@8
```
### I just flashed my keyboard and it does nothing/keypresses don't register - it's also ARM (rev6 planck, clueboard 60, hs60v2, etc...) (Feb 2019)
Due to how EEPROM works on ARM based chips, saved settings may no longer be valid. This affects the default layers, and *may*, under certain circumstances we are still figuring out, make the keyboard unusable. Resetting the EEPROM will correct this.
[Planck rev6 reset EEPROM](https://cdn.discordapp.com/attachments/473506116718952450/539284620861243409/planck_rev6_default.bin) can be used to force an eeprom reset. After flashing this image, flash your normal firmware again which should restore your keyboard to _normal_ working order.
If bootmagic is enabled in any form, you should be able to do this too (see [Bootmagic docs](feature_bootmagic.md) and keyboard info for specifics on how to do this).
- DFU tools do /not/ allow you to write into the bootloader (unless
you throw in extra fruit salad of options), so there is little risk
there.
- EEPROM has around a 100000 write cycle. You shouldn't rewrite the
firmware repeatedly and continually; that'll burn the EEPROM
eventually.
## NKRO Doesn't work
First you have to compile firmware with this build option `NKRO_ENABLE` in **Makefile**.
Try `Magic`**N** command(`LShift+RShift+N` by default) when **NKRO** still doesn't work. You can use this command to toggle between **NKRO** and **6KRO** mode temporarily. In some situations **NKRO** doesn't work you need to switch to **6KRO** mode, in particular when you are in BIOS.
If your firmware built with `BOOTMAGIC_ENABLE` you need to turn its switch on by `BootMagic`**N** command(`Space+N` by default). This setting is stored in EEPROM and kept over power cycles.
Use `1UL<<16` instead of `1<<16` in `read_cols()` in [matrix.h] when your columns goes beyond 16.
In C `1` means one of [int] type which is [16 bit] in case of AVR so you can't shift left more than 15. You will get unexpected zero when you say `1<<16`. You have to use [unsigned long] type with `1UL`.
If you are using a TeensyUSB, there is a [known bug](https://github.com/qmk/qmk_firmware/issues/164) in which the hardware reset button prevents the RESET key from working. Unplugging the keyboard and plugging it back in should resolve the problem.
## Special Extra Key Doesn't Work (System, Audio Control Keys)
You need to define `EXTRAKEY_ENABLE` in `rules.mk` to use them in QMK.
```
EXTRAKEY_ENABLE = yes # Audio control and System control
```
## Wakeup from Sleep Doesn't Work
In Windows check `Allow this device to wake the computer` setting in Power **Management property** tab of **Device Manager**. Also check BIOS setting.
Pressing any key during sleep should wake host.
## Using Arduino?
**Note that Arduino pin naming is different from actual chip.** For example, Arduino pin `D0` is not `PD0`. Check circuit with its schematics yourself.
Arduino Leonardo and micro have **ATMega32U4** and can be used for TMK, though Arduino bootloader may be a problem.
## Enabling JTAG
By default, the JTAG debugging interface is disabled as soon as the keyboard starts up. JTAG-capable MCUs come from the factory with the `JTAGEN` fuse set, and it takes over certain pins of the MCU that the board may be using for the switch matrix, LEDs, etc.
If you would like to keep JTAG enabled, just add the following to your `config.h`:
```c
#define NO_JTAG_DISABLE
```
## Adding LED Indicators of Lock Keys
You need your own LED indicators for CapsLock, ScrollLock and NumLock? See this post.
## Problem on BIOS (UEFI)/Resume (Sleep & Wake)/Power Cycles
Some people reported their keyboard stops working on BIOS and/or after resume(power cycles).
As of now root of its cause is not clear but some build options seem to be related. In Makefile try to disable those options like `CONSOLE_ENABLE`, `NKRO_ENABLE`, `SLEEP_LED_ENABLE` and/or others.
[QMK](https://github.com/qmk), short for Quantum Mechanical Keyboard, is a group of people building tools for custom keyboards. We started with the [QMK firmware](https://github.com/qmk/qmk_firmware), a heavily modified fork of [TMK](https://github.com/tmk/tmk_keyboard).
## What Differences Are There Between QMK and TMK?
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert](https://github.com/jackhumbert)'s fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
From a technical standpoint QMK builds upon TMK by adding several new features. Most notably QMK has expanded the number of available keycodes and uses these to implement advanced features like `S()`, `LCTL()`, and `MO()`. You can see a complete list of these keycodes in [Keycodes](keycodes.md).
From a project and community management standpoint TMK maintains all the officially supported keyboards by himself, with a bit of community support. Separate community maintained forks exist or can be created for other keyboards. Only a few keymaps are provided by default, so users typically don't share keymaps with each other. QMK encourages sharing of both keyboards and keymaps through a centrally managed repository, accepting all pull requests that follow the quality standards. These are mostly community maintained, but the QMK team also helps when necessary.
Both approaches have their merits and their drawbacks, and code flows freely between TMK and QMK when it makes sense.
This page covers questions people often have about keymaps. If you haven't you should read [Keymap Overview](keymap.md) first.
## What Keycodes Can I Use?
See [Keycodes](keycodes.md) for an index of keycodes available to you. These link to more extensive documentation when available.
Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h).
## What Are the Default Keycodes?
There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here:
<!-- Source for this image: http://www.keyboard-layout-editor.com/#/gists/bf431647d1001cff5eff20ae55621e9a -->
QMK has two features, Bootmagic and Command, which allow you to change the behavior of your keyboard on the fly. This includes, but is not limited to, swapping Ctrl/Caps, disabling Gui, swapping Alt/Gui, swapping Backspace/Backslash, disabling all keys, and other behavioral modifications.
As a quick fix try holding down `Space`+`Backspace` while you plug in your keyboard. This will reset the stored settings on your keyboard, returning those keys to normal operation. If that doesn't work look here:
* [Bootmagic](feature_bootmagic.md)
* [Command](feature_command.md)
## The Menu Key Isn't Working
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when that key was invented there was already a key named `MENU` in the relevant standards, so MS chose to call that the `APP` key.
## `KC_SYSREQ` Isn't Working
Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.
See [issue #168](https://github.com/tmk/tmk_keyboard/issues/168) and
* http://en.wikipedia.org/wiki/Magic_SysRq_key
* http://en.wikipedia.org/wiki/System_request
## Power Keys Aren't Working
Somewhat confusingly, there are two "Power" keycodes in QMK: `KC_POWER` in the Keyboard/Keypad HID usage page, and `KC_SYSTEM_POWER` (or `KC_PWR`) in the Consumer page.
The former is only recognized on macOS, while the latter, `KC_SLEP` and `KC_WAKE` are supported by all three major operating systems, so it is recommended to use those instead. Under Windows, these keys take effect immediately, however on macOS they must be held down until a dialog appears.
## One Shot Modifier
Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. One Shot Shift mitigates this for me.
https://github.com/tmk/tmk_keyboard/issues/67
## Modifier/Layer Stuck
Modifier keys or layers can be stuck unless layer switching is configured properly.
For Modifier keys and layer actions you have to place `KC_TRANS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
This feature is for *mechanical lock switch* like [this Alps one](http://deskthority.net/wiki/Alps_SKCL_Lock). You can enable it by adding this to your `config.h`:
```
#define LOCKING_SUPPORT_ENABLE
#define LOCKING_RESYNC_ENABLE
```
After enabling this feature use keycodes `KC_LCAP`, `KC_LNUM` and `KC_LSCR` in your keymap instead.
Old vintage mechanical keyboards occasionally have lock switches but modern ones don't have. ***You don't need this feature in most case and just use keycodes `KC_CAPS`, `KC_NLCK` and `KC_SLCK`.***
## Input Special Characters Other Than ASCII like Cédille 'Ç'
NO UNIVERSAL METHOD TO INPUT THOSE WORKS OVER ALL SYSTEMS. You have to define **MACRO** in way specific to your OS or layout.
Unlike most Fn keys, the one on Apple keyboards actually has its own keycode... sort of. It takes the place of the sixth keycode in a basic 6KRO HID report -- so an Apple keyboard is in fact only 5KRO.
It is technically possible to get QMK to send this key. However, doing so requires modification of the report format to add the state of the Fn key.
Even worse, it is not recognized unless the keyboard's VID and PID match that of a real Apple keyboard. The legal issues that official QMK support for this feature may create mean it is unlikely to happen.
See [this issue](https://github.com/qmk/qmk_firmware/issues/2179) for detailed information.
## Media Control Keys in Mac OSX
#### KC_MNXT and KC_MPRV Does Not Work on Mac
Use `KC_MFFD`(`KC_MEDIA_FAST_FORWARD`) and `KC_MRWD`(`KC_MEDIA_REWIND`) instead of `KC_MNXT` and `KC_MPRV`.
See https://github.com/tmk/tmk_keyboard/issues/195
## Keys Supported in Mac OSX?
You can know which keycodes are supported in OSX from this source code.
Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
* Enable NFER Key on PC keyboard
* Enable XFER Key on PC keyboard
* Enable KATAKANA Key on PC keyboard
https://pqrs.org/osx/karabiner/seil.html
## RN-42 Bluetooth Doesn't Work with Karabiner
Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
See the [Grave Escape](feature_grave_esc.md) feature.
## Arrow on Right Modifier Keys with Dual-Role
This turns right modifier keys into arrow keys when the keys are tapped while still modifiers when the keys are hold. In TMK the dual-role function is dubbed **TAP**.
```
#include "keymap_common.h"
/* Arrow keys on right modifier keys with TMK dual role feature
`KC_EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+f`) on Mac mode but this is not same as Apple Eject keycode probably.
## What's `weak_mods` and `real_mods` in `action_util.c`
___TO BE IMPROVED___
real_mods is intended to retains state of real/physical modifier key state, while
weak_mods retains state of virtual or temporary modifiers which should not affect state real modifier key.
Let's say you hold down physical left shift key and type ACTION_MODS_KEY(LSHIFT, KC_A),
with weak_mods,
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
Your keymap can include keycodes that are more advanced than normal, for example keys that switch layers or send modifiers when held, but send regular keycodes when tapped. This page documents the functions that are available to you.
## Assigning Custom Names
People often define custom names using `#define`. For example:
```c
#define FN_CAPS LT(_FL, KC_CAPSLOCK)
#define ALT_TAB LALT(KC_TAB)
```
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
## Caveats
Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. If you need to apply modifiers to your tapped keycode, [Tap Dance](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
# Switching and Toggling Layers
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers). When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
*`DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
*`MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
*`LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `KC_`). These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
*`LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
*`OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](#one-shot-keys) for details and additional functionality.
*`TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
*`TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
*`TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
# Working with Layers
Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems.
## Beginners
If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
* In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
## Intermediate Users
Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off.
## Advanced Users
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
Sometimes, you might want to switch between layers in a macro or as part of a tap dance routine. `layer_on` activates a layer, and `layer_off` deactivates it. More layer-related functions can be found in [action_layer.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h).
# Modifier Keys
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|`LALT(kc)`|`A(kc)` |Hold Left Alt and press `kc` |
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
You can also chain them, for example `LCTL(LALT(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
# Mod-Tap
The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down.
The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`:
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## Caveats
Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored.
Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes.
To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly.
# One Shot Keys
One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys".
For example, if you define a key as `OSM(MOD_LSFT)`, you can type a capital A character by first pressing and releasing shift, and then pressing and releasing A. Your computer will see the shift key being held the moment shift is pressed, and it will see the shift key being released immediately after A is released.
One shot keys also work as normal modifiers. If you hold down a one shot key and type other keys, your one shot will be released immediately after you let go of the key.
Additionally, hitting keys five times in a short period will lock that key. This applies for both One Shot Modifiers and One Shot Layers, and is controlled by the `ONESHOT_TAP_TOGGLE` define.
You can control the behavior of one shot keys by defining these in `config.h`:
```c
#define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped once again. */
#define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */
```
*`OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](#mod-tap), not the `KC_*` codes.
*`OSL(layer)` - momentary switch to *layer*.
Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine.
For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`.
For one shot mods, you need to call `set_oneshot_mods(MOD)` to set it, or `clear_oneshot_mods()` to cancel it.
!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.
## Callbacks
When you'd like to perform custom logic when pressing a one shot key, there are several callbacks you can choose to implement. You could indicate changes in one shot keys by flashing an LED or making a sound, for example.
There is a callback for `OSM(mod)`. It is called whenever the state of any one shot modifier key is changed: when it toggles on, but also when it is toggled off. You can use it like this:
```c
voidoneshot_mods_changed_user(uint8_tmods){
if(mods&MOD_MASK_SHIFT){
println("Oneshot mods SHIFT");
}
if(mods&MOD_MASK_CTRL){
println("Oneshot mods CTRL");
}
if(mods&MOD_MASK_ALT){
println("Oneshot mods ALT");
}
if(mods&MOD_MASK_GUI){
println("Oneshot mods GUI");
}
if(!mods){
println("Oneshot mods off");
}
}
```
The `mods` argument contains the active mods after the change, so it reflects the current state.
When you use One Shot Tap Toggle (by adding `#define ONESHOT_TAP_TOGGLE 2` in your `config.h` file), you may lock a modifier key by pressing it the specified amount of times. There's a callback for that, too:
Last, there is also a callback for the `OSL(layer)` one shot key:
```c
voidoneshot_layer_changed_user(uint8_tlayer){
if(layer==1){
println("Oneshot layer 1 on");
}
if(!layer){
println("Oneshot layer off");
}
}
```
If any one shot layer is switched off, `layer` will be zero. When you're looking to do something on any layer change instead of one shot layer changes, `layer_state_set_user` is a better callback to use.
If you are making your own keyboard, there are also `_kb` equivalent functions:
```c
voidoneshot_locked_mods_changed_kb(uint8_tmods);
voidoneshot_mods_changed_kb(uint8_tmods);
voidoneshot_layer_changed_kb(uint8_tlayer);
```
As with any callback, be sure to call the `_user` variant to allow for further customizability.
# Tap-Hold Configuration Options
While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonal defaults, but that may still cause issues for some people.
These options let you modify the behavior of the Tap-Hold keys.
## Permissive Hold
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
```c
#define PERMISSIVE_HOLD
```
This makes tap and hold keys (like Mod Tap) work better for fast typist, or for high `TAPPING_TERM` settings.
If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the "tapping" function for both keys.
For Instance:
-`SFT_T(KC_A)` Down
-`KC_X` Down
-`KC_X` Up
-`SFT_T(KC_A)` Up
Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this will be registered as `ax` by the firmware and host system. With permissive hold enabled, this modifies how this is handled by considering the Mod Tap keys as a Mod if another key is tapped, and would registered as `X` (`SHIFT`+`x`).
?> 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`.
## Ignore Mod Tap Interrupt
To enable this setting, add this to your `config.h`:
```c
#define IGNORE_MOD_TAP_INTERRUPT
```
Similar to Permissive Hold, this alters how the firmware processes input for fast typist. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys.
Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod).
For Instance:
-`SFT_T(KC_A)` Down
-`KC_X` Down
-`SFT_T(KC_A)` Up
-`KC_X` Up
Normally, this would send `X` (`SHIFT`+`x`). With `Ignore Mod Tap Interrupt` enabled, holding both keys are required for the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold on both will still output `X` (`SHIFT`+`x`).
?> __Note__: This only concerns modifiers and not layer switching keys.
?> If you have `Permissive Hold` 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`.
## Tapping Force Hold
To enable `tapping force hold`, add the following to your `config.h`:
```c
#define TAPPING_FORCE_HOLD
```
When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key.
Example:
- SFT_T(KC_A) Down
- SFT_T(KC_A) Up
- SFT_T(KC_A) Down
- wait more than tapping term...
- SFT_T(KC_A) Up
With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto repeat function.
With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allowing to use it as a modifier shortly after having used it as a tap.
!> `TAPPING_FORCE_HOLD` will break anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tapping Toggle).
## Retro Tapping
To enable `retro tapping`, add the following to your `config.h`:
```c
#define RETRO_TAPPING
```
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.
Your keyboard can make sounds! If you've got a Planck, Preonic, or basically any AVR keyboard that allows access to certain PWM-capable pins, you can hook up a simple speaker and make it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
Up to two simultaneous audio voices are supported, one driven by timer 1 and another driven by timer 3. The following pins can be defined as audio outputs in config.h:
Timer 1:
`#define B5_AUDIO`
`#define B6_AUDIO`
`#define B7_AUDIO`
Timer 3:
`#define C4_AUDIO`
`#define C5_AUDIO`
`#define C6_AUDIO`
If you add `AUDIO_ENABLE = yes` to your `rules.mk`, there's a couple different sounds that will automatically be enabled without any other configuration:
```
STARTUP_SONG // plays when the keyboard starts up (audio.c)
GOODBYE_SONG // plays when you press the RESET key (quantum.c)
AG_NORM_SONG // plays when you press AG_NORM (quantum.c)
AG_SWAP_SONG // plays when you press AG_SWAP (quantum.c)
CG_NORM_SONG // plays when you press CG_NORM (quantum.c)
CG_SWAP_SONG // plays when you press CG_SWAP (quantum.c)
MUSIC_ON_SONG // plays when music mode is activated (process_music.c)
MUSIC_OFF_SONG // plays when music mode is deactivated (process_music.c)
CHROMATIC_SONG // plays when the chromatic music mode is selected (process_music.c)
GUITAR_SONG // plays when the guitar music mode is selected (process_music.c)
VIOLIN_SONG // plays when the violin music mode is selected (process_music.c)
MAJOR_SONG // plays when the major music mode is selected (process_music.c)
```
You can override the default songs by doing something like this in your `config.h`:
```c
#ifdef AUDIO_ENABLE
#define STARTUP_SONG SONG(STARTUP_SOUND)
#endif
```
A full list of sounds can be found in [quantum/audio/song_list.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/song_list.h) - feel free to add your own to this list! All available notes can be seen in [quantum/audio/musical_notes.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/musical_notes.h).
To play a custom sound at a particular time, you can define a song like this (near the top of the file):
```c
floatmy_song[][2]=SONG(QWERTY_SOUND);
```
And then play your song like this:
```c
PLAY_SONG(my_song);
```
Alternatively, you can play it in a loop like this:
```c
PLAY_LOOP(my_song);
```
It's advised that you wrap all audio features in `#ifdef AUDIO_ENABLE` / `#endif` to avoid causing problems when audio isn't built into the keyboard.
The available keycodes for audio are:
*`AU_ON` - Turn Audio Feature on
*`AU_OFF` - Turn Audio Feature off
*`AU_TOG` - Toggle Audio Feature state
!> These keycodes turn all of the audio functionality on and off. Turning it off means that audio feedback, audio clicky, music mode, etc. are disabled, completely.
## ARM Audio Volume
For ARM devices, you can adjust the DAC sample values. If your board is too loud for you or your coworkers, you can set the max using `DAC_SAMPLE_MAX` in your `config.h`:
```c
#define DAC_SAMPLE_MAX 65535U
```
## Music Mode
The music mode maps your columns to a chromatic scale, and your rows to octaves. This works best with ortholinear keyboards, but can be made to work with others. All keycodes less than `0xFF` get blocked, so you won't type while playing notes - if you have special keys/mods, those will still work. A work-around for this is to jump to a different layer with KC_NOs before (or after) enabling music mode.
Recording is experimental due to some memory issues - if you experience some weird behavior, unplugging/replugging your keyboard will fix things.
Keycodes available:
*`MU_ON` - Turn music mode on
*`MU_OFF` - Turn music mode off
*`MU_TOG` - Toggle music mode
*`MU_MOD` - Cycle through the music modes:
*`CHROMATIC_MODE` - Chromatic scale, row changes the octave
*`GUITAR_MODE` - Chromatic scale, but the row changes the string (+5 st)
*`VIOLIN_MODE` - Chromatic scale, but the row changes the string (+7 st)
*`MAJOR_MODE` - Major scale
In music mode, the following keycodes work differently, and don't pass through:
*`LCTL` - start a recording
*`LALT` - stop recording/stop playing
*`LGUI` - play recording
*`KC_UP` - speed-up playback
*`KC_DOWN` - slow-down playback
The pitch standard (`PITCH_STANDARD_A`) is 440.0f by default - to change this, add something like this to your `config.h`:
#define PITCH_STANDARD_A 432.0f
You can completely disable Music Mode as well. This is useful, if you're pressed for space on your controller. To disable it, add this to your `config.h`:
#define NO_MUSIC_MODE
### Music Mask
By default, `MUSIC_MASK` is set to `keycode < 0xFF` which means keycodes less than `0xFF` are turned into notes, and don't output anything. You can change this by defining this in your `config.h` like this:
#define MUSIC_MASK keycode != KC_NO
Which will capture all keycodes - be careful, this will get you stuck in music mode until you restart your keyboard!
For a more advanced way to control which keycodes should still be processed, you can use `music_mask_kb(keycode)` in `<keyboard>.c` and `music_mask_user(keycode)` in your `keymap.c`:
bool music_mask_user(uint16_t keycode) {
switch (keycode) {
case RAISE:
case LOWER:
return false;
default:
return true;
}
}
Things that return false are not part of the mask, and are always processed.
### Music Map
By default, the Music Mode uses the columns and row to determine the scale for the keys. For a board that uses a rectangular matrix that matches the keyboard layout, this is just fine. However, for boards that use a more complicated matrix (such as the Planck Rev6, or many split keyboards) this would result in a very skewed experience.
However, the Music Map option allows you to remap the scaling for the music mode, so it fits the layout, and is more natural.
To enable this feature, add `#define MUSIC_MAP` to your `config.h` file, and then you will want to add a `uint8_t music_map` to your keyboard's `c` file, or your `keymap.c`.
You will want to use whichever `LAYOUT` macro that your keyboard uses here. This maps it to the correct key location. Start in the bottom left of the keyboard layout, and move to the right, and then upwards. Fill in all the entries until you have a complete matrix.
You can look at the [Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e9ace1487887c1f8b4a7e8e6d87c322988bec9ce/keyboards/planck/planck.c#L24-L29) as an example of how to implement this.
## Audio Click
This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly.
*`CK_TOGG` - Toggles the status (will play sound if enabled)
*`CK_ON` - Turns on Audio Click (plays sound)
*`CK_OFF` - Turns off Audio Click (doesn't play sound)
*`CK_RST` - Resets the frequency to the default state (plays sound at default frequency)
*`CK_UP` - Increases the frequency of the clicks (plays sound at new frequency)
*`CK_DOWN` - Decreases the frequency of the clicks (plays sound at new frequency)
The feature is disabled by default, to save space. To enable it, add this to your `config.h`:
#define AUDIO_CLICKY
You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values:
| Option | Default Value | Description |
|--------|---------------|-------------|
| `AUDIO_CLICKY_FREQ_DEFAULT` | 440.0f | Sets the default/starting audio frequency for the clicky sounds. |
| `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). |
| `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the the highest frequency. Too high may result in coworkers attacking you. |
| `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. This is a multiplicative factor. The default steps the frequency up/down by a musical minor third. |
| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. |
| `AUDIO_CLICKY_DELAY_DURATION` | 1 | An integer note duration where 1 is 1/16th of the tempo, or a sixty-fourth note (see `quantum/audio/musical_notes.h` for implementation details). The main clicky effect will be delayed by this duration. Adjusting this to values around 6-12 will help compensate for loud switches. |
## MIDI Functionality
This is still a WIP, but check out `quantum/process_keycode/process_midi.c` to see what's happening. Enable from the Makefile.
Tap a key and you get its character. Tap a key, but hold it *slightly* longer
and you get its shifted state. Voilà! No shift key needed!
## Why Auto Shift?
Many people suffer from various forms of RSI. A common cause is stretching your
fingers repetitively long distances. For us on the keyboard, the pinky does that
all too often when reaching for the shift key. Auto Shift looks to alleviate that
problem.
## How Does It Work?
When you tap a key, it stays depressed for a short period of time before it is
then released. This depressed time is a different length for everyone. Auto Shift
defines a constant `AUTO_SHIFT_TIMEOUT` which is typically set to twice your
normal pressed state time. When you press a key, a timer starts and then stops
when you release the key. If the time depressed is greater than or equal to the
`AUTO_SHIFT_TIMEOUT`, then a shifted version of the key is emitted. If the time
is less than the `AUTO_SHIFT_TIMEOUT` time, then the normal state is emitted.
## Are There Limitations to Auto Shift?
Yes, unfortunately.
1. Key repeat will cease to work. For example, before if you wanted 20 'a'
characters, you could press and hold the 'a' key for a second or two. This no
longer works with Auto Shift because it is timing your depressed time instead
of emitting a depressed key state to your operating system.
2. You will have characters that are shifted when you did not intend on shifting, and
other characters you wanted shifted, but were not. This simply comes down to
practice. As we get in a hurry, we think we have hit the key long enough
for a shifted version, but we did not. On the other hand, we may think we are
tapping the keys, but really we have held it for a little longer than
anticipated.
## How Do I Enable Auto Shift?
Add to your `rules.mk` in the keymap folder:
AUTO_SHIFT_ENABLE = yes
If no `rules.mk` exists, you can create one.
Then compile and install your new firmware with Auto Key enabled! That's it!
## Modifiers
By default, Auto Shift is disabled for any key press that is accompanied by one or more
modifiers. Thus, Ctrl+A that you hold for a really long time is not the same
as Ctrl+Shift+A.
You can re-enable Auto Shift for modifiers by adding another rule to your `rules.mk`
AUTO_SHIFT_MODIFIERS = yes
In which case, Ctrl+A held past the `AUTO_SHIFT_TIMEOUT` will be sent as Ctrl+Shift+A
## Configuring Auto Shift
If desired, there is some configuration that can be done to change the
behavior of Auto Shift. This is done by setting various variables the
`config.h` file located in your keymap folder. If no `config.h` file exists, you can create one.
A sample is
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
#define AUTO_SHIFT_TIMEOUT 150
#define NO_AUTO_SHIFT_SPECIAL
#endif
### AUTO_SHIFT_TIMEOUT (Value in ms)
This controls how long you have to hold a key before you get the shifted state.
Obviously, this is different for everyone. For the common person, a setting of
135 to 150 works great. However, one should start with a value of at least 175, which
is the default value. Then work down from there. The idea is to have the shortest time required to get the shifted state without having false positives.
Play with this value until things are perfect. Many find that all will work well
at a given value, but one or two keys will still emit the shifted state on
occasion. This is simply due to habit and holding some keys a little longer
than others. Once you find this value, work on tapping your problem keys a little
quicker than normal and you will be set.
?> Auto Shift has three special keys that can help you get this value right very quick. See "Auto Shift Setup" for more details!
### NO_AUTO_SHIFT_SPECIAL (simple define)
Do not Auto Shift special keys, which include -\_, =+, [{, ]}, ;:, '", ,<, .>,
and /?
### NO_AUTO_SHIFT_NUMERIC (simple define)
Do not Auto Shift numeric keys, zero through nine.
### NO_AUTO_SHIFT_ALPHA (simple define)
Do not Auto Shift alpha characters, which include A through Z.
## Using Auto Shift Setup
This will enable you to define three keys temporarily to increase, decrease and report your `AUTO_SHIFT_TIMEOUT`.
Many keyboards support backlit keys by way of individual LEDs placed through or underneath the keyswitches. This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously install multiple different single coloured LEDs on a keyboard.
QMK is able to control the brightness of these LEDs by switching them on and off rapidly in a certain ratio, a technique known as *Pulse Width Modulation*, or PWM. By altering the duty cycle of the PWM signal, it creates the illusion of dimming.
The MCU can only supply so much current to its GPIO pins. Instead of powering the backlight directly from the MCU, the backlight pin is connected to a transistor or MOSFET that switches the power to the LEDs.
## Usage
Most keyboards have backlighting enabled by default if they support it, but if it is not working for you, check that your `rules.mk` includes the following:
```make
BACKLIGHT_ENABLE= yes
```
## Keycodes
Once enabled the following keycodes below can be used to change the backlight level.
All other pins will use software PWM. If the [Audio](feature_audio.md) feature is disabled or only using one timer, the backlight PWM can be triggered by a hardware timer:
|Audio Pin|Audio Timer|Software PWM Timer|
|---------|-----------|------------------|
|`C4` |Timer 3 |Timer 1 |
|`C5` |Timer 3 |Timer 1 |
|`C6` |Timer 3 |Timer 1 |
|`B5` |Timer 1 |Timer 3 |
|`B6` |Timer 1 |Timer 3 |
|`B7` |Timer 1 |Timer 3 |
When both timers are in use for Audio, the backlight PWM will not use a hardware timer, but will instead be triggered during the matrix scan. In this case, breathing is not supported, and the backlight might flicker, because the PWM computation may not be called with enough timing precision.
### AVR Configuration
To change the behavior of the backlighting, `#define` these in your `config.h`:
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 31 excluding off) |
|`BACKLIGHT_CAPS_LOCK`|*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|`BACKLIGHT_ON_STATE` |`0` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
### Backlight On State
Most backlight circuits are driven by an N-channel MOSFET or NPN transistor. This means that to turn the transistor *on* and light the LEDs, you must drive the backlight pin, connected to the gate or base, *high*.
Sometimes, however, a P-channel MOSFET, or a PNP transistor is used. In this case, when the transistor is on, the pin is driven *low* instead.
This functionality is configured at the keyboard level with the `BACKLIGHT_ON_STATE` define.
### Multiple backlight pins
Most keyboards have only one backlight pin which control all backlight LEDs (especially if the backlight is connected to an hardware PWM pin).
In software PWM, it is possible to define multiple backlight pins. All those pins will be turned on and off at the same time during the PWM duty cycle.
This feature allows to set for instance the Caps Lock LED (or any other controllable LED) brightness at the same level as the other LEDs of the backlight. This is useful if you have mapped LCTRL in place of Caps Lock and you need the Caps Lock LED to be part of the backlight instead of being activated when Caps Lock is on.
To activate multiple backlight pins, you need to add something like this to your user `config.h`:
```c
#define BACKLIGHT_LED_COUNT 2
#undef BACKLIGHT_PIN
#define BACKLIGHT_PINS { F5, B2 }
```
### Hardware PWM Implementation
When using the supported pins for backlighting, QMK will use a hardware timer configured to output a PWM signal. This timer will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the backlight pin will go low, and is pulled high again when the counter resets.
In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus the brightness, where `0x0000` is completely off and `0xFFFF` is completely on.
The breathing effect is achieved by registering an interrupt handler for `TIMER1_OVF_vect` that is called whenever the counter resets, roughly 244 times per second.
In this handler, the value of an incrementing counter is mapped onto a precomputed brightness curve. To turn off breathing, the interrupt handler is simply disabled, and the brightness reset to the level stored in EEPROM.
### Software PWM Implementation
When `BACKLIGHT_PIN` is not set to a hardware backlight pin, QMK will use a hardware timer configured to trigger software interrupts. This time will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
When resetting to 0, the CPU will fire an OVF (overflow) interrupt that will turn the LEDs on, starting the duty cycle.
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the CPU will fire a Compare Output match interrupt, which will turn the LEDs off.
In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus the brightness, where `0x0000` is completely off and `0xFFFF` is completely on.
The breathing effect is the same as in the hardware PWM implementation.
## ARM Driver
### Caveats
Currently only hardware PWM is supported, and does not provide automatic configuration.
?> STMF072 support is being investigated.
### ARM Configuration
To change the behavior of the backlighting, `#define` these in your `config.h`:
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PWM_DRIVER` |`PWMD4` |The PWM driver to use, see ST datasheets for pin to PWM timer mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PWM_CHANNEL` |`3` |The PWM channel to use, see ST datasheets for pin to PWM channel mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PAL_MODE` |`2` |The pin alternative function to use, see ST datasheets for pin AF mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 31 excluding off) |
|`BACKLIGHT_CAPS_LOCK` |*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|`BACKLIGHT_BREATHING` |*Not defined*|Enable backlight breathing, if supported |
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1 Qmk has support for RN-42 HID Firmware and Bluefruit EZ Key the later of which is not produced anymore. For more recent BLE protocols currently only the Adafruit Bluefruit SPI friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support Mouse Input.
|Board |Bluetooth Protocol |Connection Type |Rules.mk |Bluetooth Chip|
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI | BLUETOOTH = AdafruitBLE | nRF5182 |
Not Supported Yet but possible:
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
* [Sparkfun Bluetooth mate](https://www.sparkfun.com/products/14839)
* HM-13 based boards
### Adafruit BLE SPI Friend
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF5182 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
*#define AdafruitBleResetPin D4
*#define AdafruitBleCSPin B4
*#define AdafruitBleIRQPin E6
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
## Adafruit EZ-Key hid
This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will.
<!-- FIXME: Document bluetooth support more completely. -->
## Bluetooth Rules.mk Options
Use only one of these
* BLUETOOTH_ENABLE = yes (Legacy Option)
* BLUETOOTH = RN42
* BLUETOOTH = AdafruitEZKey
* BLUETOOTH = AdafruitBLE
## Bluetooth Keycodes
This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both.
There are three separate but related features that allow you to change the behavior of your keyboard without reflashing. While each of them have similar functionality, it is accessed in different ways depending on how your keyboard is configured.
**Bootmagic** is a system for configuring your keyboard while it initializes. To trigger a Bootmagic command, hold down the Bootmagic key and one or more command keys.
**Bootmagic Keycodes** are prefixed with `MAGIC_`, and allow you to access the Bootmagic functionality *after* your keyboard has initialized. To use the keycodes, assign them to your keymap as you would any other keycode.
**Command**, formerly known as **Magic**, is another feature that allows you to control different aspects of your keyboard. While it shares some functionality with Bootmagic, it also allows you to do things that Bootmagic does not, such as printing version information to the console. For more information, see [Command](feature_command.md).
On some keyboards Bootmagic is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with:
```make
BOOTMAGIC_ENABLE= full
```
?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) should be used instead.
Additionally, you can use [Bootmagic Lite](#bootmagic-lite) (a scaled down, very basic version of Bootmagic) by adding the following to your `rules.mk` file:
```make
BOOTMAGIC_ENABLE= lite
```
## Hotkeys
Hold down the Bootmagic key (Space by default) and the desired hotkey while plugging in your keyboard. For example, holding Space+`B` should cause it to enter the bootloader.
|`BOOTMAGIC_KEY_DEFAULT_LAYER_0` |`KC_0` |Make layer 0 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_1` |`KC_1` |Make layer 1 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_2` |`KC_2` |Make layer 2 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_3` |`KC_3` |Make layer 3 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_4` |`KC_4` |Make layer 4 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_5` |`KC_5` |Make layer 5 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_6` |`KC_6` |Make layer 6 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_7` |`KC_7` |Make layer 7 the default layer |
# Bootmagic Lite
In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause.
To enable this version of Bootmagic, you need to enable it in your `rules.mk` with:
```make
BOOTMAGIC_ENABLE= lite
```
Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
```c
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 1
```
By default, these are set to 0 and 0, which is usually the "ESC" key on a majority of keyboards.
And to trigger the bootloader, you hold this key down when plugging the keyboard in. Just the single key.
!> Using bootmagic lite will **always reset** the EEPROM, so you will lose any settings that have been saved.
## Advanced Bootmagic Lite
The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
To replace the function, all you need to do is add something like this to your code:
You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
The Combo feature is a chording type solution for adding custom actions. It lets you hit multiple keys at once and produce a different effect. For instance, hitting `A` and `S` within the tapping term would hit `ESC` instead, or have it perform even more complex tasks.
To enable this feature, you need to add `COMBO_ENABLE = yes` to your `rules.mk`.
Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using).
<!-- At this time, this is necessary -->
Also, by default, the tapping term for the Combos is set to the same value as `TAPPING_TERM` (200 by default on most boards). But you can specify a different value by defining it in your `config.h`. For instance: `#define COMBO_TERM 300` would set the time out period for combos to 300ms.
Then, your `keymap.c` file, you'll need to define a sequence of keys, terminated with `COMBO_END`, and a structure to list the combination of keys, and it's resulting action.
This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit X and V. But you could change this to do stuff like change layers, play sounds, or change settings.
## Additional Configuration
If you're using long combos, or even longer combos, you may run into issues with this, as the structure may not be large enough to accommodate what you're doing.
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
## Keycodes
You can enable, disable and toggle the Combo feature on the fly. This is useful if you need to disable them temporarily, such as for a game.
|Keycode |Description |
|----------|---------------------------------|
|`CMB_ON` |Turns on Combo feature |
|`CMB_OFF` |Turns off Combo feature |
|`CMB_TOG` |Toggles Combo feature on and off |
## User callbacks
In addition to the keycodes, there are a few functions that you can use to set the status, or check it:
Command, formerly known as Magic, is a way to change your keyboard's behavior without having to flash or unplug it to use [Bootmagic](feature_bootmagic.md). There is a lot of overlap between this functionality and the [Bootmagic Keycodes](feature_bootmagic.md#keycodes). Wherever possible we encourage you to use that feature instead of Command.
On some keyboards Command is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk`:
```make
COMMAND_ENABLE= yes
```
## Usage
To use Command, hold down the key combination defined by the `IS_COMMAND()` macro. By default this is Left Shift+Right Shift. Then, press the key corresponding to the command you want. For example, to output the current QMK version to the QMK Toolbox console, press Left Shift+Right Shift+`V`.
## Configuration
If you would like to change the key assignments for Command, `#define` these in your `config.h` at either the keyboard or keymap level. All keycode assignments here must omit the `KC_` prefix.
| Not defined | Use the default algorithm, currently sym_g | Nothing |
| custom | Use your own debounce.c | ```SRC += debounce.c``` add your own debounce.c and implement necessary functions |
| anything_else | Use another algorithm from quantum/debounce/* | Nothing |
**Regarding split keyboards**:
The debounce code is compatible with split keyboards.
# Use your own debouncing code
* Set ```DEBOUNCE_TYPE = custom ```.
* Add ```SRC += debounce.c```
* Add your own ```debounce.c```. Look at current implementations in ```quantum/debounce``` for examples.
* Debouncing occurs after every raw matrix scan.
* Use num_rows rather than MATRIX_ROWS, so that split keyboards are supported correctly.
# Changing between included debouncing methods
You can either use your own code, by including your own debounce.c, or switch to another included one.
Included debounce methods are:
* eager_pr - debouncing per row. On any state change, response is immediate, followed by locking the row ```DEBOUNCE_DELAY``` milliseconds of no further input for that row.
For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
* eager_pk - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE_DELAY``` milliseconds of no further input for that key
* sym_g - debouncing per keyboard. On any state change, a global timer is set. When ```DEBOUNCE_DELAY``` milliseconds of no changes has occured, all input changes are pushed.
Additionally, we support bit mask functions which allow for more complex handling.
```c
voiddip_switch_update_mask_kb(uint32_tstate){
dip_switch_update_mask_user(state);
}
```
or `keymap.c`:
```c
voiddip_switch_update_mask_user(uint32_tstate){
if(state&(1UL<<0)&&state&(1UL<<1)){
layer_on(_ADJUST);// C on esc
}else{
layer_off(_ADJUST);
}
if(state&(1UL<<0)){
layer_on(_TEST_A);// A on ESC
}else{
layer_off(_TEST_A);
}
if(state&(1UL<<1)){
layer_on(_TEST_B);// B on esc
}else{
layer_off(_TEST_B);
}
}
```
## Hardware
One side of the DIP switch should be wired directly to the pin on the MCU, and the other side to ground. It should not matter which side is connected to which, as it should be functionally the same.
# Dynamic Macros: Record and Replay Macros in Runtime
QMK supports temporary macros created on the fly. We call these Dynamic Macros. They are defined by the user from the keyboard and are lost when the keyboard is unplugged or otherwise rebooted.
You can store one or two macros and they may have a combined total of 128 keypresses. You can increase this size at the cost of RAM.
To enable them, first add a new element to the end of your `keycodes` enum — `DYNAMIC_MACRO_RANGE`:
```c
enumkeycodes{
QWERTY=SAFE_RANGE,
COLEMAK,
DVORAK,
PLOVER,
LOWER,
RAISE,
BACKLIT,
EXT_PLV,
DYNAMIC_MACRO_RANGE,
};
```
Your `keycodes` enum may have a slightly different name. You must add `DYNAMIC_MACRO_RANGE` as the last element because `dynamic_macros.h` will add some more keycodes after it.
Below it, include the `dynamic_macro.h` header:
```c
#include"dynamic_macro.h"`
```
Add the following keys to your keymap:
*`DYN_REC_START1` — start recording the macro 1,
*`DYN_REC_START2` — start recording the macro 2,
*`DYN_MACRO_PLAY1` — replay the macro 1,
*`DYN_MACRO_PLAY2` — replay the macro 2,
*`DYN_REC_STOP` — finish the macro that is currently being recorded.
Add the following code to the very beginning of your `process_record_user()` function:
That should be everything necessary. To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`. To finish the recording, press the `DYN_REC_STOP` layer button. To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
Note that it's possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again.
For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DYN_REC_STOP` key. If you want this behavior back, use the following snippet instead of the one above:
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header.
If you're using a 60% keyboard, or any other layout with no F-row, you will have noticed that there is no dedicated Escape key. Grave Escape is a feature that allows you to share the grave key (<code>`</code> and `~`) with Escape.
## Usage
Replace the `KC_GRAVE` key in your keymap (usually to the left of the `1` key) with `KC_GESC`. Most of the time this key will output `KC_ESC` when pressed. However, when Shift or GUI are held down it will output `KC_GRV` instead.
## What Your OS Sees
If Mary presses GESC on her keyboard, the OS will see an KC_ESC character. Now if Mary holds Shift down and presses GESC it will output `~`, or a shifted backtick. Now if she holds GUI/CMD/WIN, it will output a simple <code>`</code> character.
|`KC_GESC`|`GRAVE_ESC`|Escape when pressed, <code>`</code> when Shift or GUI are held|
### Caveats
On macOS, Command+<code>`</code> is by default mapped to "Move focus to next window" so it will not output a backtick. Additionally, Terminal always recognises this shortcut to cycle between windows, even if the shortcut is changed in the Keyboard preferences.
## Configuration
There are several possible key combinations this will break, among them Control+Shift+Escape on Windows and Command+Option+Escape on macOS. To work around this, you can `#define` these options in your `config.h`:
First you will need a build a circuit to drive the solenoid through a mosfet as most MCU will not be able to provide the current needed to drive the coil in the solenoid.
[Wiring diagram provided by Adafruit](https://playground.arduino.cc/uploads/Learning/solenoid_driver.pdf)
Select a pin that has PWM for the signal pin
```
#define SOLENOID_PIN *pin*
```
Beware that some pins may be powered during bootloader (ie. A13 on the STM32F303 chip) and will result in the solenoid kept in the on state through the whole flashing process. This may overheat and damage the solenoid. If you find that the pin the solenoid is connected to is triggering the solenoid during bootloader/DFU, select another pin.
### DRV2605L
DRV2605L is controlled over i2c protocol, and has to be connected to the SDA and SCL pins, these varies depending on the MCU in use.
#### Feedback motor setup
This driver supports 2 different feedback motors. Set the following in your `config.h` based on which motor you have selected.
##### ERM
Eccentric Rotating Mass vibration motors (ERM) is motor with a off-set weight attached so when drive signal is attached, the off-set weight spins and causes a sinusoidal wave that translate into vibrations.
#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
/* Please refer to your datasheet for the optimal setting for your specific motor. */
#define RATED_VOLTAGE 3
#define V_PEAK 5
```
##### LRA
Linear resonant actuators (LRA, also know as a linear vibrator) works different from a ERM. A LRA has a weight and magnet suspended by springs and a voice coil. When the drive signal is applied, the weight would be vibrate on a single axis (side to side or up and down). Since the weight is attached to a spring, there is a resonance effect at a specific frequency. This frequency is where the LRA will operate the most efficiently. Refer to the motor's datasheet for the recommanded range for this frequency.
#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
/* Please refer to your datasheet for the optimal setting for your specific motor. */
#define RATED_VOLTAGE 2
#define V_PEAK 2.8
#define V_RMS 2.0
#define V_PEAK 2.1
#define F_LRA 205 /* resonance freq */
```
#### DRV2605L waveform library
DRV2605L comes with preloaded library of various waveform sequences that can be called and played. If writing a macro, these waveforms can be played using `DRV_pulse(*sequence name or number*)`
List of waveform sequences from the datasheet:
|seq# | Sequence name |seq# | Sequence name |seq# |Sequence name |
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
## Configuration
You will need to configure the pins used by your display, and its number of lines and columns in your keyboard's `config.h`.
Uncomment the section labled HD44780 and change the parameters as needed.
````
/*
* HD44780 LCD Display Configuration
*/
#define LCD_LINES 2 //< number of visible lines of the display
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
#define LCD_RS_PORT LCD_PORT //< port for RS line
#define LCD_RS_PIN 3 //< pin for RS line
#define LCD_RW_PORT LCD_PORT //< port for RW line
#define LCD_RW_PIN 2 //< pin for RW line
#define LCD_E_PORT LCD_PORT //< port for Enable line
#define LCD_E_PIN 1 //< pin for Enable line
#endif
````
Should you need to configure other properties you can copy them from `quantum/hd44780.h` and set them in your `config.h`
## Usage
To initialize your display, call `lcd_init()` with one of these parameters:
````
LCD_DISP_OFF : display off
LCD_DISP_ON : display on, cursor off
LCD_DISP_ON_CURSOR : display on, cursor on
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
````
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`.
It is advised to clear the display before use.
To do so call `lcd_clrsrc()`.
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
Sometimes you may find yourself needing to hold down a specific key for a long period of time. Key Lock holds down the next key you press for you. Press it again, and it will be released.
Let's say you need to type in ALL CAPS for a few sentences. Hit `KC_LOCK`, and then Shift. Now, Shift will be considered held until you tap it again. You can think of Key Lock as Caps Lock, but supercharged.
## Usage
First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Then pick a key in your keymap and assign it the keycode `KC_LOCK`.
|`KC_LOCK`|Hold down the next key pressed, until the key is pressed again|
## Caveats
Key Lock is only able to hold standard action keys and [One Shot modifier](feature_advanced_keycodes.md#one-shot-keys) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
The `layouts/` folder contains different physical key layouts that can apply to different keyboards.
```
layouts/
+ default/
| + 60_ansi/
| | + readme.md
| | + layout.json
| | + a_good_keymap/
| | | + keymap.c
| | | + readme.md
| | | + config.h
| | | + rules.mk
| | + <keymap folder>/
| | + ...
| + <layout folder>/
+ community/
| + <layout folder>/
| + ...
```
The `layouts/default/` and `layouts/community/` are two examples of layout "repositories" - currently `default` will contain all of the information concerning the layout, and one default keymap named `default_<layout>`, for users to use as a reference. `community` contains all of the community keymaps, with the eventual goal of being split-off into a separate repo for users to clone into `layouts/`. QMK searches through all folders in `layouts/`, so it's possible to have multiple repositories here.
Each layout folder is named (`[a-z0-9_]`) after the physical aspects of the layout, in the most generic way possible, and contains a `readme.md` with the layout to be defined by the keyboard:
```md
# 60_ansi
LAYOUT_60_ansi
```
New names should try to stick to the standards set by existing layouts, and can be discussed in the PR/Issue.
## Supporting a Layout
For a keyboard to support a layout, the variable must be defined in it's `<keyboard>.h`, and match the number of arguments/keys (and preferably the physical layout):
#define LAYOUT_60_ansi KEYMAP_ANSI
The name of the layout must match this regex: `[a-z0-9_]+`
The folder name must be added to the keyboard's `rules.mk`:
LAYOUTS = 60_ansi
`LAYOUTS` can be set in any keyboard folder level's `rules.mk`:
LAYOUTS = 60_iso
but the `LAYOUT_<layout>` variable must be defined in `<folder>.h` as well.
## Building a Keymap
You should be able to build the keyboard keymap with a command in this format:
make <keyboard>:<layout>
### Conflicting layouts
When a keyboard supports multiple layout options,
LAYOUTS = ortho_4x4 ortho_4x12
And a layout exists for both options,
```
layouts/
+ community/
| + ortho_4x4/
| | + <layout>/
| | | + ...
| + ortho_4x12/
| | + <layout>/
| | | + ...
| + ...
```
The FORCE_LAYOUT argument can be used to specify which layout to build
make <keyboard>:<layout> FORCE_LAYOUT=ortho_4x4
make <keyboard>:<layout> FORCE_LAYOUT=ortho_4x12
## Tips for Making Layouts Keyboard-Agnostic
### Includes
Instead of using `#include "planck.h"`, you can use this line to include whatever `<keyboard>.h` (`<folder>.h` should not be included here) file that is being compiled:
#include QMK_KEYBOARD_H
If you want to keep some keyboard-specific code, you can use these variables to escape it with an `#ifdef` statement:
*`KEYBOARD_<folder1>_<folder2>`
For example:
```c
#ifdef KEYBOARD_planck
#ifdef KEYBOARD_planck_rev4
planck_rev4_function();
#endif
#endif
```
Note that the names are lowercase and match the folder/file names for the keyboard/revision exactly.
### Keymaps
In order to support both split and non-split keyboards with the same layout, you need to use the keyboard agnostic `LAYOUT_<layout name>` macro in your keymap. For instance, in order for a Let's Split and Planck to share the same layout file, you need to use `LAYOUT_ortho_4x12` instead of `LAYOUT_planck_grid` or just `{}` for a C array.
If you've ever used Vim, you know what a Leader key is. If not, you're about to discover a wonderful concept. :) Instead of hitting Alt+Shift+W for example (holding down three keys at the same time), what if you could hit a _sequence_ of keys instead? So you'd hit our special modifier (the Leader key), followed by W and then C (just a rapid succession of keys), and something would happen.
That's what `KC_LEAD` does. Here's an example:
1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else.
2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `KC_LEAD` key. Specifically, when you press the `KC_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low. .
* By default, this timeout is how long after pressing `KC_LEAD` to complete your entire sequence. This may be very low for some people. So you may want to increase this timeout. Optionally, you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. This allows you to maintain a low value here, but still be able to use the longer sequences. To enable this option, add `#define LEADER_PER_KEY_TIMING` to your `config.h`.
3. Within your `matrix_scan_user` function, add something like this:
As you can see, you have a few function. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences.
Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously.
## Adding Leader Key Support in the `rules.mk`
To add support for Leader Key you simply need to add a single line to your keymap's `rules.mk`:
```make
LEADER_ENABLE= yes
```
## Per Key Timing on Leader keys
Rather than relying on an incredibly high timeout for long leader key strings or those of us without 200wpm typing skills, we can enable per key timing to ensure that each key pressed provides us with more time to finish our stroke. This is incredibly helpful with leader key emulation of tap dance (read: multiple taps of the same key like C, C, C).
In order to enable this, place this in your `config.h`:
```c
#define LEADER_PER_KEY_TIMING
```
After this, it's recommended that you lower your `LEADER_TIMEOUT` to something less that 300ms.
```c
#define LEADER_TIMEOUT 250
```
Now, something like this won't seem impossible to do without a 1000MS leader key timeout:
```c
SEQ_THREE_KEYS(KC_C,KC_C,KC_C){
SEND_STRING("Per key timing is great!!!");
}
```
## Strict Key Processing
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](feature_advanced_keycodes.md#mod-tap) and [`Layer Tap`](feature_advanced_keycodes.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This well then disable the filtering, and you'll need to specify the whole keycode.
## Customization
The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`.
The `leader_start()` function is called when you tap the `KC_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit.
You can add these functions to your code (`keymap.c` usually) to add feedback to the Leader sequences (such as beeping or playing music).
```c
voidleader_start(void){
// sequence started
}
voidleader_end(void){
// sequence ended (no success/failuer detection)
}
```
### Example
This example will play the Mario "One Up" sound when you hit `KC_LEAD` to start the Leader Sequence, and will play "All Star" if it completes successfully or "Rick Roll" you if it fails.
This feature allows you to use LED matrices driven by external drivers. It hooks into the backlight system so you can use the same keycodes as backlighting to control it.
If you want to use RGB LED's you should use the [RGB Matrix Subsystem](feature_rgb_matrix.md) instead.
## Driver configuration
### IS31FL3731
There is basic support for addressable LED matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`:
LED_MATRIX_ENABLE = IS31FL3731
You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_<N>` defines for IC's that are not present on your keyboard. You can define the following items in `config.h`:
| Variable | Description | Default |
|----------|-------------|---------|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `LED_DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
| `LED_DRIVER_LED_COUNT` | (Required) How many LED lights are present across all drivers | |
| `LED_DRIVER_ADDR_1` | (Required) Address for the first LED driver | |
| `LED_DRIVER_ADDR_2` | (Optional) Address for the second LED driver | |
| `LED_DRIVER_ADDR_3` | (Optional) Address for the third LED driver | |
| `LED_DRIVER_ADDR_4` | (Optional) Address for the fourth LED driver | |
Here is an example using 2 drivers.
// This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring:
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
Define these arrays listing all the LEDs in your `<keyboard>.c`:
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
/* Refer to IS31 manual for these locations
* driver
* | LED address
* | | */
{0, C3_3},
....
}
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
## Keycodes
All LED matrix keycodes are currently shared with the [backlight system](feature_backlight.md).
## LED Matrix Effects
Currently no LED matrix effects have been created.
## Custom layer effects
Custom layer effects can be done by defining this in your `<keyboard>.c`:
void led_matrix_indicators_kb(void) {
led_matrix_set_index_value(index, value);
}
A similar function works in the keymap as `led_matrix_indicators_user`.
## Suspended state
To use the suspend feature, add this to your `<keyboard>.c`:
Macros allow you to send multiple keystrokes when pressing just one key. QMK has a number of ways to define and use macros. These can do anything you want: type common phrases for you, copypasta, repetitive game movements, or even help you code.
!> **Security Note**: While it is possible to use macros to send passwords, credit card numbers, and other sensitive information it is a supremely bad idea to do so. Anyone who gets a hold of your keyboard will be able to access that information by opening a text editor.
## The New Way: `SEND_STRING()` & `process_record_user`
Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string (i.e. a sequence of characters) for you. All ASCII characters that are easily translated to a keycode are supported (e.g. `\n\t`).
Here is an example `keymap.c` for a two-key keyboard:
We first define a new custom keycode in the range not occupied by any other keycodes.
Then we use the `process_record_user` function, which is called whenever a key is pressed or released, to check if our custom keycode has been activated.
If yes, we send the string `"QMK is the best thing ever!"` to the computer via the `SEND_STRING` macro (this is a C preprocessor macro, not to be confused with QMK macros).
We return `true` to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality).
Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button.
You might want to add more than one macro.
You can do that by adding another keycode and adding another case to the switch statement, like so:
You may want to use keys in your macros that you can't write down, such as `Ctrl` or `Home`.
You can send arbitrary keycodes by wrapping them in:
*`SS_TAP()` presses and releases a key.
*`SS_DOWN()` presses (but does not release) a key.
*`SS_UP()` releases a key.
For example:
SEND_STRING(SS_TAP(X_HOME));
Would tap `KC_HOME` - note how the prefix is now `X_`, and not `KC_`. You can also combine this with other strings, like this:
SEND_STRING("VE"SS_TAP(X_HOME)"LO");
Which would send "VE" followed by a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline).
There's also a couple of mod shortcuts you can use:
*`SS_LCTRL(string)`
*`SS_LGUI(string)`
*`SS_LALT(string)`
*`SS_LSFT(string)`
*`SS_RALT(string)`
These press the respective modifier, send the supplied string and then release the modifier.
They can be used like this:
SEND_STRING(SS_LCTRL("a"));
Which would send LCTRL+a (LCTRL down, a, LCTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes.
### Alternative Keymaps
By default, it assumes a US keymap with a QWERTY layout; if you want to change that (e.g. if your OS uses software Colemak), include this somewhere in your keymap:
#include<sendstring_colemak.h>
### Strings in Memory
If for some reason you're manipulating strings and need to print out something you just generated (instead of being a literal, constant string), you can use `send_string()`, like this:
```c
charmy_str[4]="ok.";
send_string(my_str);
```
The shortcuts defined above won't work with `send_string()`, but you can separate things out to different lines if needed:
```c
charmy_str[4]="ok.";
SEND_STRING("I said: ");
send_string(my_str);
SEND_STRING(".."SS_TAP(X_END));
```
## Advanced Macro Functions
There are some functions you may find useful in macro-writing. Keep in mind that while you can write some fairly advanced code within a macro, if your functionality gets too complex you may want to define a custom keycode instead. Macros are meant to be simple.
### `record->event.pressed`
This is a boolean value that can be tested to see if the switch is being pressed or released. An example of this is
```c
if(record->event.pressed){
// on keydown
}else{
// on keyup
}
```
### `register_code(<kc>);`
This sends the `<kc>` keydown event to the computer. Some examples would be `KC_ESC`, `KC_C`, `KC_4`, and even modifiers such as `KC_LSFT` and `KC_LGUI`.
### `unregister_code(<kc>);`
Parallel to `register_code` function, this sends the `<kc>` keyup event to the computer. If you don't use this, the key will be held down until it's sent.
### `tap_code(<kc>);`
This will send `register_code(<kc>)` and then `unregister_code(<kc>)`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it).
If you're having issues with taps (un)registering, you can add a delay between the register and unregister events by setting `#define TAP_CODE_DELAY 100` in your `config.h` file. The value is in milliseconds.
### `register_code16(<kc>);`, `unregister_code16(<kc>);` and `tap_code16(<kc>);`
These functions work similar to their regular counterparts, but allow you to use modded keycodes (with Shift, Alt, Control, and/or GUI applied to them).
Eg, you could use `register_code16(S(KC_5));` instead of registering the mod, then registering the keycode.
### `clear_keyboard();`
This will clear all mods and keys currently pressed.
### `clear_mods();`
This will clear all mods currently pressed.
### `clear_keyboard_but_mods();`
This will clear all keys besides the mods currently pressed.
## Advanced Example:
### Super ALT↯TAB
This macro will register `KC_LALT` and tap `KC_TAB`, then wait for 1000ms. If the key is tapped again, it will send another `KC_TAB`; if there is no tap, `KC_LALT` will be unregistered, thus allowing you to cycle through windows.
This defines two macros which will be run when the key they are assigned to is pressed. If instead you'd like them to run when the key is released you can change the if statement:
if (!record->event.pressed) {
### Macro Commands
A macro can include the following commands:
* I() change interval of stroke in milliseconds.
* D() press key.
* U() release key.
* T() type key(press and release).
* W() wait (milliseconds).
* END end mark.
### Mapping a Macro to a Key
Use the `M()` function within your keymap to call a macro. For example, here is the keymap for a 2-key keyboard:
When you press the key on the left it will type "Hi!" and when you press the key on the right it will type "Bye!".
### Naming Your Macros
If you have a bunch of macros you want to refer to from your keymap while keeping the keymap easily readable you can name them using `#define` at the top of your file.
Mouse keys is a feature that allows you to emulate a mouse using your keyboard. You can move the pointer at different speeds, press 5 buttons and scroll in 8 directions.
## Adding mouse keys to your keyboard
To use mouse keys, you must at least enable mouse keys support and map mouse actions to keys on your keyboard.
### Enabling mouse keys
To enable mouse keys, add the following line to your keymap’s `rules.mk`:
```c
MOUSEKEY_ENABLE=yes
```
### Mapping mouse actions
In your keymap you can use the following keycodes to map key presses to mouse actions:
|Key |Aliases |Description |
|----------------|---------|-----------------|
|`KC_MS_UP` |`KC_MS_U`|Move cursor up |
|`KC_MS_DOWN` |`KC_MS_D`|Move cursor down |
|`KC_MS_LEFT` |`KC_MS_L`|Move cursor left |
|`KC_MS_RIGHT` |`KC_MS_R`|Move cursor right|
|`KC_MS_BTN1` |`KC_BTN1`|Press button 1 |
|`KC_MS_BTN2` |`KC_BTN2`|Press button 2 |
|`KC_MS_BTN3` |`KC_BTN3`|Press button 3 |
|`KC_MS_BTN4` |`KC_BTN4`|Press button 4 |
|`KC_MS_BTN5` |`KC_BTN5`|Press button 5 |
|`KC_MS_WH_UP` |`KC_WH_U`|Move wheel up |
|`KC_MS_WH_DOWN` |`KC_WH_D`|Move wheel down |
|`KC_MS_WH_LEFT` |`KC_WH_L`|Move wheel left |
|`KC_MS_WH_RIGHT`|`KC_WH_R`|Move wheel right |
|`KC_MS_ACCEL0` |`KC_ACL0`|Set speed to 0 |
|`KC_MS_ACCEL1` |`KC_ACL1`|Set speed to 1 |
|`KC_MS_ACCEL2` |`KC_ACL2`|Set speed to 2 |
## Configuring mouse keys
Mouse keys supports two different modes to move the cursor:
* **Accelerated (default):** Holding movement keys accelerates the cursor until it reaches its maximum speed.
* **Constant:** Holding movement keys moves the cursor at constant speeds.
The same principle applies to scrolling.
Configuration options that are times, intervals or delays are given in milliseconds. Scroll speed is given as multiples of the default scroll step. For example, a scroll speed of 8 means that each scroll action covers 8 times the length of the default scroll step as defined by your operating system or application.
### Accelerated mode
This is the default mode. You can adjust the cursor and scrolling acceleration using the following settings in your keymap’s `config.h` file:
|`MOUSEKEY_DELAY` |300 |Delay between pressing a movement key and cursor movement|
|`MOUSEKEY_INTERVAL` |50 |Time between cursor movements |
|`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops |
|`MOUSEKEY_TIME_TO_MAX` |20 |Time until maximum cursor speed is reached |
|`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action |
|`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached |
Tips:
* Setting `MOUSEKEY_DELAY` too low makes the cursor unresponsive. Setting it too high makes small movements difficult.
* For smoother cursor movements, lower the value of `MOUSEKEY_INTERVAL`. If the refresh rate of your display is 60Hz, you could set it to `16` (1/60). As this raises the cursor speed significantly, you may want to lower `MOUSEKEY_MAX_SPEED`.
* Setting `MOUSEKEY_TIME_TO_MAX` or `MOUSEKEY_WHEEL_TIME_TO_MAX` to `0` will disable acceleration for the cursor or scrolling respectively. This way you can make one of them constant while keeping the other accelerated, which is not possible in constant speed mode.
Cursor acceleration uses the same algorithm as the X Window System MouseKeysAccel feature. You can read more about it [on Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys).
### Constant mode
In this mode you can define multiple different speeds for both the cursor and the mouse wheel. There is no acceleration. `KC_ACL0`, `KC_ACL1` and `KC_ACL2` change the cursor and scroll speed to their respective setting.
You can choose whether speed selection is momentary or tap-to-select:
* **Momentary:** The chosen speed is only active while you hold the respective key. When the key is raised, mouse keys returns to the unmodified speed.
* **Tap-to-select:** The chosen speed is activated when you press the respective key and remains active even after the key has been raised. The default speed is that of `KC_ACL1`. There is no unmodified speed.
The default speeds from slowest to fastest are as follows:
| SH1106 | 128x64 | AVR | No rotation or scrolling |
Hardware configurations using ARM-based microcontrollers or different sizes of OLED modules may be compatible, but are untested.
!> Warning: This OLED Driver currently uses the new i2c_master driver from split common code. If your split keyboard uses I2C to communicate between sides, this driver could cause an address conflict (serial is fine). Please contact your keyboard vendor and ask them to migrate to the latest split common code to fix this. In addition, the display timeout system to reduce OLED burn-in also uses split common to detect keypresses, so you will need to implement custom timeout logic for non-split common keyboards.
## Usage
To enable the OLED feature, there are three steps. First, when compiling your keyboard, you'll need to set `OLED_DRIVER_ENABLE=yes` in `rules.mk`, e.g.:
```
OLED_DRIVER_ENABLE = yes
```
This enables the feature and the `OLED_DRIVER_ENABLE` define. Then in your `keymap.c` file, you will need to implement the user task call, e.g:
```C++
#ifdef OLED_DRIVER_ENABLE
void oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state)) {
case _QWERTY:
oled_write_P(PSTR("Default\n"), false);
break;
case _FN:
oled_write_P(PSTR("FN\n"), false);
break;
case _ADJ:
oled_write_P(PSTR("ADJ\n"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
In split keyboards, it is very common to have two OLED displays that each render different content and oriented flipped differently. You can do this by switching which content to render by using the return from `is_keyboard_master()` or `is_keyboard_left()` found in `split_util.h`, e.g:
| `OLED_DISPLAY_ADDRESS` | `0x3C` | The i2c address of the OLED Display |
| `OLED_FONT_H` | `"glcdfont.c"` | The font code file to use for custom fonts |
| `OLED_FONT_START` | `0` | The starting characer index for custom fonts |
| `OLED_FONT_END` | `224` | The ending characer index for custom fonts |
| `OLED_FONT_WIDTH` | `6` | The font width |
| `OLED_FONT_HEIGHT` | `8` | The font height (untested) |
| `OLED_TIMEOUT` | `60000` | Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
| `OLED_SCROLL_TIMEOUT` | `0` | Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
| `OLED_SCROLL_TIMEOUT_RIGHT`| *Not defined* | Scroll timeout direction is right when defined, left when undefined. |
| `OLED_IC` | `OLED_IC_SSD1306` | Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. |
| `OLED_COLUMN_OFFSET` | `0` | (SH1106 only.) Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC. |
## 128x64 & Custom sized OLED Displays
The default display size for this feature is 128x32 and all necessary defines are precalculated with that in mind. We have added a define, `OLED_DISPLAY_128X64`, to switch all the values to be used in a 128x64 display, as well as added a custom define, `OLED_DISPLAY_CUSTOM`, that allows you to provide the necessary values to the driver.
OLED displays driven by SSD1306 drivers only natively support in hard ware 0 degree and 180 degree rendering. This feature is done in software and not free. Using this feature will increase the time to calculate what data to send over i2c to the OLED. If you are strapped for cycles, this can cause keycodes to not register. In testing however, the rendering time on an `atmega32u4` board only went from 2ms to 5ms and keycodes not registering was only noticed once we hit 15ms.
90 Degree Rotated Rendering is achieved by using bitwise operations to rotate each 8 block of memory and uses two precalculated arrays to remap buffer memory to OLED memory. The memory map defines are precalculated for remap performance and are calculated based on the OLED Height, Width, and Block Size. For example, in the 128x32 implementation with a `uint8_t` block type, we have a 64 byte block size. This gives us eight 8 byte blocks that need to be rotated and rendered. The OLED renders horizontally two 8 byte blocks before moving down a page, e.g:
| | | | | | |
|---|---|---|---|---|---|
| 0 | 1 | | | | |
| 2 | 3 | | | | |
| 4 | 5 | | | | |
| 6 | 7 | | | | |
However the local buffer is stored as if it was Height x Width display instead of Width x Height, e.g:
| | | | | | |
|---|---|---|---|---|---|
| 3 | 7 | | | | |
| 2 | 6 | | | | |
| 1 | 5 | | | | |
| 0 | 4 | | | | |
So those precalculated arrays just index the memory offsets in the order in which each one iterates its data.
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer around. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and lightweight. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
To enable Pointing Device, uncomment the following line in your rules.mk:
```
POINTING_DEVICE_ENABLE = yes
```
To manipulate the mouse report, you can use the following functions:
*`pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer
*`pointing_device_set_report(report_mouse_t newMouseReport)` - Overrides and saves the report_mouse_t to be sent to the host computer
Keep in mind that a report_mouse_t (here "mouseReport") has the following properties:
*`mouseReport.x` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing movement (+ to the right, - to the left) on the x axis.
*`mouseReport.y` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing movement (+ upward, - downward) on the y axis.
*`mouseReport.v` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing vertical scrolling (+ upward, - downward).
*`mouseReport.h` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing horizontal scrolling (+ right, - left).
*`mouseReport.buttons` - this is a uint8_t in which the last 5 bits are used. These bits represent the mouse button state - bit 3 is mouse button 5, and bit 7 is mouse button 1.
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in "pointing_device_send()", which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
In the following example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function. Listen, this is an example:
Its possible to hook up a PS/2 mouse (for example touchpads or trackpoints) to your keyboard as a composite device.
To hook up a Trackpoint, you need to obtain a Trackpoint module (i.e. harvest from a Thinkpad keyboard), identify the function of each pin of the module, and make the necessary circuitry between controller and Trackpoint module. For more information, please refer to [Trackpoint Hardware](https://deskthority.net/wiki/TrackPoint_Hardware) page on Deskthority Wiki.
There are three available modes for hooking up PS/2 devices: USART (best), interrupts (better) or busywait (not recommended).
### The Cirtuitry between Trackpoint and Controller
To get the things working, a 4.7K drag is needed between the two lines DATA and CLK and the line 5+.
```
DATA ----------+--------- PIN
|
4.7K
|
MODULE 5+ --------+--+--------- PWR CONTROLLER
|
4.7K
|
CLK ------+------------ PIN
```
### Busywait Version
Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
In rules.mk:
```
PS2_MOUSE_ENABLE = yes
PS2_USE_BUSYWAIT = yes
```
In your keyboard config.h:
```
#ifdef PS2_USE_BUSYWAIT
# define PS2_CLOCK_PORT PORTD
# define PS2_CLOCK_PIN PIND
# define PS2_CLOCK_DDR DDRD
# define PS2_CLOCK_BIT 1
# define PS2_DATA_PORT PORTD
# define PS2_DATA_PIN PIND
# define PS2_DATA_DDR DDRD
# define PS2_DATA_BIT 2
#endif
```
### Interrupt Version
The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data.
In rules.mk:
```
PS2_MOUSE_ENABLE = yes
PS2_USE_INT = yes
```
In your keyboard config.h:
```
#ifdef PS2_USE_INT
#define PS2_CLOCK_PORT PORTD
#define PS2_CLOCK_PIN PIND
#define PS2_CLOCK_DDR DDRD
#define PS2_CLOCK_BIT 2
#define PS2_DATA_PORT PORTD
#define PS2_DATA_PIN PIND
#define PS2_DATA_DDR DDRD
#define PS2_DATA_BIT 5
#define PS2_INT_INIT() do { \
EICRA |= ((1<<ISC21) | \
(0<<ISC20)); \
} while (0)
#define PS2_INT_ON() do { \
EIMSK |= (1<<INT2); \
} while (0)
#define PS2_INT_OFF() do { \
EIMSK &= ~(1<<INT2); \
} while (0)
#define PS2_INT_VECT INT2_vect
#endif
```
### USART Version
To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version.
This feature allows you to use RGB LED matrices driven by external drivers. It hooks into the RGBLIGHT system so you can use the same keycodes as RGBLIGHT to control it.
If you want to use single color LED's you should use the [LED Matrix Subsystem](feature_led_matrix.md) instead.
## Driver configuration
---
### IS31FL3731
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`:
```C
RGB_MATRIX_ENABLE=IS31FL3731
```
Configure the hardware via your `config.h`:
```C
// This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring:
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
constis31_ledg_is31_leds[DRIVER_LED_TOTAL]={
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0,C1_3,C2_3,C3_3},
....
}
```
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731.h`. The `driver` is the index of the driver you defined in your `config.h` (`0` or `1` right now).
---
### IS31FL3733/IS31FL3737
!> For the IS31FL3737, replace all instances of `IS31FL3733` below with `IS31FL3737`.
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3733 RGB controller. To enable it, add this to your `rules.mk`:
```C
RGB_MATRIX_ENABLE=IS31FL3733
```
Configure the hardware via your `config.h`:
```C
// This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring:
// 00 <-> GND
// 01 <-> SCL
// 10 <-> SDA
// 11 <-> VCC
// ADDR1 represents A1:A0 of the 7-bit address.
// ADDR2 represents A3:A2 of the 7-bit address.
// The result is: 0b101(ADDR2)(ADDR1)
#define DRIVER_ADDR_1 0b1010000
#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 64
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
```
Currently only a single drivers is supported, but it would be trivial to support all 4 combinations. For now define `DRIVER_ADDR_2` as `DRIVER_ADDR_1`
Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
constis31_ledg_is31_leds[DRIVER_LED_TOTAL]={
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0,B_1,A_1,C_1},
....
}
```
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0` right now).
---
### WS2812 (AVR only)
There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`:
```C
RGB_MATRIX_ENABLE=WS2812
```
Configure the hardware via your `config.h`:
```C
// The pin connected to the data pin of the LEDs
#define RGB_DI_PIN D7
// The number of LEDs connected
#define DRIVER_LED_TOTAL 70
```
---
From this point forward the configuration is the same for all the drivers. The `led_config_t` struct provides a key electrical matrix to led index lookup table, what the physical position of each LED is on the board, and what type of key or usage the LED if the LED represents. Here is a brief example:
The first part, `// Key Matrix to LED Index`, tells the system what key this LED represents by using the key's electrical matrix row & col. The second part, `// LED Index to Physical Position` represents the LED's physical `{ x, y }` position on the keyboard. The default expected range of values for `{ x, y }` is the inclusive range `{ 0..224, 0..64 }`. This default expected range is due to effects that calculate the center of the keyboard for their animations. The easiest way to calculate these positions is imagine your keyboard is a grid, and the top left of the keyboard represents `{ x, y }` coordinate `{ 0, 0 }` and the bottom right of your keyboard represents `{ 224, 64 }`. Using this as a basis, you can use the following formula to calculate the physical position:
```C
x=224/(NUMBER_OF_COLS-1)*COL_POSITION
y=64/(NUMBER_OF_ROWS-1)*ROW_POSITION
```
Where NUMBER_OF_COLS, NUMBER_OF_ROWS, COL_POSITION, & ROW_POSITION are all based on the physical layout of your keyboard, not the electrical layout.
As mentioned earlier, the center of the keyboard by default is expected to be `{ 112, 32 }`, but this can be changed if you want to more accurately calculate the LED's physical `{ x, y }` positions. Keyboard designers can implement `#define RGB_MATRIX_CENTER { 112, 32 }` in their config.h file with the new center point of the keyboard, or where they want it to be allowing more possibilities for the `{ x, y }` values. Do note that the maximum value for x or y is 255, and the recommended maximum is 224 as this gives animations runoff room before they reset.
`// LED Index to Flag` is a bitmask, whether or not a certain LEDs is of a certain type. It is recommended that LEDs are set to only 1 type.
|`#define HAS_FLAGS(bits, flags)` |Returns true if `bits` has all `flags` set.|
|`#define HAS_ANY_FLAGS(bits, flags)`|Returns true if `bits` has any `flags` set.|
|`#define LED_FLAG_NONE 0x00` |If this LED has no flags. |
|`#define LED_FLAG_ALL 0xFF` |If this LED has all flags. |
|`#define LED_FLAG_MODIFIER 0x01` |If the Key for this LED is a modifier. |
|`#define LED_FLAG_UNDERGLOW 0x02` |If the LED is for underglow. |
|`#define LED_FLAG_KEYLIGHT 0x04` |If the LED is for key backlight. |
## Keycodes
All RGB keycodes are currently shared with the RGBLIGHT system:
*`RGB_TOG` - toggle
*`RGB_MOD` - cycle through modes
*`RGB_HUI` - increase hue
*`RGB_HUD` - decrease hue
*`RGB_SAI` - increase saturation
*`RGB_SAD` - decrease saturation
*`RGB_VAI` - increase value
*`RGB_VAD` - decrease value
*`RGB_SPI` - increase speed effect (no EEPROM support)
*`RGB_SPD` - decrease speed effect (no EEPROM support)
*`RGB_MODE_*` keycodes will generally work, but are not currently mapped to the correct effects for the RGB Matrix system
## RGB Matrix Effects
All effects have been configured to support current configuration values (Hue, Saturation, Value, & Speed) unless otherwise noted below. These are the effects that are currently available:
```C
enumrgb_matrix_effects{
RGB_MATRIX_NONE=0,
RGB_MATRIX_SOLID_COLOR=1,// Static single hue, no speed support
RGB_MATRIX_ALPHAS_MODS,// Static dual hue, speed is hue for secondary hue
RGB_MATRIX_GRADIENT_UP_DOWN,// Static gradient top to bottom, speed controls how much gradient changes
RGB_MATRIX_BREATHING,// Single hue brightness cycling animation
RGB_MATRIX_BAND_SAT,// Single hue band fading saturation scrolling left to right
RGB_MATRIX_BAND_VAL,// Single hue band fading brightness scrolling left to right
RGB_MATRIX_BAND_PINWHEEL_SAT,// Single hue 3 blade spinning pinwheel fades saturation
RGB_MATRIX_BAND_PINWHEEL_VAL,// Single hue 3 blade spinning pinwheel fades brightness
RGB_MATRIX_BAND_SPIRAL_SAT,// Single hue spinning spiral fades saturation
RGB_MATRIX_BAND_SPIRAL_VAL,// Single hue spinning spiral fades brightness
RGB_MATRIX_CYCLE_ALL,// Full keyboard solid hue cycling through full gradient
RGB_MATRIX_CYCLE_LEFT_RIGHT,// Full gradient scrolling left to right
RGB_MATRIX_CYCLE_UP_DOWN,// Full gradient scrolling top to bottom
RGB_MATRIX_CYCLE_OUT_IN,// Full gradient scrolling out to in
RGB_MATRIX_CYCLE_OUT_IN_DUAL,// Full dual gradients scrolling out to in
RGB_MATRIX_RAINBOW_MOVING_CHEVRON,// Full gradent Chevron shapped scrolling left to right
RGB_MATRIX_CYCLE_PINWHEEL,// Full gradient spinning pinwheel around center of keyboard
RGB_MATRIX_CYCLE_SPIRAL,// Full gradient spinning spiral around center of keyboard
RGB_MATRIX_DUAL_BEACON,// Full gradient spinning around center of keyboard
RGB_MATRIX_RAINBOW_BEACON,// Full tighter gradient spinning around center of keyboard
RGB_MATRIX_RAINBOW_PINWHEELS,// Full dual gradients spinning two halfs of keyboard
RGB_MATRIX_RAINDROPS,// Randomly changes a single key's hue
RGB_MATRIX_JELLYBEAN_RAINDROPS,// Randomly changes a single key's hue and saturation
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
RGB_MATRIX_TYPING_HEATMAP,// How hot is your WPM!
RGB_MATRIX_DIGITAL_RAIN,// That famous computer simulation
By setting `RGB_MATRIX_CUSTOM_USER` (and/or `RGB_MATRIX_CUSTOM_KB`) in `rule.mk`, new effects can be defined directly from userspace, without having to edit any QMK core files.
To declare new effects, create a new `rgb_matrix_user/kb.inc` that looks something like this:
`rgb_matrix_user.inc` should go in the root of the keymap directory.
`rgb_matrix_kb.inc` should go in the root of the keyboard directory.
```C
// !!! DO NOT ADD #pragma once !!! //
// Step 1.
// Declare custom effects using the RGB_MATRIX_EFFECT macro
// (note the lack of semicolon after the macro!)
RGB_MATRIX_EFFECT(my_cool_effect)
RGB_MATRIX_EFFECT(my_cool_effect2)
// Step 2.
// Define effects inside the `RGB_MATRIX_CUSTOM_EFFECT_IMPLS` ifdef block
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
// e.g: A simple effect, self-contained within a single method
staticboolmy_cool_effect(effect_params_t*params){
RGB_MATRIX_USE_LIMITS(led_min,led_max);
for(uint8_ti=led_min;i<led_max;i++){
rgb_matrix_set_color(i,0xff,0xff,0x00);
}
returnled_max<DRIVER_LED_TOTAL;
}
// e.g: A more complex effect, relying on external methods and state, with
For inspiration and examples, check out the built-in effects under `quantum/rgb_matrix_animation/`
## Colors
These are shorthands to popular colors. The `RGB` ones can be passed to the `setrgb` functions, while the `HSV` ones to the `sethsv` functions.
|RGB |HSV |
|-------------------|-------------------|
|`RGB_WHITE` |`HSV_WHITE` |
|`RGB_RED` |`HSV_RED` |
|`RGB_CORAL` |`HSV_CORAL` |
|`RGB_ORANGE` |`HSV_ORANGE` |
|`RGB_GOLDENROD` |`HSV_GOLDENROD` |
|`RGB_GOLD` |`HSV_GOLD` |
|`RGB_YELLOW` |`HSV_YELLOW` |
|`RGB_CHARTREUSE` |`HSV_CHARTREUSE` |
|`RGB_GREEN` |`HSV_GREEN` |
|`RGB_SPRINGGREEN` |`HSV_SPRINGGREEN` |
|`RGB_TURQUOISE` |`HSV_TURQUOISE` |
|`RGB_TEAL` |`HSV_TEAL` |
|`RGB_CYAN` |`HSV_CYAN` |
|`RGB_AZURE` |`HSV_AZURE` |
|`RGB_BLUE` |`HSV_BLUE` |
|`RGB_PURPLE` |`HSV_PURPLE` |
|`RGB_MAGENTA` |`HSV_MAGENTA` |
|`RGB_PINK` |`HSV_PINK` |
These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h). Feel free to add to this list!
## Additional `config.h` Options
```C
#define RGB_MATRIX_KEYPRESSES // reacts to 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_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_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_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT // Sets the default mode, if none has been set
```
## EEPROM storage
The EEPROM for it is currently shared with the RGBLIGHT system (it's generally assumed only one RGB would be used at a time), but could be configured to use its own 32bit address with:
```C
#define EECONFIG_RGB_MATRIX (uint32_t *)28
```
Where `28` is an unused index from `eeconfig.h`.
## Suspended state
To use the suspend feature, add this to your `<keyboard>.c`:
QMK has the ability to control RGB LEDs attached to your keyboard. This is commonly called *underglow*, due to the LEDs often being mounted on the bottom of the keyboard, producing a nice diffused effect when combined with a translucent case.

Some keyboards come with RGB LEDs preinstalled. Others must have them installed after the fact. See the [Hardware Modification](#hardware-modification) section for information on adding RGB lighting to your keyboard.
Currently QMK supports the following addressable LEDs on AVR microcontrollers (however, the white LED in RGBW variants is not supported):
* WS2811, WS2812, WS2812B, WS2812C, etc.
* SK6812, SK6812MINI, SK6805
These LEDs are called "addressable" because instead of using a wire per color, each LED contains a small microchip that understands a special protocol sent over a single wire. The chip passes on the remaining data to the next LED, allowing them to be chained together. In this way, you can easily control the color of the individual LEDs.
## Usage
On keyboards with onboard RGB LEDs, it is usually enabled by default. If it is not working for you, check that your `rules.mk` includes the following:
```make
RGBLIGHT_ENABLE= yes
```
At minimum you must define the data pin your LED strip is connected to, and the number of LEDs in the strip, in your `config.h`. If your keyboard has onboard RGB LEDs, and you are simply creating a keymap, you usually won't need to modify these.
|`RGB_DI_PIN` |The pin connected to the data pin of the LEDs |
|`RGBLED_NUM` |The number of LEDs connected |
|`RGBLED_SPLIT` |(Optional) For split keyboards, the number of LEDs connected on each half directly wired to `RGB_DI_PIN` |
Then you should be able to use the keycodes below to change the RGB lighting to your liking.
### Color Selection
QMK uses [Hue, Saturation, and Value](https://en.wikipedia.org/wiki/HSL_and_HSV) to select colors rather than RGB. The color wheel below demonstrates how this works.
<imgsrc="gitbook/images/color-wheel.svg"alt="HSV Color Wheel"width="250"/>
Changing the **Hue** cycles around the circle.<br>
Changing the **Saturation** moves between the inner and outer sections of the wheel, affecting the intensity of the color.<br>
Changing the **Value** sets the overall brightness.<br>
Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration.
Note: For versions older than 0.6.117, The mode numbers were written directly. In `quantum/rgblight.h` there is a contrast table between the old mode number and the current symbol.
### Effect and Animation Toggles
Use these defines to add or remove animations from the firmware. When you are running low on flash space, it can be helpful to disable animations you are not using.
If you need to change your RGB lighting in code, for example in a macro to change the color whenever you switch layers, QMK provides a set of functions to assist you. See [`rgblight.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight.h) for the full list, but the most commonly used functions include:
|`rgblight_setrgb_at(r, g, b, index)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `index` is between 0 and `RGBLED_NUM` (not written to EEPROM) |
|`rgblight_sethsv_at(h, s, v, index)` |Set a single LED to the given HSV value, where `h`/`s`/`v` are between 0 and 255, and `index` is between 0 and `RGBLED_NUM` (not written to EEPROM) |
|`rgblight_setrgb_range(r, g, b, start, end)`|Set a continuous range of LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `start`(included) and `stop`(excluded) are between 0 and `RGBLED_NUM` (not written to EEPROM)|
|`rgblight_sethsv_range(h, s, v, start, end)`|Set a continuous range of LEDs to the given HSV value, where `h`/`s`/`v` are between 0 and 255, and `start`(included) and `stop`(excluded) are between 0 and `RGBLED_NUM` (not written to EEPROM)|
|`rgblight_setrgb(r, g, b)` |Set effect range LEDs to the given RGB value where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|`rgblight_setrgb_master(r, g, b)` |Set the LEDs on the master side to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|`rgblight_setrgb_slave(r, g, b)` |Set the LEDs on the slave side to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|`rgblight_sethsv_master(h, s, v)` |Set the LEDs on the master side to the given HSV value, where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
|`rgblight_sethsv_slave(h, s, v)` |Set the LEDs on the slave side to the given HSV value, where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
Example:
```c
rgblight_sethsv(HSV_WHITE,0);// led 0
rgblight_sethsv(HSV_RED,1);// led 1
rgblight_sethsv(HSV_GREEN,2);// led 2
// The above functions automatically calls rgblight_set(), so there is no need to call it explicitly.
// Note that it is inefficient to call repeatedly.
|`rgblight_increase_hue()` |Increase the hue for effect range LEDs. This wraps around at maximum hue |
|`rgblight_increase_hue_noeeprom()` |Increase the hue for effect range LEDs. This wraps around at maximum hue (not written to EEPROM) |
|`rgblight_decrease_hue()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue |
|`rgblight_decrease_hue_noeeprom()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue (not written to EEPROM) |
|`rgblight_increase_sat()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation |
|`rgblight_increase_sat_noeeprom()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation (not written to EEPROM) |
|`rgblight_decrease_sat()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation |
|`rgblight_decrease_sat_noeeprom()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation (not written to EEPROM) |
|`rgblight_increase_val()` |Increase the value for effect range LEDs. This wraps around at maximum value |
|`rgblight_increase_val_noeeprom()` |Increase the value for effect range LEDs. This wraps around at maximum value (not written to EEPROM) |
|`rgblight_decrease_val()` |Decrease the value for effect range LEDs. This wraps around at minimum value |
|`rgblight_decrease_val_noeeprom()` |Decrease the value for effect range LEDs. This wraps around at minimum value (not written to EEPROM) |
|`rgblight_sethsv(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|`rgblight_sethsv_noeeprom(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
#### query
|Function |Description |
|-----------------------|-----------------|
|`rgblight_get_mode()` |Get current mode |
|`rgblight_get_hue()` |Get current hue |
|`rgblight_get_sat()` |Get current sat |
|`rgblight_get_val()` |Get current val |
## Colors
These are shorthands to popular colors. The `RGB` ones can be passed to the `setrgb` functions, while the `HSV` ones to the `sethsv` functions.
|RGB |HSV |
|-------------------|-------------------|
|`RGB_WHITE` |`HSV_WHITE` |
|`RGB_RED` |`HSV_RED` |
|`RGB_CORAL` |`HSV_CORAL` |
|`RGB_ORANGE` |`HSV_ORANGE` |
|`RGB_GOLDENROD` |`HSV_GOLDENROD` |
|`RGB_GOLD` |`HSV_GOLD` |
|`RGB_YELLOW` |`HSV_YELLOW` |
|`RGB_CHARTREUSE` |`HSV_CHARTREUSE` |
|`RGB_GREEN` |`HSV_GREEN` |
|`RGB_SPRINGGREEN` |`HSV_SPRINGGREEN` |
|`RGB_TURQUOISE` |`HSV_TURQUOISE` |
|`RGB_TEAL` |`HSV_TEAL` |
|`RGB_CYAN` |`HSV_CYAN` |
|`RGB_AZURE` |`HSV_AZURE` |
|`RGB_BLUE` |`HSV_BLUE` |
|`RGB_PURPLE` |`HSV_PURPLE` |
|`RGB_MAGENTA` |`HSV_MAGENTA` |
|`RGB_PINK` |`HSV_PINK` |
```c
rgblight_setrgb(RGB_ORANGE);
rgblight_sethsv_noeeprom(HSV_GREEN);
rgblight_setrgb_at(RGB_GOLD,3);
rgblight_sethsv_range(HSV_WHITE,0,6);
```
These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h). Feel free to add to this list!
## Changing the order of the LEDs
If you want to make the logical order of LEDs different from the electrical connection order, you can do this by defining the `RGBLIGHT_LED_MAP` macro in your `config.h`.
Normally, the contents of the LED buffer are output to the LEDs in the same order.
For keyboards that use the RGB LEDs as a backlight for each key, you can also define it as in the example below.
```c
// config.h
#define RGBLED_NUM 30
/* RGB LED Conversion macro from physical array to electric array */
#define LED_LAYOUT( \
L00, L01, L02, L03, L04, L05, \
L10, L11, L12, L13, L14, L15, \
L20, L21, L22, L23, L24, L25, \
L30, L31, L32, L33, L34, L35, \
L40, L41, L42, L43, L44, L45 ) \
{ \
L05, L04, L03, L02, L01, L00, \
L10, L11, L12, L13, L14, L15, \
L25, L24, L23, L22, L21, L20, \
L30, L31, L32, L33, L34, L35, \
L46, L45, L44, L43, L42, L41 \
}
/* RGB LED logical order map */
/* Top->Bottom, Right->Left */
#define RGBLIGHT_LED_MAP LED_LAYOUT( \
25, 20, 15, 10, 5, 0, \
26, 21, 16, 11, 6, 1, \
27, 22, 17, 12, 7, 2, \
28, 23, 18, 13, 8, 3, \
29, 24, 19, 14, 9, 4 )
```
## Clipping Range
Using the `rgblight_set_clipping_range()` function, you can prepare more buffers than the actual number of LEDs, and output some of the buffers to the LEDs. This is useful if you want the split keyboard to treat left and right LEDs as logically contiguous.
You can set the Clipping Range by executing the following code.
If your keyboard lacks onboard underglow LEDs, you may often be able to solder on an RGB LED strip yourself. You will need to find an unused pin to wire to the data pin of your LED strip. Some keyboards may break out unused pins from the MCU to make soldering easier. The other two pins, VCC and GND, must also be connected to the appropriate power pins.
Steve Losh described the [Space Cadet Shift](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/) quite well. Essentially, when you tap Left Shift on its own, you get an opening parenthesis; tap Right Shift on its own and you get the closing one. When held, the Shift keys function as normal. Yes, it's as cool as it sounds, and now even cooler supporting Control and Alt as well!
## Usage
Firstly, in your keymap, do one of the following:
- Replace the Left Shift key with `KC_LSPO` (Left Shift, Parenthesis Open), and Right Shift with `KC_RSPC` (Right Shift, Parenthesis Close).
- Replace the Left Control key with `KC_LCPO` (Left Control, Parenthesis Open), and Right Control with `KC_RCPC` (Right Control, Parenthesis Close).
- Replace the Left Alt key with `KC_LAPO` (Left Alt, Parenthesis Open), and Right Alt with `KC_RAPC` (Right Alt, Parenthesis Close).
- Replace any Shift key in your keymap with `KC_SFTENT` (Right Shift, Enter).
|`KC_LSPO` |Left Shift when held, `(` when tapped |
|`KC_RSPC` |Right Shift when held, `)` when tapped |
|`KC_LCPO` |Left Control when held, `(` when tapped |
|`KC_RCPC` |Right Control when held, `)` when tapped |
|`KC_LAPO` |Left Alt when held, `(` when tapped |
|`KC_RAPC` |Right Alt when held, `)` when tapped |
|`KC_SFTENT`|Right Shift when held, Enter when tapped |
## Caveats
Space Cadet's functionality can conflict with the default Command functionality when both Shift keys are held at the same time. See the [Command feature](feature_command.md) for info on how to change it, or make sure that Command is disabled in your `rules.mk` with:
```make
COMMAND_ENABLE= no
```
## Configuration
By default Space Cadet assumes a US ANSI layout, but if your layout uses different keys for parentheses, you can redefine them in your `config.h`. In addition, you can redefine the modifier to send on tap, or even send no modifier at all. The new configuration defines bundle all options up into a single define of 3 key codes in this order: the `Modifier` when held or when used with other keys, the `Tap Modifer` sent when tapped (no modifier if `KC_TRNS`), finally the `Keycode` sent when tapped. Now keep in mind, mods from other keys will still apply to the `Keycode` if say `KC_RSFT` is held while tapping `KC_LSPO` key with `KC_TRNS` as the `Tap Modifer`.
|`LSPO_KEYS` |`KC_LSFT, LSPO_MOD, LSPO_KEY` |Send `KC_LSFT` when held, the mod and key defined by `LSPO_MOD` and `LSPO_KEY`. |
|`RSPC_KEYS` |`KC_RSFT, RSPC_MOD, RSPC_KEY` |Send `KC_RSFT` when held, the mod and key defined by `RSPC_MOD` and `RSPC_KEY`. |
|`LCPO_KEYS` |`KC_LCTL, KC_LSFT, KC_9` |Send `KC_LCTL` when held, the mod `KC_LSFT` with the key `KC_9` when tapped. |
|`RCPC_KEYS` |`KC_RCTL, KC_RSFT, KC_0` |Send `KC_RCTL` when held, the mod `KC_RSFT` with the key `KC_0` when tapped. |
|`LAPO_KEYS` |`KC_LALT, KC_LSFT, KC_9` |Send `KC_LALT` when held, the mod `KC_LSFT` with the key `KC_9` when tapped. |
|`RAPC_KEYS` |`KC_RALT, KC_RSFT, KC_0` |Send `KC_RALT` when held, the mod `KC_RSFT` with the key `KC_0` when tapped. |
|`SFTENT_KEYS` |`KC_RSFT, KC_TRNS, SFTENT_KEY` |Send `KC_RSFT` when held, no mod with the key `SFTENT_KEY` when tapped. |
|`SPACE_CADET_MODIFIER_CARRYOVER` |*Not defined* |Store current modifiers before the hold mod is pressed and use them with the tap mod and keycode. Useful for when you frequently release a modifier before triggering Space Cadet. |
## Obsolete Configuration
These defines are used in the above defines internally to support backwards compatibility, so you may continue to use them, however the above defines open up a larger range of flexibility than before. As an example, say you want to not send any modifier when you tap just `KC_LSPO`, with the old defines you had an all or nothing choice of using the `DISABLE_SPACE_CADET_MODIFIER` define. Now you can define that key as: `#define LSPO_KEYS KC_LSFT, KC_TRNS, KC_9`. This tells the system to set Left Shift if held or used with other keys, then on tap send no modifier (transparent) with the `KC_9`.
Many keyboards in the QMK Firmware repo are "split" keyboards. They use two controllers—one plugging into USB, and the second connected by a serial or an I<sup>2</sup>C connection over a TRRS or similar cable.
Split keyboards can have a lot of benefits, but there is some additional work needed to get them enabled.
QMK Firmware has a generic implementation that is usable by any board, as well as numerous board specific implementations.
For this, we will mostly be talking about the generic implementation used by the Let's Split and other keyboards.
!> ARM is not yet supported for Split Keyboards. Progress is being made, but we are not quite there, yet.
## Hardware Configuration
This assumes that you're using two Pro Micro-compatible controllers, and are using TRRS jacks to connect to two halves.
### Required Hardware
Apart from diodes and key switches for the keyboard matrix in each half, you will need 2x TRRS sockets and 1x TRRS cable.
Alternatively, you can use any sort of cable and socket that has at least 3 wires.
If you want to use I<sup>2</sup>C to communicate between halves, you will need a cable with at least 4 wires and 2x 4.7kΩ pull-up resistors.
#### Considerations
The most commonly used connection is a TRRS cable and jacks. These provide 4 wires, making them very useful for split keyboards, and are easy to find.
However, since one of the wires carries VCC, this means that the boards are not hot pluggable. You should always disconnect the board from USB before unplugging and plugging in TRRS cables, or you can short the controller, or worse.
Another option is to use phone cables (as in, old school RJ-11/RJ-14 cables). Make sure that you use one that actually supports 4 wires/lanes.
However, USB cables, SATA cables, and even just 4 wires have been known to be used for communication between the controllers.
!> Using USB cables for communication between the controllers works just fine, but the connector could be mistaken for a normal USB connection and potentially short out the keyboard, depending on how it's wired. For this reason, they are not recommended for connecting split keyboards.
### Serial Wiring
The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0 (aka PDO or pin 3) between the two Pro Micros.
?> Note that the pin used here is actually set by `SOFT_SERIAL_PIN` below.

### I<sup>2</sup>C Wiring
The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0/pin 3 and PD1/pin 2, respectively) between the two Pro Micros.
The pull-up resistors may be placed on either half. It is also possible to use 4 resistors and have the pull-ups in both halves, but this is unnecessary in simple use cases.

## Firmware Configuration
To enable the split keyboard feature, add the following to your `rules.mk`:
```make
SPLIT_KEYBOARD= yes
```
If you're using a custom transport (communication method), then you will also need to add:
```make
SPLIT_TRANSPORT= custom
```
### Setting Handedness
By default, the firmware does not know which side is which; it needs some help to determine that. There are several ways to do this, listed in order of precedence.
#### Handedness by Pin
You can configure the firmware to read a pin on the controller to determine handedness. To do this, add the following to your `config.h` file:
```c
#define SPLIT_HAND_PIN B7
```
This will read the specified pin. If it's high, then the controller assumes it is the left hand, and if it's low, it's assumed to be the right side.
#### Handedness by EEPROM
This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout.
To enable this method, add the following to your `config.h` file:
```c
#define EE_HANDS
```
However, you'll have to flash the EEPROM files for the correct hand to each controller. You can do this manually, or there are targets for avrdude and dfu to do this, while flashing the firmware:
*`:avrdude-split-left`
*`:avrdude-split-right`
*`:dfu-split-left`
*`:dfu-split-right`
*`:dfu-util-split-left`
*`:dfu-util-split-right`
This setting is not changed when re-initializing the EEPROM using the `EEP_RST` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox]()'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files.
You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common).
#### Handedness by `#define`
You can set the handedness at compile time. This is done by adding the following to your `config.h` file:
```c
#define MASTER_RIGHT
```
or
```c
#define MASTER_LEFT
```
If neither are defined, the handedness defaults to `MASTER_LEFT`.
### Communication Options
Because not every split keyboard is identical, there are a number of additional options that can be configured in your `config.h` file.
```c
#define USE_I2C
```
This enables I<sup>2</sup>C support for split keyboards. This isn't strictly for communication, but can be used for OLED or other I<sup>2</sup>C-based devices.
```c
#define SOFT_SERIAL_PIN D0
```
This sets the pin to be used for serial communication. If you're not using serial, you shouldn't need to define this.
However, if you are using serial and I<sup>2</sup>C on the board, you will need to set this, and to something other than D0 and D1 (as these are used for I<sup>2</sup>C communication).
```c
#define SELECT_SOFT_SERIAL_SPEED {#}`
```
If you're having issues with serial communication, you can change this value, as it controls the communication speed for serial. The default is 1, and the possible values are:
* **`0`**: about 189kbps (Experimental only)
* **`1`**: about 137kbps (default)
* **`2`**: about 75kbps
* **`3`**: about 39kbps
* **`4`**: about 26kbps
* **`5`**: about 20kbps
### Hardware Configuration Options
There are some settings that you may need to configure, based on how the hardware is set up.
```c
#define MATRIX_ROW_PINS_RIGHT { <row pins> }
#define MATRIX_COL_PINS_RIGHT { <col pins> }
```
This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency).
This allows you to specify a different set of encoder pins for the right side.
```c
#define RGBLIGHT_SPLIT
```
This option enables synchronization of the RGB Light modes between the controllers of the split keyboard. This is for keyboards that have RGB LEDs that are directly wired to the controller (that is, they are not using the "extra data" option on the TRRS cable).
```c
#define RGBLED_SPLIT { 6, 6 }
```
This sets how many LEDs are directly connected to each controller. The first number is the left side, and the second number is the right side.
?> This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable it, if it's not.
```c
#define SPLIT_USB_DETECT
```
This option changes the startup behavior to detect an active USB connection when delegating master/slave. If this operation times out, then the half is assume to be a slave. This is the default behavior for ARM, and required for AVR Teensy boards (due to hardware limitations).
?> This setting will stop the ability to demo using battery packs.
```c
#define SPLIT_USB_TIMEOUT 2500
```
This sets the maximum timeout when detecting master/slave when using `SPLIT_USB_DETECT`.
## Additional Resources
Nicinabox has a [very nice and detailed guide](https://github.com/nicinabox/lets-split-guide) for the Let's Split keyboard, that covers most everything you need to know, including troubleshooting information.
However, the RGB Light section is out of date, as it was written long before the RGB Split code was added to QMK Firmware. Instead, wire each strip up directly to the controller.
<!-- I may port this information later, but for now ... it's very nice, and covers everything -->
[Stenography](https://en.wikipedia.org/wiki/Stenotype) is a method of writing most often used by court reports, closed-captioning, and real-time transcription for the deaf. In stenography words are chorded syllable by syllable with a mixture of spelling, phonetic, and shortcut (briefs) strokes. Professional stenographers can reach 200-300 WPM without any of the strain usually found in standard typing and with far fewer errors (>99.9% accuracy).
The [Open Steno Project](http://www.openstenoproject.org/) has built an open-source program called Plover that provides real-time translation of steno strokes into words and commands. It has an established dictionary and supports
## Plover with QWERTY Keyboard
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
To use Plover with QMK just enable NKRO and optionally adjust your layout if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
## Plover with Steno Protocol
Plover also understands the language of several steno machines. QMK can speak a couple of these languages, TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`.
When QMK speaks to Plover over a steno protocol Plover will not use the keyboard as input. This means that you can switch back and forth between a standard keyboard and your steno keyboard, or even switch layers from Plover to standard and back without needing to activate/deactivate Plover.
In this mode Plover expects to speak with a steno machine over a serial port so QMK will present itself to the operating system as a virtual serial port in addition to a keyboard. By default QMK will speak the TX Bolt protocol but can be switched to GeminiPR; the last protocol used is stored in non-volatile memory so QMK will use the same protocol on restart.
> Note: Due to hardware limitations you may not be able to run both a virtual serial port and mouse emulation at the same time.
### TX Bolt
TX Bolt communicates the status of 24 keys over a very simple protocol in variable-sized (1-5 byte) packets.
### GeminiPR
GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything that is necessary for standard stenography, GeminiPR opens up many more options, including supporting non-English theories.
## Configuring QMK for Steno
Firstly, enable steno in your keymap's Makefile. You may also need disable mousekeys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them.
```Makefile
STENO_ENABLE= yes
MOUSEKEY_ENABLE= no
```
In your keymap create a new layer for Plover. You will need to include `keymap_steno.h`. See `planck/keymaps/steno/keymap.c` for an example. Remember to create a key to switch to the layer as well as a key for exiting the layer. If you would like to switch modes on the fly you can use the keycodes `QK_STENO_BOLT` and `QK_STENO_GEMINI`. If you only want to use one of the protocols you may set it up in your initialization function:
```C
voidmatrix_init_user(){
steno_set_mode(STENO_MODE_GEMINI);// or STENO_MODE_BOLT
}
```
Once you have your keyboard flashed launch Plover. Click the 'Configure...' button. In the 'Machine' tab select the Stenotype Machine that corresponds to your desired protocol. Click the 'Configure...' button on this tab and enter the serial port or click 'Scan'. Baud rate is fine at 9600 (although you should be able to set as high as 115200 with no issues). Use the default settings for everything else (Data Bits: 8, Stop Bits: 1, Parity: N, no flow control).
On the display tab click 'Open stroke display'. With Plover disabled you should be able to hit keys on your keyboard and see them show up in the stroke display window. Use this to make sure you have set up your keymap correctly. You are now ready to steno!
* More resources at the Plover [Learning Stenography](https://github.com/openstenoproject/plover/wiki/Learning-Stenography) wiki
## Interfacing with the code
The steno code has three interceptible hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
This function is called when a chord is about to be sent. Mode will be one of `STENO_MODE_BOLT` or `STENO_MODE_GEMINI`. This represents the actual chord that would be sent via whichever protocol. You can modify the chord provided to alter what gets sent. Remember to return true if you want the regular sending process to happen.
This function is called when a keypress has come in, before it is processed. The keycode should be one of `QK_STENO_BOLT`, `QK_STENO_GEMINI`, or one of the `STN_*` key values.
This function is called after a key has been processed, but before any decision about whether or not to send a chord. If `IS_PRESSED(record->event)` is false, and `pressed` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This is where to put hooks for things like, say, live displays of steno chords or keys.
## Keycode Reference
As defined in `keymap_steno.h`.
> Note: TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both.
The swap-hands action allows support for one-handed typing without requiring a separate layer. Set `SWAP_HANDS_ENABLE` in the Makefile and define a `hand_swap_config` entry in your keymap. Now whenever the `ACTION_SWAP_HANDS` command key is pressed the keyboard is mirrored. For instance, to type "Hello, World" on QWERTY you would type `^Ge^s^s^w^c W^wr^sd`
## Configuration
The configuration table is a simple 2-dimensional array to map from column/row to new column/row. Example `hand_swap_config` for Planck:
Note that the array indices are reversed same as the matrix and the values are of type `keypos_t` which is `{col, row}` and all values are zero-based. In the example above, `hand_swap_config[2][4]` (third row, fifth column) would return `{7, 2}` (third row, eighth column). Yes, this is confusing.
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
## Introduction
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/qmk/qmk_firmware/pull/451). Here's how algernon describes the feature:
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
## Explanatory Comparison with `ACTION_FUNCTION_TAP`
`ACTION_FUNCTION_TAP` can offer similar functionality to Tap Dance, but it's worth noting some important differences. To do this, let's explore a certain setup! We want one key to send `Space` on single-tap, but `Enter` on double-tap.
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if `SPC` and `a` are both typed within `TAPPING_TERM`. With the Tap Dance feature, that'll come out correctly as `SPC a` (even if both `SPC` and `a` are typed within the `TAPPING_TERM`.
To achieve this correct handling of interrupts, the implementation of Tap Dance hooks into two parts of the system: `process_record_quantum()`, and the matrix scan. These two parts are explained below, but for now the point to note is that we need the latter to be able to time out a tap sequence even when a key is not being pressed. That way, `SPC` alone will time out and register after `TAPPING_TERM` time.
## How to Use Tap Dance
But enough of the generalities; lets look at how to actually use Tap Dance!
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size.
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in you `config.h`:
```
#define TAPPING_TERM 175
```
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead.
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()` - takes a number, which will later be used as an index into the `tap_dance_actions` array.
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
*`ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
*`ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
* This is the same as `ACTION_TAP_DANCE_DUAL_ROLE`, but renamed to something that is clearer about its functionality. Both names will work.
*`ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
*`ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
*`ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
*`ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
Similar to the first option, the second option is good for simple layer-switching cases.
For more complicated cases, use the third or fourth options (examples of each are listed below).
Finally, the fifth option is particularly useful if your non-Tap-Dance keys start behaving weirdly after adding the code for your Tap Dance keys. The likely problem is that you changed the `TAPPING_TERM` time to make your Tap Dance keys easier for you to use, and that this has changed the way your other keys handle interrupts.
## Implementation Details
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and reset the timer.
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros.
# Examples
## Simple Example
Here's a simple example for a single definition:
1. In your `rules.mk`, add `TAP_DANCE_ENABLE = yes`
2. In your `config.h` (which you can copy from `qmk_firmware/keyboards/planck/config.h` to your keymap directory), add `#define TAPPING_TERM 200`
3. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
And then simply use `TD(X_CTL)` anywhere in your keymap.
If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace.
### Example 5: Using tap dance for advanced mod-tap and layer-tap keys
Tap dance can be used to emulate `MT()` and `LT()` behavior when the tapped code is not a basic keycode. This is useful to send tapped keycodes that normally require `Shift`, such as parentheses or curly braces—or other modified keycodes, such as `Control + X`.
Below your layers and custom keycodes, add the following:
```c
// tapdance keycodes
enumtd_keycodes{
ALT_LP// Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance.
};
// define a type containing as many tapdance states as you need
typedefenum{
SINGLE_TAP,
SINGLE_HOLD,
DOUBLE_SINGLE_TAP
}td_state_t;
// create a global instance of the tapdance state type
statictd_state_ttd_state;
// declare your tapdance functions:
// function to determine the current tapdance state
intcur_dance(qk_tap_dance_state_t*state);
// `finished` and `reset` functions for each tapdance keycode
Wrap each tapdance keycode in `TD()` when including it in your keymap, e.g. `TD(ALT_LP)`.
### Example 6: Using tap dance for momentary-layer-switch and layer-toggle keys
Tap Dance can be used to mimic MO(layer) and TG(layer) functionality. For this example, we will set up a key to function as `KC_QUOT` on single-tap, as `MO(_MY_LAYER)` on single-hold, and `TG(_MY_LAYER)` on double-tap.
The first step is to include the following code towards the beginning of your `keymap.c`:
```c
typedefstruct{
boolis_press_action;
intstate;
}tap;
//Define a type for as many tap dance states as you need
enum{
SINGLE_TAP=1,
SINGLE_HOLD=2,
DOUBLE_TAP=3
};
enum{
QUOT_LAYR=0//Our custom tap dance key; add any other tap dance keys to this enum
};
//Declare the functions to be used with your tap dance key(s)
The above code is similar to that used in previous examples. The one point to note is that we need to be able to check which layers are active at any time so we can toggle them if needed. To do this we use the `layer_state_is( layer )` function which returns `true` if the given `layer` is active.
The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `case:SINGLE_HOLD` works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `case:DOUBLE_TAP` works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`.
> This feature is currently *huge*, and should probably only be put on boards with a lot of memory, or for fun.
The terminal feature is a command-line-like interface designed to communicate through a text editor with keystrokes. It's beneficial to turn off auto-indent features in your editor.
To enable, stick this in your `rules.mk` or `Makefile`:
TERMINAL_ENABLE = yes
And use the `TERM_ON` and `TERM_OFF` keycodes to turn it on or off.
When enabled, a `> ` prompt will appear, where you'll be able to type, backspace (a bell will ding if you reach the beginning and audio is enabled), and hit enter to send the command. Arrow keys are currently disabled so it doesn't get confused. Moving your cursor around with the mouse is discouraged.
`#define TERMINAL_HELP` enables some other output helpers that aren't really needed with this page.
Pressing "up" and "down" will allow you to cycle through the past 5 commands entered.
## Future Ideas
* Keyboard/user-extensible commands
* Smaller footprint
* Arrow key support
* Command history - Done
* SD card support
* LCD support for buffer display
* Keycode -> name string LUT
* Layer status
* *Analog/digital port read/write*
* RGB mode stuff
* Macro definitions
* EEPROM read/write
* Audio control
## Current Commands
### `about`
Prints out the current version of QMK with a build date:
```
> about
QMK Firmware
v0.5.115-7-g80ed73-dirty
Built: 2017-08-29-20:24:44
```
### `print-buffer`
Outputs the last 5 commands entered
```
> print-buffer
0. print-buffer
1. help
2. about
3. keymap 0
4. help
5. flush-buffer
```
### `flush-buffer`
Clears command buffer
```
> flush-buffer
Buffer cleared!
```
### `help`
Prints out the available commands:
```
> help
commands available:
about help keycode keymap exit print-buffer flush-buffer
```
### `keycode <layer> <row> <col>`
Prints out the keycode value of a certain layer, row, and column:
Unicode characters can be input straight from your keyboard! There are some limitations, however.
QMK has three different methods for enabling Unicode input and defining keycodes:
## Basic Unicode
This method supports Unicode code points up to `0x7FFF`. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji.
Add the following to your `rules.mk`:
```make
UNICODE_ENABLE= yes
```
Then add `UC(c)` keycodes to your keymap, where _c_ is the code point (preferably in hexadecimal, up to 4 digits long). For example: `UC(0x45B)`, `UC(0x30C4)`.
## Unicode Map
This method supports all possible code points (up to `0x10FFFF`); however, you need to maintain a separate mapping table in your keymap file, which may contain at most 16384 entries.
Add the following to your `rules.mk`:
```make
UNICODEMAP_ENABLE= yes
```
Then add `X(i)` keycodes to your keymap, where _i_ is an array index into the mapping table:
```c
enumunicode_names{
BANG,
IRONY,
SNEK
};
constuint32_tPROGMEMunicode_map[]={
[BANG]=0x203D,// ‽
[IRONY]=0x2E2E,// ⸮
[SNEK]=0x1F40D,// 🐍
};
```
Then you can use `X(BANG)`, `X(SNEK)` etc. in your keymap.
### Lower and Upper Case
Characters often come in lower and upper case pairs, such as å and Å. To make inputting these characters easier, you can use `XP(i, j)` in your keymap, where _i_ and _j_ are the mapping table indices of the lower and upper case character, respectively. If you're holding down Shift or have Caps Lock turned on when you press the key, the second (upper case) character will be inserted; otherwise, the first (lower case) version will appear.
This is most useful when creating a keymap for an international layout with special characters. Instead of having to put the lower and upper case versions of a character on separate keys, you can have them both on the same key by using `XP()`. This helps blend Unicode keys in with regular alphas.
Due to keycode size constraints, _i_ and _j_ can each only refer to one of the first 128 characters in your `unicode_map`. In other words, 0 ≤ _i_ ≤ 127 and 0 ≤ _j_ ≤ 127. This is enough for most use cases, but if you'd like to customize the index calculation, you can override the [`unicodemap_index()`](https://github.com/qmk/qmk_firmware/blob/71f640d47ee12c862c798e1f56392853c7b1c1a8/quantum/process_keycode/process_unicodemap.c#L40) function. This also allows you to, say, check Ctrl instead of Shift/Caps.
## UCIS
This method also supports all possible code points. As with the Unicode Map method, you need to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you have to create a custom keycode or function that invokes this functionality.
Add the following to your `rules.mk`:
```make
UCIS_ENABLE= yes
```
Then define a table like this in your keymap file:
To use it, call `qk_ucis_start()`. Then, type the mnemonic for the character (such as "rofl"), and hit Space or Enter. QMK should erase the "rofl" text and insert the laughing emoji.
### Customization
There are several functions that you can define in your keymap to customize the functionality of this feature.
*`void qk_ucis_start_user(void)`– This runs when you call the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji.
*`void qk_ucis_success(uint8_t symbol_index)`– This runs when the input has matched something and has completed. By default, it doesn't do anything.
*`void qk_ucis_symbol_fallback (void)`– This runs when the input doesn't match anything. By default, it falls back to trying that input as a Unicode code.
You can find the default implementations of these functions in [`process_ucis.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c).
## Input Modes
Unicode input in QMK works by inputting a sequence of characters to the OS, sort of like a macro. Unfortunately, the way this is done differs for each platform. Specifically, each platform requires a different combination of keys to trigger Unicode input. Therefore, a corresponding input mode has to be set in QMK.
The following input modes are available:
* **`UC_OSX`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with Unicode Map).
To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar.
By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_OSX`](#input-key-configuration) with another keycode.
!> Using the _Unicode Hex Input_ input source may disable some Option based shortcuts, such as Option + Left Arrow and Option + Right Arrow.
* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
By default, this mode uses Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) to start Unicode input, but this can be changed by defining [`UNICODE_KEY_LNX`](#input-key-configuration) with another keycode. This might be required for IBus versions ≥1.5.15, where Ctrl+Shift+U behavior is consolidated into Ctrl+Shift+E.
* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Reboot afterwards.
This mode is not recommended because of reliability and compatibility issues; use the `UC_WINC` mode instead.
* **`UC_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues).
* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.9.0, supports code points up to `0x10FFFF` (all possible code points).
To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. Works reliably under all version of Windows supported by the app.
By default, this mode uses right Alt (`KC_RALT`) as the Compose key, but this can be changed in the WinCompose settings and by defining [`UNICODE_KEY_WINC`](#input-key-configuration) with another keycode.
### Switching Input Modes
There are two ways to set the input mode for Unicode: by keycode or by function. Keep in mind that both methods write to persistent storage (EEPROM), and are loaded each time the keyboard starts. So once you've set it the first time, you don't need to set it again unless you want to change it, or you've reset the EEPROM settings.
You can switch the input mode at any time by using one of the following keycodes. The easiest way is to add the ones you use to your keymap.
|`UNICODE_MODE_FORWARD`|`UC_MOD` |Next in list|[Cycle](#input-mode-cycling) through selected modes |
|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Prev in list|[Cycle](#input-mode-cycling) through selected modes in reverse|
|`UNICODE_MODE_OSX` |`UC_M_OS`|`UC_OSX` |Switch to macOS input |
|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input |
|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input |
|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input (not implemented) |
|`UNICODE_MODE_WINC` |`UC_M_WC`|`UC_WINC` |Switch to Windows input using WinCompose |
You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UC_LNX`). Since the function only needs to be called once, it's recommended that you do it in `eeconfig_init_user()` (or a similar function). For example:
```c
voideeconfig_init_user(void){
set_unicode_input_mode(UC_LNX);
}
```
### Audio Feedback
If you have the [Audio feature](feature_audio.md) enabled on the board, you can set melodies to be played when you press the above keys. That way you can have some audio feedback when switching input modes.
For instance, you can add these definitions to your `config.h` file:
```c
#define UNICODE_SONG_OSX COIN_SOUND
#define UNICODE_SONG_LNX UNICODE_LINUX
#define UNICODE_SONG_BSD MARIO_GAMEOVER
#define UNICODE_SONG_WIN UNICODE_WINDOWS
#define UNICODE_SONG_WINC UNICODE_WINDOWS
```
### Additional Customization
Because Unicode is a large and versatile feature, there are a number of options you can customize to make it work better on your system.
#### Start and Finish Input Functions
The functions for starting and finishing Unicode input on your platform can be overridden locally. Possible uses include customizing input mode behavior if you don't use the default keys, or adding extra visual/audio feedback to Unicode input.
*`void unicode_input_start(void)`– This sends the initial sequence that tells your platform to enter Unicode input mode. For example, it presses Ctrl+Shift+U on Linux and holds the Option key on macOS.
*`void unicode_input_finish(void)`– This is called to exit Unicode input mode, for example by pressing Space or releasing the Option key.
You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c).
#### Input Key Configuration
You can customize the keys used to trigger Unicode input for macOS, Linux and WinCompose by adding corresponding defines to your `config.h`. The default values match the platforms' default settings, so you shouldn't need to change this unless Unicode input isn't working, or you want to use a different key (e.g. in order to free up left or right Alt).
You can choose which input modes are available for cycling through. By default, this is disabled. If you want to enable it, limiting it to just the modes you use makes sense. Note that the values in the list are comma-delimited.
You can cycle through the selected modes by using the `UC_MOD`/`UC_RMOD` keycodes, or by calling `cycle_unicode_input_mode(offset)` in your code (`offset` is how many modes to move forward by, so +1 corresponds to `UC_MOD`).
By default, when the keyboard boots, it will initialize the input mode to the last one you used. You can disable this and make it start with the first mode in the list every time by adding the following to your `config.h`:
```c
#define UNICODE_CYCLE_PERSIST false
```
!> Using `UNICODE_SELECTED_MODES` means you don't have to initially set the input mode in `matrix_init_user()` (or a similar function); the Unicode system will do that for you on startup. This has the added benefit of avoiding unnecessary writes to EEPROM.
## `send_unicode_hex_string`
To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values separate by spaces.
For example, the table flip seen above would be `send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B")`
There are many ways to get a hex code, but an easy one is [this site](https://r12a.github.io/app-conversion/). Just make sure to convert to hexadecimal, and that is your string.
## Additional Language Support
In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware.
## International Characters on Windows
### AutoHotkey allows Windows users to create custom hotkeys among others.
The method does not require Unicode support in the keyboard itself but depends instead of [AutoHotkey](https://autohotkey.com) running in the background.
First you need to select a modifier combination that is not in use by any of your programs.
CtrlAltWin is not used very widely and should therefore be perfect for this.
There is a macro defined for a mod-tab combo `LCAG_T`.
Add this mod-tab combo to a key on your keyboard, e.g.: `LCAG_T(KC_TAB)`.
This makes the key behave like a tab key if pressed and released immediately but changes it to the modifier if used with another key.
In the default script of AutoHotkey you can define custom hotkeys.
<^<!<#a::Send, ä
<^<!<#<+a::Send, Ä
The hotkeys above are for the combination CtrlAltGui and CtrlAltGuiShift plus the letter a.
AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
### US International
If you enable the US International layout on the system, it will use punctuation to accent the characters.
For instance, typing "`a" will result in à.
You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout).
If you use more than one keyboard with a similar keymap, you might see the benefit in being able to share code between them. Create your own folder in `users/` named the same as your keymap (ideally your github username, `<name>`) with the following structure:
*`/users/<name>/` (added to the path automatically)
*`readme.md` (optional, recommended)
*`rules.mk` (included automatically)
*`config.h` (included automatically)
*`<name>.h` (optional)
*`<name>.c` (optional)
*`cool_rgb_stuff.c` (optional)
*`cool_rgb_stuff.h` (optional)
All this only happens when you build a keymap named `<name>`, like this:
make planck:<name>
For example,
make planck:jack
Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`.
!> This `name` can be [overridden](#override-default-userspace), if needed.
## `Rules.mk`
The `rules.mk` is one of the two files that gets processed automatically. This is how you add additional source files (such as `<name>.c`) will be added when compiling.
It's highly recommended that you use `<name>.c` as the default source file to be added. And to add it, you need to add it the SRC in `rules.mk` like this:
SRC += <name>.c
Additional files may be added in the same way - it's recommended you have one named `<name>`.c/.h to start off with, though.
The `/users/<name>/rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard.
For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can add support for that if the RGBLIGHT feature is enabled:
```make
ifeq($(strip$(RGBLIGHT_ENABLE)),yes)
# Include my fancy rgb functions source here
SRC+= cool_rgb_stuff.c
endif
```
Alternatively, you can `define RGB_ENABLE` in your keymap's `rules.mk` and then check for the variable in your userspace's `rules.mk` like this:
```make
ifdefRGB_ENABLE
# Include my fancy rgb functions source here
SRC+= cool_rgb_stuff.c
endif
```
### Override default userspace
By default the userspace used will be the same as the keymap name. In some situations this isn't desirable. For instance, if you use the [layout](feature_layouts.md) feature you can't use the same name for different keymaps (e.g. ANSI and ISO). You can name your layouts `mylayout-ansi` and `mylayout-iso` and add the following line to your layout's `rules.mk`:
```
USER_NAME := mylayout
```
This is also useful if you have multiple different keyboards with different features physically present on the board (such as one with RGB Lights, and one with Audio, or different number of LEDs, or connected to a different PIN on the controller).
## Configuration Options (`config.h`)
Additionally, `config.h` here will be processed like the same file in your keymap folder. This is handled separately from the `<name>.h` file.
The reason for this, is that `<name>.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `<name.h>` file in any `config.h` files will result in compile issues.
!>You should use the `config.h` for [configuration options](config_options.md), and the `<name>.h` file for user or keymap specific settings (such as the enum for layer or keycodes)
## Readme (`readme.md`)
Please include authorship (your name, github username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).
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/>.
```
You'd want to replace the year, name, email and github username with your info.
Additionally, this is a good place to document your code, if you wish to share it with others.
# Examples
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna).
For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace.
## Customized Functions
QMK has a bunch of [functions](custom_quantum_functions.md) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions.md#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap.
However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap!
For instance, let's look at the `layer_state_set_user()` function. You can enable the [Tri Layer State](ref_functions.md#olkb-tri-layers) functionality on all of your boards, while also retaining the Tri Layer functionality in your `keymap.c` files.
The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name.
The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else.
You can see a list of this and other common functions in [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in [`users/drashna`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna).
## Custom Features
Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace.
For instance, if you wanted to have a bunch of macros available, but only on certain boards (to save space), you could "hide" them being a `#ifdef MACROS_ENABLED`, and then enable it per board. To do this, add this to your rules.mk
```make
ifeq($(strip$(MACROS_ENABLED)),yes)
OPT_DEFS+= -DMACROS_ENABLED
endif
```
The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that.
Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace.
And in your `process_record_user` function, you'd do something like this:
If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too.
First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you wont have any overlapping keycodes
Then add `#include <name.h>` to all of your keymap.c files. This allows you to use these new keycodes without having to redefine them in each keymap.
Once you've done that, you'll want to set the keycode definitions that you need to the `<name>.h` file. For instance:
```c
#pragma once
#include"quantum.h"
#include"action.h"
#include"version.h"
// Define all of
enumcustom_keycodes{
KC_MAKE=SAFE_RANGE,
NEW_SAFE_RANGE//use "NEW_SAFE_RANGE" for keymap specific codes
};
```
Now you want to create the `<name>.c` file, and add this content to it:
caseKC_MAKE:// Compiles the firmware, and adds the flash command based on keyboard bootloader
if(!record->event.pressed){
uint8_ttemp_mod=get_mods();
uint8_ttemp_osm=get_oneshot_mods();
clear_mods();clear_oneshot_mods();
SEND_STRING("make "QMK_KEYBOARD":"QMK_KEYMAP);
#ifndef FLASH_BOOTLOADER
if((temp_mod|temp_osm)&MOD_MASK_SHIFT)
#endif
{//
#if defined(__arm__) // only run for ARM boards
SEND_STRING(":dfu-util");
#elif defined(BOOTLOADER_DFU) // only run for DFU boards
SEND_STRING(":dfu");
#elif defined(BOOTLOADER_HALFKAY) // only run for teensy boards
SEND_STRING(":teensy");
#elif defined(BOOTLOADER_CATERINA) // only run for Pro Micros
SEND_STRING(":avrdude");
#endif // bootloader options
}
if((temp_mod|temp_osm)&MOD_MASK_CTRL){
SEND_STRING(" -j8 --output-sync");
}
SEND_STRING(SS_TAP(X_ENTER));
set_mods(temp_mod);
}
break;
}
returnprocess_record_keymap(keycode,record);
}
```
For boards that may not have a shift button (such as on a macro pad), we need a way to always include the bootloader option. To do that, add the following to the `rules.mk` in your userspace folder:
```make
ifeq ($(strip $(FLASH_BOOTLOADER)), yes)
OPT_DEFS += -DFLASH_BOOTLOADER
endif
```
This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make <keyboard>:<keymap>`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time.
Also, holding `shift` will add the appropriate flashing command (`:dfu`, `:teensy`, `:avrdude`, `:dfu-util`) for a majority of keyboards. Holding `control` will add some commands that will speed up compiling time by processing multiple files at once.
And for the boards that lack a shift key, or that you want to always attempt the flashing part, you can add `FLASH_BOOTLOADER = yes` to the `rules.mk` of that keymap.
?> This should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely. And this doesn't support BootloadHID or mdloader.
Velocikey is a feature that lets you control the speed of lighting effects (like the Rainbow Swirl effect) with the speed of your typing. The faster you type, the faster the lights will go!
## Usage
For Velocikey to take effect, there are two steps. First, when compiling your keyboard, you'll need to set `VELOCIKEY_ENABLE=yes` in `rules.mk`, e.g.:
```
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no
STENO_ENABLE = no
EXTRAKEY_ENABLE = yes
VELOCIKEY_ENABLE = yes
```
Then, while using your keyboard, you need to also turn it on with the VLK_TOG keycode, which toggles the feature on and off.
The following light effects will all be controlled by Velocikey when it is enabled:
- RGB Breathing
- RGB Rainbow Mood
- RGB Rainbow Swirl
- RGB Snake
- RGB Knight
Support for LED breathing effects is planned but not available yet.
As long as Velocikey is enabled, it will control the speed regardless of any other speed setting that your RGB lights are currently on.
## Configuration
Velocikey doesn't currently support any configuration via keyboard settings. If you want to adjust something like the speed increase or decay rate, you would need to edit `velocikey.c` and adjust the values there to achieve the kinds of speeds that you like.
QMK has a staggering number of features for building your keyboard. It can take some time to understand all of them and determine which one will achieve your goal.
* [Advanced Keycodes](feature_advanced_keycodes.md) - Change layers, dual-action keys, and more. Go beyond typing simple characters.
* [Audio](feature_audio.md) - Connect a speaker to your keyboard for audio feedback, midi support, and music mode.
* [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state.
* [Backlight](feature_backlight.md) - LED lighting support for your keyboard.
* [Bluetooth](feature_bluetooth.md) - BlueTooth support for your keyboard.
* [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys.
* [Combos](feature_combo.md) - Custom actions for multiple key holds.
* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic").
* [Debounce API](feature_debounce_type.md) - Customization of debouncing algorithms, and the ability to add more/custom debouncing.
* [DIP Switch](feature_dip_switch.md) - Toggle switches for customizing board function.
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave.
* [Haptic Feedback](feature_haptic_feedback.md) - Add haptic feedback drivers to your board.
* [HD44780 LCD Display](feature_hd44780.md) - Support for LCD character displays using the HD44780 standard.
* [Key Lock](feature_key_lock.md) - Lock a key in the "down" state.
* [Layouts](feature_layouts.md) - Use one keymap with any keyboard that supports your layout.
* [Leader Key](feature_leader_key.md) - Tap the leader key followed by a sequence to trigger custom behavior.
* [LED Matrix](feature_led_matrix.md) - LED Matrix single color lights for per key lighting (Single Color, not RGB).
* [Macros](feature_macros.md) - Send multiple key presses when pressing only one physical key.
* [Mouse keys](feature_mouse_keys.md) - Control your mouse pointer from your keyboard.
* [OLED Driver](feature_oled_driver.md) - Add OLED screens to your keyboard.
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - Sticky Keys, lets you hit a key rather than holding it.
* [Pointing Device](feature_pointing_device.md) - Framework for connecting your custom pointing device to your keyboard.
* [PS2 Mouse](feature_ps2_mouse.md) - Driver for connecting a PS/2 mouse directly to your keyboard.
* [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard.
* [RGB Matrix](feature_rgb_matrix.md) - RGB Matrix lights for per key lighting.
* [Space Cadet](feature_space_cadet.md) - Use your left/right shift keys to type parenthesis and brackets.
* [Split Keyboard](feature_split_keyboard.md)
* [Stenography](feature_stenography.md) - Put your keyboard into Plover mode for stenography use.
* [Swap Hands](feature_swap_hands.md) - Mirror your keyboard for one handed usage.
* [Tap Dance](feature_tap_dance.md) - Make a single key do as many things as you want.
* [Terminal](feature_terminal.md) - CLI interface to the internals of your keyboard.
* [Thermal Printer](feature_thermal_printer.md) - Connect a thermal printer to your keyboard to be able to toggle on a printed log of everything you type.
# Flashing Instructions and Bootloader Information
There are quite a few different types of bootloaders that keyboards use, and just about all of the use a different flashing method. Luckily, projects like the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) aim to be compatible with all the different types without having to think about it much, but this article will describe the different types of bootloaders, and available methods for flashing them.
If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size in bytes (along with the max). To run this process manually, compile with the target `check-size`, eg `make planck/rev4:default:check-size`.
## DFU
Atmel's DFU bootloader comes on all atmega32u4 chips by default, and is used by many keyboards that have their own ICs on their PCBs (Older OLKB boards, Clueboards). Some keyboards may also use LUFA's DFU bootloader (or QMK's fork) (Newer OLKB boards) that adds in additional features specific to that hardware.
To ensure compatibility with the DFU bootloader, make sure this block is present your `rules.mk` (optionally with `lufa-dfu` or `qmk-dfu` instead):
1. Press the `RESET` keycode, or tap the RESET button (or short RST to GND).
2. Wait for the OS to detect the device
3. Erase the memory (may be done automatically)
4. Flash a .hex file
5. Reset the device into application mode (may be done automatically)
or:
make <keyboard>:<keymap>:dfu
### QMK DFU
QMK has a fork of the LUFA DFU bootloader that allows for a simple matrix scan for exiting the bootloader and returning to the application, as well as flashing an LED/making a ticking noise with a speaker when things are happening. To enable these features, use this block in your `config.h` (The key that exits the bootloader needs to be hooked-up to the INPUT and OUTPUT defined here):
#define QMK_ESC_OUTPUT F1 // usually COL
#define QMK_ESC_INPUT D5 // usually ROW
#define QMK_LED E6
#define QMK_SPEAKER C6
The Manufacturer and Product names are automatically pulled from your `config.h`, and "Bootloader" is added to the product.
To generate this bootloader, use the `bootloader` target, eg `make planck/rev4:default:bootloader`.
To generate a production-ready .hex file (containing the application and the bootloader), use the `production` target, eg `make planck/rev4:default:production`.
### DFU commands
There are a number of DFU commands that you can use to flash firmware to a DFU device:
*`:dfu` - This is the normal option and waits until a DFU device is available, and then flashes the firmware. This will check every 5 seconds, to see if a DFU device has appeared.
*`:dfu-ee` - This flashes an `eep` file instead of the normal hex. This is uncommon.
*`:dfu-split-left` - This flashes the normal firmware, just like the default option (`:dfu`). However, this also flashes the "Left Side" EEPROM file for split keyboards. _This is ideal for Elite C based split keyboards._
*`:dfu-split-right` - This flashes the normal firmware, just like the default option (`:dfu`). However, this also flashes the "Right Side" EEPROM file for split keyboards. _This is ideal for Elite C based split keyboards._
## Caterina
Arduino boards and their clones use the [Caterina bootloader](https://github.com/arduino/ArduinoCore-avr/tree/master/bootloaders/caterina) (any keyboard built with a Pro Micro, or clone), and uses the avr109 protocol to communicate through virtual serial. Bootloaders like [A-Star](https://www.pololu.com/docs/0J61/9) are based on Caterina.
To ensure compatibility with the Caterina bootloader, make sure this block is present your `rules.mk`:
1. Press the `RESET` keycode, or keep the boot pin shorted to GND while quickly shorting RST to GND
2. Wait for the OS to detect the device
3. Flash a .hex file
4. Reset the device into application mode (may be done automatically)
## BootloadHID
BootloadHID is a USB bootloader for AVR microcontrollers. The uploader tool requires no kernel level driver on Windows and can therefore be run without installing any DLLs.
To ensure compatibility with the bootloadHID bootloader, make sure this block is present your `rules.mk`:
```make
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER= bootloadHID
```
Compatible flashers:
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash) (recommended Windows GUI)
1. Enter the bootloader using any of the following methods:
* Tap the `RESET` keycode (may not work on all devices)
* Hold the salt key while plugging the keyboard in (usually documented within keyboard readme)
2. Wait for the OS to detect the device
3. Flash a .hex file
4. Reset the device into application mode (may be done automatically)
or:
make <keyboard>:<keymap>:bootloadHID
## STM32
All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same.
At the moment, no `BOOTLOADER` variable is needed on `rules.mk` for STM32.
1. Enter the bootloader using any of the following methods:
* Tap the `RESET` keycode (may not work on STM32F042 devices)
* If a reset circuit is present, tap the RESET button
* Otherwise, you need to bridge BOOT0 to VCC (via BOOT0 button or bridge), short RESET to GND (via RESET button or bridge), and then let go of the BOOT0 bridge
2. Wait for the OS to detect the device
3. Flash a .bin file
* You will receive a warning about the DFU signature; Just ignore it
4. Reset the device into application mode (may be done automatically)
* If you are building from command line (e.g. `make planck/rev6:default:dfu-util`), make sure that `:leave` is passed to the `DFU_ARGS` variable inside your `rules.mk` (e.g. `DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave`) so that your device resets after flashing
### STM32 Commands
There are a number of DFU commands that you can use to flash firmware to a STM32 device:
*`:dfu-util` - The default command for flashing to STM32 devices.
*`:dfu-util-split-left` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Left Side" EEPROM setting for split keyboards.
*`:dfu-util-split-right` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Right Side" EEPROM setting for split keyboards.
*`:st-link-cli` - This allows you to flash the firmware via ST-LINK's CLI utility, rather than dfu-util.
Quatre fois par an, QMK lance un processus pour fusionner les Breaking Changes. Un Breaking Change est un changement qui modifie la manière dont QMK fonctionne introduisant des incompatibilités ou des comportements dangereux. Nous n'effectuons ces changements que 4 fois par an afin que les utilisateurs n'aient pas peur de casser leurs keymaps en mettant à jour leur version de QMK.
Ce document présente les fusions de Breaking Change. Voici la liste des changements.
## Formattage de code Core avec clang-format
* Tous les fichiers core (`drivers/`, `quantum/`, `tests/`, et `tmk_core/`) seront formattés avec clang-format
* Un processus travis pour reformatter les PRs lors de la fusion a été mis en place
* Vous pouvez utiliser la nouvelle commande CLI `qmk cformat` afin de formatter avant de soumettre votre PR si vous le souhaitez.
## Nettoyage des descripteurs LUFA USB
* Nettoyage du code lié aux descripteurs USB HID sur les claviers AVR, afin de les rendre plus simple à lire et compréhensibles
* Plus d'information: https://github.com/qmk/qmk_firmware/pull/4871
* Normalement pas de changement de fonctionnement et aucune keymap modifiée.
## Migration des entrées de `ACTION_LAYER_MOMENTARY()` dans `fn_actions` vers des keycodes `MO()`
*`fn_actions` est déprécié, et ses fonctionnalités ont été remplacées par des keycodes directs et `process_record_user()`
* Supprimer cette fonctionnalité obsolète devrait aboutir à une réduction importante de la taille du firmware et de la complexité du code
* Il est recommandé que toutes les keymaps affectées remplacent `fn_actions` vers les fonctionnalités de [keycode custom](https://docs.qmk.fm/#/custom_quantum_functions) et [macro](https://docs.qmk.fm/#/feature_macros)
## Mise à jour Atreus vers les conventions de codage courantes
* Les doublons include guards ont contourné le comportement de traitement des headers attendu
* Il est recommandé pour toutes les keymaps affectées de supprimer le doublon de `<keyboard>/config.h` et `<keyboard>/keymaps/<user>/config.h` et de ne garder que des surcharges au niveau keymap
## Récupération des changements de fichier keymap langage de la fork ZSA
* Corrige une issue dans le fichier `keymap_br_abnt2.h` qui inclut la mauvaise souce (`keymap_common.h` au lieu de `keymap.h`)
* Met à jour le fichier `keymap_swedish.h` afin d'être spécifique au suédois et plus "nordique" en général.
* Toutes les keymaps qui utilisent ceci devront supprimer `NO_*` et le remplacer par `SE_*`.
## Mise à jour du repo afin d'utiliser LUFA comme un sous-module git
*`/lib/LUFA` supprimé du dépôt
* LUFA, définis comme un sous-module, pointe vers qmk/lufa
* Ceci devrait ajouter plus de flexibilité vers LUFA, et nous permet de garder le sous-module à jour bien plus facilement. Il avait environ 2 ans de retard, sans manière simple de corriger. Ce changement devrait simplifier la mise à jour dans le futur.
## Migration des entrées `ACTION_BACKLIGHT_*()` dans `fn_actions` vers des keycodes `BL_`
*`fn_actions` est déprécié, et ses fonctionnalités ont été remplacées par des keycodes directs et `process_record_user()`
* Toutes les keymaps utilisant ces actions doivent avoir les clés `KC_FN*` remplacées par les clés `BL_*` équivalentes
* Si vous utilisez actuellement `KC_FN*` vous devrez remplacer `fn_actions` avec les fonctionnalités de [keycode custom](https://docs.qmk.fm/#/custom_quantum_functions) et [macro](https://docs.qmk.fm/#/feature_macros)
## Remplacer l'alias `KC_DELT` par `KC_DEL`
*`KC_DELT` était un alias redondant et non documenté pour `KC_DELETE`
* Il a été supprimé et toutes ses utilisations ont été remplacées par l'alias plus courant `KC_DEL`
* Environ 90 keymaps (surtout des boards ErgoDox) ont été modifiées à cette fin
QMK (*Quantum Mechanical Keyboard*) est une communauté open source qui maintient le firmware QMK, la QMK Toolbox (*Boite à outil*), qmk.fm et leurs documentations. QMKFirmware est un firmware dédié aux claviers qui est basé sur [tmk\_keyboard](http://github.com/tmk/tmk_keyboard). Il offre des fonctionnalités très utiles pour les contrôleurs Atmel AVR, et, plus spécifiquement pour [les produits d'OLKB](http://olkb.com), le clavier [ErgoDox EZ](http://www.ergodox-ez.com), et pour les [produits Clueboard](http://clueboard.co/). Il prend désormais aussi en charge les processeurs ARM qui utilisent ChibiOS. Vous pouvez l'utiliser pour contrôler un clavier personnalisé soudé à la main ou alors sur un clavier avec un PCB personnalisé.
## Comment l'obtenir
Si vous souhaitez contribuer à une disposition de clavier (keymap), ou à des fonctionnalités de QMK alors le plus simple est de [forker le dépôt avec Github](https://github.com/qmk/qmk_firmware#fork-destination-box) puis cloner le dépôt localement pour y faire des changements. Vous pourrez pousser vos changements sur github puis ouvrir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) depuis votre fork Github.
Sinon, vous pouvez aussi le télécharger directement en ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), ou le cloner avec git en ssh (`git@github.com:qmk/qmk_firmware.git`), ou https (`https://github.com/qmk/qmk_firmware.git`).
## Comment le compiler
Avant d'être prêt à compiler vous allez devoir [installer un environnement](getting_started_build_tools.md) pour les développements AVR et/ou ARM. Une fois ceci fait, vous pourrez utiliser la commande `make` pour compiler le clavier et la disposition avec une commande de ce type :
make planck/rev4:default
Cette commande compilera la révision `rev4` du clavier `planck` avec la disposition `default`. Notez que tous les claviers n'ont pas forcément de révisions (aussi appelées sous-projects ou dossiers, ou en en Anglais «subprojects» ou «folder»). Cette option peut donc être omise:
make preonic:default
## Comment le personnaliser
QMK a beaucoup de [fonctionnalités](features.md) à explorer, et [une documentation](http://docs.qmk.fm) très abondante que vous pourrez parcourir. La plupart des fonctionnalités vous permettrons de modifier vos [dispositions](keymap.md) (keymaps) et de changer [les codes de caractères](keycodes.md) (keycodes).
Ce document décrit le processus de QMK pour la gestion des breaking changes. Un breaking change est un changement qui modifie la manière dont QMK fonctionne introduisant des incompatibilités ou des comportements dangereux. Nous limitons ces changements afin que les utilisateurs n'aient pas peur de casser leurs keymaps en mettant à jour leur version de QMK.
La période de breaking change est quand nous allons fusionner un PR qui change QMK d'une manière dangereuse ou inattendue. Il y a une période interne de test afin de nous assurer que les problèmes résiduels sont rares ou impossible à prévoir.
## Qu'est-ce qui a été inclus dans des Breaking Changes précédents?
* [30 août 2019](ChangeLog/20190830.md)
## Quand va être le prochain Breaking Change?
Le prochain Breaking Change est planifié pour le 29 novembre.
### Dates importantes
* [x] 21 septembre 2019 - `future` est créé. Il va être rebasé de manière hebdomadaire.
* [ ] 01 novembre 2019 - `future` fermé aux nouveaux PRs.
* [ ] 01 novembre 2019 - Appel aux testeurs.
* [ ] 27 novembre 2019 - `master` est bloqué, pas de PRs fusionnés.
* [ ] 29 novembre 2019 - `future` est fusionné dans `master`.
* [ ] 30 novembre 2019 - `master` est débloqué. Les PRs peuvent à nouveau être fusionnés.
## Quels changements seront inclus?
Pour voir une liste de candidats de breaking changes, vous pouvez regardez la liste des [labels `breaking_change`](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). De nouveaux changements peuvent être ajoutés entre maintenant et lorsque `future` est fermée, et un PR avec ce label n'est pas garanti d'être fusionné.
Si vous souhaitez que votre breaking change soit inclus dans ce tour, vous devez créer un PR avec le label `breaking_change` et faire en sorte qu'il soit accepté avant que `future` ne soit fermé. Une fois `future` fermé, aucun nouveau breaking change sera accepté.
Critère d'acceptation:
* Le PR est complété et prêt à fusionner
* Le PR a un ChangeLog
# Checklists
Cette section documente plusieurs processus que nous utilisons en lançant le processus de Breaking Change.
## Rebase `future` de `master`
Ceci est lancé chaque vendredi tant que `future` est ouvert.
Processus:
```
cd qmk_firmware
git checkout master
git pull --ff-only
git checkout future
git rebase master
git push --force
```
## Créer la branche `future`
Ceci est fait immédiatement après la fusion de la branche `future` précédente.
*`qmk_firmware` git commands
* [ ]`git checkout master`
* [ ]`git pull --ff-only`
* [ ]`git checkout -b future`
* [ ] Modifie `readme.md`
* [ ] Ajoute un message en haut qui indique que c'est une branche de test.
* [ ] Ajoute un lien vers ce document
* [ ]`git commit -m 'Branch point for <DATE> Breaking Change'`
* [ ]`git tag breakpoint_<YYYY>_<MM>_<DD>`
* [ ]`git tag <next_version>` # Evite que le label point d'arrêt soit confondu par un incrément de version
* [ ]`git push origin future`
* [ ]`git push --tags`
## 4 Semaines Avant la Fusion
*`future` est maintenant fermé aux nouveaux PRs, seul des correctifs pour les PRs courants peuvent être mergés
* Envoi de l'appel aux testeurs
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 1 Semaine Avant la Fusion
* Annonce que master sera fermée entre <2joursavant> à <Jourdelafusion>
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 2 Jours Avant la Fusion
* Annonce que master est fermé pour 2 jours
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## Jour de la fusion
*`qmk_firmware` git commands
* [ ]`git checkout future`
* [ ]`git pull --ff-only`
* [ ]`git rebase origin/master`
* [ ] Modifie `readme.md`
* [ ] Supprimer les notes à propos de `future`
* [ ] Regroupe ChangeLog dans un fichier.
* [ ]`git commit -m 'Merge point for <DATE> Breaking Change'`
* [ ]`git push origin future`
* Actions sur Github
* [ ] Crée un PR pour `future`
* [ ] S'assurer que Travis ne relève aucun problème
Cette page décrit comment configurer et utiliser la CLI QMK.
# Vue d'ensemble
La CLI de QMK permet de simplifier la compilation et l'intéraction avec les clavier QMK. Nous avons définis plusieurs commandes pour simplifier et rationaliser les tâches telles qu'obtenir et compiler le firmware QMK, créer de nouvelles keymaps, et plus.
* [CLI globale](#global-cli)
* [CLI locale](#local-cli)
* [Les commandes CLI](#cli-commands)
# Pré-requis
La CLI nécessite Python 3.5 ou plus récent. Nous essayons de limiter le nombre de pré-requis, mais vous allez aussi devoir installer les paquets listés dans le fichier [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt).
# CLI globale
QMK met à disposition une CLI installable qui peut être utilisée pour configurer votre environnement de compilation QMK, fonctionne avec QMK, et qui rend l'utilisation de plusieurs copies de `qmk_firmware` plus simple. Nous recommandons d'installer et de mettre à jour ceci régulièrement.
## Installer en utilisant Homebrew (macOS, quelques Linux)
Si vous avez installé [Homebrew](https://brew.sh) vous pouvez entrer ce qui suit et installer QMK:
```
brew tap qmk/qmk
brew install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
## Installer en utilisant easy_install ou pip
Si votre système n'est pas listé ci-dessus, vous pouvez installer QMK manuellement. Premièrement, vérifiez que vous avez bien installé Python 3.5 (ou plus récent) et pip. Ensuite, installez QMK avec cette commande:
```
pip3 install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
## Paquets pour d'autres systèmes d'exploitation
Nous recherchons des gens pour créer et maintenir un paquet `qmk` pour plus de systèmes d'exploitation. Si vous voulez créer un paquet pour votre système d'exploitation, suivez ces directives:
* Suivez les bonnes pratiques pour votre système d'exploitation lorsqu'elles entrent en conflit avec ces directives
* Documentez pourquoi dans un commentaire lorsque vous ne les suivez pas
* Installez en utilisant un virtualenv
* Expliquez à l'utilisateur de définir la variable d'environnement `QMK_Home` pour "check out" les sources du firmware à un autre endroit que `~/qmk_firmware`.
# CLI locale
Si vous ne voulez pas utiliser la CLI globale, il y a une CLI locale empaquetée avec `qmk_firmware`. Vous pouvez le trouver dans `qmk_firmware/bin/qmk`. Vous pouvez lancer la commande `qmk` depuis n'importe quel répertoire et elle fonctionnera toujours sur cette copie de `qmk_firmware`.
**Exemple**:
```
$ ~/qmk_firmware/bin/qmk hello
Ψ Hello, World!
```
## Limitations de la CLI locale
Il y a quelques limitations à la CLI locale comparé à la globale:
* La CLI locale ne supporte pas `qmk setup` ou `qmk clone`
* La CLI locale n'opère pas sur le même arbre `qmk_firmware`, même si vous avez plusieurs dépôts clonés.
* La CLI locale ne s'exécute pas dans un virtualenv, donc il y a des risques que des dépendances seront en conflit
# Les commandes CLI
## `qmk compile`
Cette commande permet de compiler le firmware de n'importe quel répertoire. Vous pouvez compiler des exports JSON de <https://config.qmk.fm> ou compiler des keymaps du dépôt.
**Utilisation pour les exports de configuration**:
```
qmk compile <configuratorExport.json>
```
**Utilisation pour les Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
## `qmk cformat`
Cette commande formatte le code C en utilisant clang-format. Lancez-la sans arguments pour formatter tout le code core, ou passez les noms de fichiers à la ligne de commande pour la lancer sur des fichiers spécifiques.
**Utilisation**:
```
qmk cformat [file1] [file2] [...] [fileN]
```
## `qmk config`
Cette commande vous permet de configurer le comportement de QMK. Pour la documentation complète de `qmk config`, regardez [Configuration de CLI](cli_configuration.md).
Ce document explique comment fonctionne la commande `qmk config`.
# Introduction
La configuration pour QMK CLI est un système clé/valeur. Chaque clé est composée d'une sous-commande et d'un argument séparé par une virgule. Cela permet une traduction simple et directe entre les clés de configuration et l'argument qu'elle définit.
## Exemple simple
Comme exemple, regardons la commande `qmk compile --keyboard clueboard/66/rev4 --keymap default`.
Il y a deux arguments de ligne de commande qui peuvent être lu de la configuration:
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
Maintenant, je peux lancer la commande `qmk compile` sans avoir à spécifier mon clavier et keymap à chaque fois.
## Définir les options par défaut
Parfois, il est utile de partager une configuration entre plusieurs commandes. Par exemple, plusieurs commandes prennent un argument `--keyboard`. Plutôt que de devoir définir cette valeur pour chaque commande, vous pouvez définir une valeur d'utilisateur qui sera utilisée par toutes les commandes qui prennent cet argument.
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
# CLI Documentation (`qmk config`)
La commande `qmk config` est utilisée pour intéragir avec la configuration sous-jacente. Lancée sans argument, elle affiche la configuration courante. Lorsque des arguments sont définis, ils sont considérés comme étant des jetons de configuration, qui sont des chaînes de caractère ne contenant aucun espace avec le format suivant:
<subcommand|general|default>[.<key>][=<value>]
## Définir des valeurs de configuration
Vous pouvez définir des valeurs de configuration en mettant le caractère égal (=) dans votre clé de configuration. La clé doit toujours être dans le format complet `<section>.<key>`.
Exemple:
```
$ qmk config default.keymap=default
default.keymap: None -> default
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Lire des valeurs de configuration
Vous pouvez lire les valeurs de configuration pour la totalité de la configuration, une seule clé, ou une section entière. Vous pouvez aussi spécifier plusieurs clés pour afficher plus d'une valeur.
### Exemple avec la totalité de la configuration
qmk config
### Exemple avec une section entière
qmk config compile
### Exemple avec une clé unique
qmk config compile.keyboard
### Exemple avec plusieurs clés
qmk config user compile.keyboard compile.keymap
## Supprimer des valeurs de configuration
Vous pouvez supprimer une valeur de configuration en la définissant avec la chaîne spéciale `None`.
Exemple:
```
$ qmk config default.keymap=None
default.keymap: default -> None
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Plusieurs opérations
Vous pouvez combiner plusieures opérations d'écriture et de lecture en une seule commande. Elle seront exécutées et affichées dans l'ordre:
👍🎉 Premièrement, merci de prendre le temps de lire ceci et de contribuer! 🎉👍
Les contributions de tiers nous aide à améliorer et faire grandir QMK. Nous voulons rendre les pull requests et le processus de contribution utile et simple à la fois pour les contributeurs et les mainteneurs. C'est pourquoi nous avons mis en places des directives pour les contibuteurs afin que votre pull request puisse être accepté sans changement majeur.
* [Aperçu du projet](#project-overview)
* [Conventions de codage](#coding-conventions)
* [Directives générales](#general-guidelines)
* [Que veut dire le code de conduite pour moi?](#what-does-the-code-of-conduct-mean-for-me)
## Je ne veux pas lire tout ce pavé! J'ai juste une question!
Si vous voulez poser une question sur QMK, vous pouvez le faire sur le [sous-reddit OLKB](https://reddit.com/r/olkb) ou sur [Discord](https://discord.gg/Uq7gcHh).
Merci de garder ceci en tête:
* Cela peut prendre plusieurs heures pour que quelqu'un réponde à votre question. Merci d'être patient!
* Tous ceux impliqués avec QMK fait don de son temps et de son énergie. Nous ne sommes pas payés pour travailler sur ou répondre aux questions concernant QMK.
* Essayez de poser vos questions de manière à ce qu'elles soient le plus simple à répondre possible. Si vous n'êtes pas sûrs de savoir comment faire, voici quelques bon guides (en anglais):
QMK est majoritairement écrit en C, avec quelques fonctions et parties spécifiques écrites en C++. Il est destiné aux processeurs intégrés que l'on trouve dans des clavier, particulièrement AVR ([LUFA](http://www.fourwalledcubicle.com/LUFA.php)) et ARM ([ChibiOS](http://www.chibios.com)). Si vous maîtrisez déjà la programmation sur Arduino, vous trouverez beaucoup de concepts et de limitations familiers. Une expérience préalable avec les Arduino n'est pas nécessaire à contribuer avec succès à QMK.
<!-- FIXME: We should include a list of resources for learning C here. -->
# Où trouver de l'aide?
Si vous avez besoin d'aide, vous pouvez [ouvrir une issue](https://github.com/qmk/qmk_firmware/issues) ou [un chat sur Discord](https://discord.gg/Uq7gcHh).
# Comment contribuer?
Vous n'avez encore jamais contribué à un projet open source? Vous vous demandez comment les contributions dans QMK fonctionnent? Voici un aperçu rapide!
0. Enregistrez-vous sur [GitHub](https://github.com).
1. Définissez une keymap à contribuer, [trouvez une issue](https://github.com/qmk/qmk_firmware/issues) que vous souhaitez corriger, ou [une fonction](https://github.com/qmk/qmk_firmware/issues?q=is%3Aopen+is%3Aissue+label%3Afeature) que vous voulez ajouter.
2. Créez un fork sur le dépôt associé avec une issue sur votre compte GitHub. Cela veut dire que vous allez avoir une copie du dépôt sous `votre-login-GitHub/qmk_firmware`.
3. Clonez le dépôt sur votre macine locale en utilisant `git clone https://github.com/login-github/repository-name.git`.
4. Si vous travaillez sur une nouvelle fonctionnalité, pensez à ouvrir une issue pour parler avec nous du travail que vous souhaitez démarrer.
5. Créez une nouvelle branche pour votre correctif en utilisant `git checkout -b nom-de-branche`.
6. Faites les changements nécessaires pour corriger le problème ou ajouter la fonctionnalité.
7. Utilisez `git add chemin-de-fichier` pour ajouter les contenus des fichiers modifiés au "snapshot" que git utilise pour gérer l'état du projet, appelé aussi l'index.
8. Utilisez `git commit -m "Insérez une description courte des changements (en anglais)"` pour enregistrer le contenu de l'index avec un message descriptif.
9. Poussez les changements vers votre dépôt sur GitHub en utilisant `git push origin nom-de-branche`.
10. Créez un pull request sur [QMK Firmware](https://github.com/qmk/qmk_firmware/pull/new/master).
11. Donnez un titre à votre pull request en utilisant une description courte des changements que vous avez fait et ajoutez le numéro de l'issue ou du bug associé avec votre changement. Les commentaires de PR devraient se faire en anglais de préférence. Par exemple, vous pouvez utiliser un titre tel que celui-là: "Added more log outputting to resolve #4352".
12. Dans la description du pull request, expliquez les changements que vous avez fait et tous les problèmes qui existent, selon vous, sur le pull request que vous avez fait. Vous pouvez aussi utiliser la description pour poser des questions au mainteneur. Il n'est pas nécessaire que votre pull request soit parfait (aucun pull request ne l'est), le reviewer sera là pour vous aider à résoudre les problèmes et l'améliorer!
13. Attendez que le pull request soit revu par un mainteneur.
14. Faites des changements au pull request si le mainteneur le recommande.
15. Célébrez votre succès une fois votre pull request fusionné!
# Conventions de codage
La grande majorité de notre style est plutôt simple à comprendre. Si vous connaissez C ou Python, vous ne devriez pas avoir trop de difficulté avec notre style.
* [Conventions de codage - C](coding_conventions_c.md)
* [Conventions de codage - Python](coding_conventions_python.md)
# Directives générales
Nous avons un certain nombre de type de changements dans QMK, chacun nécessitant un niveau de rigueur différent. Nous voulons que vous gardiez les directives suivantes en tête quel que soit le changement que vous êtes en train de faire.
* Séparez les PR dans des unités logiques. Par exemple, ne soumettez pas un PR qui couvre deux fonctionnalités séparées, soumettez plutôt un PR pour chaque fonctionnalité.
* Vérifiez les espaces blancs non nécessaires avec `git diff --check` avant de commit.
* Assurez-vous que votre code compile.
* Keymaps: Assurez-vous que `make keyboard:your_new_keymap` ne renvoie pas d'erreur.
* Claviers: Assurez-vous que `make keyboard:all` ne renvoie pas d'erreur.
* Core: Assurez-vous que `make all` ne renvoie pas d'erreur.
* Assurez-vous que les messages de commit soient compréhensibles d'eux-même. Vous devriez écrire une description simple (pas plus de 70 caractères) sur la première ligne, suivi d'une ligne vide, suivi d'un détail de votre commit, si nécessaire. Exemple:
```
Adjust the fronzlebop for the kerpleplork
The kerpleplork was intermittently failing with error code 23. The root cause was the fronzlebop setting, which causes the kerpleplork to activate every N iterations.
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
```
## Documentation
La documentation est l'une des manière les plus simples de démarrer la contribution sur QMK. Il est simple de trouver des endroits où la documentation est fausse ou incomplète, et il est tout aussi simple de la corriger! Nous avons aussi grandement besoin de quelqu'un pour éditer notre documentation, donc si vous avez des compétences en édition mais que vous n'êtes pas sûr de savoir où aller, n'hésitez pas [demandez de l'aide](#where-can-i-go-for-help)!
Vous trouverez toute notre documentation dans le répertoire `qmk_firmware/docs`, ou si vous préférez utiliser des outils web, vous pouvez cliquer sur le bouton "Suggest An Edit" en haut de chaque page sur http://docs.qmk.fm/.
Lorsque vous donnez des exemples de code dans la documentation, essayez de suivre les conventions de nommage utilisées ailleurs dnas la documentation. Par exemple, standardisez les enums en utilisant `my_layers` ou `my_keycodes` afin de garder une consistance:
```c
enummy_layers{
_FIRST_LAYER,
_SECOND_LAYER
};
enummy_keycodes{
FIRST_LAYER=SAFE_RANGE,
SECOND_LAYER
};
```
## Keymaps
La plupart des contributeurs débutants démarrent avec leurs keymaps personnelles. Nous essayons de garder les standards pour les keymaps pluôt simple (les keymaps reflètent, après tout, la personnalité de leurs créateurs) mais nous demandons que vous suiviez les directives suivantes afin que d'autres puissent découvrir et apprendre de votre keymap.
* Ecrivez un fichier `readme.md` en utilisant [la template](documentation_templates.md).
* Tous les PR de keymaps doivent être "squashés", donc si la manière dont vos commits sont squashés vous est important, vous devez le faire vous-même.
* Ne regroupez pas des fonctionnalités avec votre PR de keymap. Envoyez d'abord votre fonctionnalité, puis créez un second PR pour la keymap.
* N'incluez pas de fichier `Makefile` dans votre dossier de keymap (ils ne sont plus utilisés)
* Mettez à jour les copyrights dans les en-têtes de fichiers (cherchez `%YOUR_NAME%`)
## Claviers
Les claviers sont la raison d'être de QMK. Certains claviers sont maintenus par la communauté, alors que d'autre sont maintenus par les gens responsables de la création du clavier. Le fichier `readme.md` devrait vous informer de qui maintient le clavier. Si vous avez des questions concernant un clavier en particulier, vous pouvez [Ouvrir une issue](https://github.com/qmk/qmk_firmware/issues) et tagger le mainteneur dans votre question.
Nous vous demandons aussi que vous suiviez ces directives:
* Ecrivez un fichier `readme.md` en utilisant [le template](documentation_templates.md).
* Gardez un nombre de commits raisonnable, ou nous squasherons votre PR.
* Ne regroupez pas des fonctionnalités avec le PR pour votre clavier. Envoyez d'abord votre fonctionnalité, puis créez un second PR pour le clavier.
* Appelez les fichiers `.c`/`.h` du nom du dossier parent, par exemple `/keyboards/<kb1>/<kb2>/<kb2>.[ch]`
* N'incluez pas de fichier `Makefile` dans votre dossier de keymap (ils ne sont plus utilisés)
* Mettez à jour les copyrights dans les en-têtes de fichiers (cherchez `%YOUR_NAME%`)
## Quantum/TMK Core
Faites attention d'être sûr d'implémenter votre nouvelle fonctionnalité de la meilleure manière qu'il soit avant d'investir beaucoup de travail à son développement. Vous pouvez apprendre les bases de QMK en lisant [Comprendre QMK](understanding_qmk.md), qui vous donnera une idée du flux du programme QMK. A partir de là, parlez nous afin de définir la meilleure façon d'implémenter votre idée. Il y a deux façons principale de le faire:
* [Chat sur Discord](https://discord.gg/Uq7gcHh)
* [Ouvrir une Issue](https://github.com/qmk/qmk_firmware/issues/new)
Les PR de nouvelles fonctionnalités de de correction de bug affectent tous les claviers. Nous sommes aussi dans un processus de restructuration de QMK. Pour cette raison, il est absolument nécessaire que tout changement important ou significatif soit discuté avant que l'implémentation soit faite. Si vous ouvrez un PR sans nous avoir parlé, préparez vous à faire des refontes significatives si vous changements ne sont pas compatibles avec ce que nous avons planifié.
Voici quelques choses à garder en tête lorsque vous travaillez sur une fonctionnalité ou un bug fix.
* **Désactivé par défaut** - la mémoire est plutôt limitée sur la plupart des puces que QMK supporte, et il est important que les keymaps courantes ne soient pas cassées. S'il vous plaît faites que vos features doivent être **activées** plutôt que désactivées. Si vous pensez qu'elle devrait être activée par défaut, ou que cela réduit la taille du code, parlez-nous en.
* **Compilez localement avant de soumettre** - Cela devrait aller sans dire, mais votre code doit compiler! Notre système Travis devrait relever les problèmes, mais il est généralement plus rapide de compiler quelques claviers en local plutôt que d'attendre le retour des résultats
* **Faites attention aux révisions et différentes bases de puces** - beaucoup de claviers ont des révisions qui permettent des changements de configuration mineurs, voir des bases de chip différentes. Essayez de faire que votre fonctionnalité soit supportée à la fois sur ARM et AVR, ou désactivez-là automatiquement sur les plateformes non supportées.
* **Expliquez votre fonctionnalité** - Documentez-là dans `docs/`, soit dans un nouveau fichier, ou dans une partie d'un fichier existant. Si vous ne la documentez pas, personne ne pourra bénéficier de votre dur labeur.
Nous vous demandons aussi de suivre ces ces directives:
* Gardez un nombre de commits raisonnable, ou nous squasherons votre PR.
* Ne regroupez pas des claviers ou des keymaps avec des changements core. Soumettez vos changements core en premier.
* Ecrivez des [Tests Unitaires](unit_testing.md) pour votre fonctionnalité.
* Suivez le style du fichier que vous modifiez. Si le style n'est pas clair ou qu'il y a un mélange de fichiers, vous devriez vous conformer aux [conventions de codage](#coding-conventions) au dessus.
## Refactoriser
Afin de maintenir une vision claire sur comment les choses sont architectuées dans QMK, nous essayons de planifier des refactorisations en profondeur et qu'un collaborateur fasse le changement. Si vous avez une idée de refactorisation, ou une suggestion, [ouvrez une issue] [open an issue](https://github.com/qmk/qmk_firmware/issues), nous adorons discuter de comment améliorer QMK.
# Que veut dire le code de conduite pour moi?
Note [Code De Conduite](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) veut dire que vous avez la responsabilité de traiter tout le monde dans le projet avec respect et courtoisie, peut importe leur identité. Si vous êtes victime d'une attitude ou de commentaires inapropriés, tels que décrit dans notre Code de Conduite, nous sommes là pour vous et nous ferons de notre mieux pour nous assurer que le fautif soit réprimandé, tel que décrit dans notre code.
# Instructions pour flasher et informations sur les bootloader
Les claviers utilisent différents types de bootloaders et certains doivent être flashés différement. Heureusement, certains projets comme la [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) ont pour objectifs de permettre de flasher les différents bootloader sans trop se faire de soucis et ça peut importe les manières de les flasher.
Si vous avez un bootloader sélectionné avec la variable `BOOTLOADER` dans votre fichier `rules.mk` alors QMK vas automatiquement calculer si votre fichier .hex n'est pas trop grand pour être flashé sur votre appareil, et il affichera la taille finale du firmware. Pour vérifier la taille manuellement, vous pouvez aussi compiler le firmware avec l'option `check-size`. Exemple : `make planck/rev4:default:check-size`.
## DFU
Le bootloader pour les processeurs Atmel DFU est fourni par défaut sur tous les processeurs atmega32u4. Celui-ci est utilisé par beaucoup de claviers plus vieux que les OLKB et Clueboard qui ont leur propre ICs sur leurs PCBs. D'autres claviers utilisent le bootloader DFU de LUFA (ou son fork QMK), notamment les nouveaux claviers OLKB. Ce dernier ajoute des fonctionnalités spécifiques sur le matériel.
Pour vérifier la compatibilité avec le bootloader DFU, vérifiez que ce bloc de code est présent dans votre fichier `rules.mk`. Parfois il peut être inscrit `lufa-dfu` ou `qmk-dfu` à la place.
1. Pressez le keycode `RESET`, ou appuyez sur le bouton physique RESET ou alors créez un contact entre RST et GND.
2. Attendez que l'OS detecte l'appareil.
3. Éffacez la mémoire, cela peut être fait automatiquement.
4. Flasher le fichier .hex.
5. Redémarrez l'appareil en mode «application», cela peut être fait automatiquement.
Alternativement:
make <keyboard>:<keymap>:dfu
### DFU QMK
QMK a un fork du bootloader LUFA DFU qui vous permet de faire un simple scan de la matrice pour quitter le bootloader et retourner à l'application. En même temps que le flash se produira, il est possible de faire flasher un led ou de produire un son via un haut parleur. Pour activer ces fonctionnalités, vous pouvez utiliser ce bloc dans votre fichier `config.h` (La touche permettant de quitter le bootloader a besoin d'être reliée entre les ports définis en INPUT et OUTPUT ici):
#define QMK_ESC_OUTPUT F1 // usually COL
#define QMK_ESC_INPUT D5 // usually ROW
#define QMK_LED E6
#define QMK_SPEAKER C6
Le fabriquant et le nom du produit proviennent de vos définitions dans fichier `config.h`, et la chaîne de caractère «bootloader» est ajoutée au nom du prodruit.
Pour génerer le bootloader, utilisez la cible `bootloader`. Exemple:`make planck/rev4:default:bootloader`.
Pour génerer un fichier .hex prêt pour la production qui contiendra tant l'application que le bootloader, utilisez la cible `production`. Exemple:`make planck/rev4:default:production`.
### Commandes DFU
Il y a plusieurs commandes DFU que vous pouvez utiliser pour flasher le firmware sur un appareil DFU.
*`:dfu` - C'est l'option normale qui attend qu'un appareil DFU soit disponible et qui flashe le firmware dès que c'est le cas. La vérification sera faite toutes les 5 secondes.
*`:dfu-ee` - Cette option flash un fichier `.eep` à la place d'un fichier `.hex`. Ce cas est plutôt rare.
*`:dfu-split-left` - Cette option flashe le firmware normal comme avec l'option (`:dfu`). Mais cela aussi flash le coté gauche du fichier EEPROM pour les claviers scindés. _C'est l'option idéale pour un clavier scindé basé sur le Elite C_
*`:dfu-split-right` - Cette option flashe le firmware normal comme avec l'option (`:dfu`). Mais cela aussi flash le coté droite du fichier EEPROM pour les claviers scindés. _C'est l'option idéale pour un clavier scindé basé sur le Elite C_
## Caterina
Les cartes arduinos et leurs clones utilisent le [bootloader Caterina](https://github.com/arduino/ArduinoCore-avr/tree/master/bootloaders/caterina) (tous les claviers utilisant un Pro Micro, ou un clone). Ils utilisent aussi le protocole avr109 pour communiquer en virtuellement en série (serial en Anglais). Les bootloaders comme le [A-Star](https://www.pololu.com/docs/0J61/9) sont basés sur Caterina.
Pour vérifier la compatibilité avec un bootloader Caterina, vérifiez que ce bloc est présent dans votre fichier `rules.mk`:
1. Pressez la touche avec le keycode `RESET`, ou reliez les ports GND et RST. Vous n'avez que 7 secondes pour flasher une fois que l'opération a été faite.
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Attendez que l'appareil redémarre automatiquement.
ou, utilisez:
make <keyboard>:<keymap>:avrdude
ou, si vous vous voulez flasher plusieurs claviers, utilisez la commande suivante:
make <keyboard>:<keymap>:avrdude-loop
Quand vous avez fini de flasher vos claviers, vous aurez besoin d'utiliser Ctrl + C ou alors la touche ayant la fonction similaire sur votre OS pour sortir de la boucle.
## Halfkay
Halfkay est un protocole ultra-simple développé par PJRC qui utilise HID et qui est fourni avec tous les Teensys après le modèle 2.0.
Pour vérifier la compatibilité avec le booloader Halfkay, vérifiez que ce bloc est présent dans votre fichier `rules.mk`:
[Teensy Loader en ligne de commande](https://www.pjrc.com/teensy/loader_cli.html) (Outil en ligne de commande recommandé)
Séquence de flash:
1. Pressez la touche du keycode `RESET`, ou reliez les ports RST et GND rapidement. Vous avez ensuite 7 secondes pour réaliser le flash.
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Redémarrez l'appareil en mode «application». Cela peut être fait automatiquement.
## USBasploader
USBasploader est un bootloader développé par matrixstorm. Il est utilisé sur des processeurs AVR non-USB comme le ATmega328P, qui fonctionne grâce à V-USB.
Pour vérifier la compatibilité avec le booloader USBasploader, vérifiez que ce bloc est présent dans votre fichier `rules.mk`:
1. Pressez la touche du keycode `RESET`, ou reliez le port de boot pendant que RST et GND snt reliés. Cela doit être fait très rapidement.
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Redémarrez l'appareil en mode «application». Cela peut être fait automatiquement.
## BootloadHID
BootloadHID est un bootloader pour les microcontroleurs AVR. L'utilitaire de téleversement ne demande pas de drivers au niveau du kernel et peut être lancé sans installer aucune DLLs.
Pour vérifier la compatibilité avec le bootloader bootloadHID, vérifiez que ce bloc existe dans votre fichier `rules.mk` :
```make
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER= bootloadHID
```
Utilitaires de flash compatibles:
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash) (Utilitaire avec interface graphique recommandé)
* [bootloadhid Command Line](https://www.obdev.at/products/vusb/bootloadhid.html) / `:BootloadHID` avec QMK (utilitaire en ligne de commande recommandé)
Séquence de flash
1. Entrez dans le bootloader en utilisant l'une de ces méthodes:
* Pressez la touche du keycode `RESET` (Cela ne fonctionnera pas sur certains appareils).
* Verouillez la touche «Salt» tout en branchant le clavier (Géneralement ce principe est documenté dans le fichier readme du clavier)
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Redémarrez l'appareil en mode «application». Cela peut être fait automatiquement.
Ou alors:
make <keyboard>:<keymap>:bootloadHID
## STM32
Tous les processeurs STM32 contiennent un bootloader installé en usine qui ne peut pas être modifié ou supprimé. Certains processeurs STM32 ont des bootloaders qui ne peuvent pas être programmés par USB (ex:STM32F103) mais le processus reste le même.
Pour le moment, aucune variable `BOOTLOADER` n'est nécessaire dans le fichier `rules.mk`.
* [dfu-util](https://github.com/Stefan-Schmidt/dfu-util) / `:dfu-util` (utilitaire en ligne de commande recommandé)
Séquence pour flasher:
1. Entrez dans le bootloader en utilisant l'une de ces méthodes:
* Utilisez une touche sur laquelle le keycode `RESET` (Cela peut ne pas fonctionner sur les appareils STM32F042)
* Si un circuit de réinitialisation (Reset) est présent alors utilisé le bouton qui lui est dédié.
* Autrement, vous devez réaliser une liaison entre BOOT0 et VCC (en appuyant sur le bouton ou à l'aide d'un pont) puis faire un pont entre RESET et GND et enfin relacher le pont BOOT0.
2. Attendre que l'os détecte l'appareil.
3. Flasher un fichier `.bin`.h
* Vous allez recevoir un avertissement à propos de la signature DFU. Ignorez-la.
4. Réinitialisez l'appareil en mode «application». Cela peut être fait automatiquement.
* Si vous êtes en train de travailler en ligne de commande, par exemple avec un `make planck/rev6:default:dfu-util` alors soyez bien sur que l'argument `:leave` est passé aux argument DFU grâce à la variable `DFU_ARGS` à l'intérieur de votre fichier `rules.mk` (Ex:`DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave`) afin que votre appareil redémarre après avoir été flashé.
### Commandes STM32
Il y a différentes commandes que vous pouvez utiliser pour flasher un firmware dans un appareil STM32:
*`:dfu-util` - La commande par défaut pour flasher un appareil STM32.
*`:dfu-util-split-left` - Permet de flasher un firmware normalement, tout comme l'option précedente mais permet de configurer le coté gauche des paramètres EEPROM sur un clavier scindé.
*`:dfu-util-split-right` - Permet de flasher un firmware normalement, tout comme l'option précedente mais permet de configurer le coté droit des paramètres EEPROM sur un clavier scindé.
*`:st-link-cli` - Cela permet de flasher le firmware avec l'utilitaire en ligne de commande ST-LINK's plutôt que d'utiliser dfu-util.
Il y a beaucoup de ressources pour trouver de l'aide avec QMK.
## Chat temps-réel
Vous trouverez des développeurs QMK et des utilisateurs sur notre [Serveur Discord](https://discord.gg/Uq7gcHh) principal. Il y a des canaux spécifiques dans le serveurs pour discuter des firmware, toolbox, hardware et configurateurs.
## Sous-Reddit OLKB
Le forum officiel de QMK est [/r/olkb](https://reddit.com/r/olkb) sur [reddit.com](https://reddit.com).
## Tickets GitHub
Vous pouvez ouvrir un [ticket sur GitHub](https://github.com/qmk/qmk_firmware/issues). Ceci est spécialement pratique lorsque votre problème demande une discussion long terme ou un débugage.
GitHub peut être un peu compliqué pour ceux qui n'y sont pas familier. Ce guide va vous expliquer chaque étape de "fork", clone et envoi d'un pull request avec QMK.
?> Ce guide part du principe que vous êtes suffisamment à l'aise pour envoyer commandes sur la ligne de commande et que vous avez Git installé sur votre système.
Commencez par la [page GitHub de QMK](https://github.com/qmk/qmk_firmware), et vous verrez un bouton dans le coin en haut à droite qui indique "Fork":

Si vous faites partie d'une organisation, vous aurez besoin de savoir quel compte utiliser pour le fork. Dans la plupart des cas, vous voudrez créer le fork dans votre compte personnel. Une fois le fork complet (cela peut quelque fois prendre un peu de temps), appuyez sur le bouton "Clone or download":

Faites attention à sélectionner "HTTPS", et sélectionnez le liens et copiez-le:

Ensuite, entrez `git clone` dans la ligne de commande, et collez votre lien:
Vous avez maintenant votre fork QMK sur votre machine locale, vous pouvez ajouter votre keymap, la compiler et la flasher sur votre board. Une fois heureux avec vos changements, vous pouvez les ajouter, commit, et pousser vers votre fork comme suit:
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
Vos changements existent maintenant dans votre fork sur GitHub. Si vous allez à cete adresse (`https://github.com/<whoeveryouare>/qmk_firmware`), vous pouvez créer un nouveau "Pull Request" en cliquant sur ce bouton:
Maintenant, vous pourrez voir exactement ce que vous avez commité. Si ça vous semble bien, vous pouvez le finaliser en cliquant sur "Create Pull Request":
Le but de cette page est d'expliquer les informations de base qui vous serons nécessaire pour travailler sur le projet QMK. Il a pour pré-requis que vous soyez familier à la navigation à l'aide d'un shell Unix, mais ne s'attend pas à ce que vous soyez familier avec C ou la compilation en utilisant make.
## Structure de base de QMK
QMK est un fork du projet [tmk_keyboard](https://github.com/tmk/tmk_keyboard) créé par [Jun Wako](https://github.com/tmk). Le code originel de TMK, avec quelques modifications, se trouve dans le dossier `tmk`. Les additions que QMK amène au projet se trouvent dans le dossier `quantum`. Les projets de clavier se trouvent dans les dossiers `handwired` et `keyboard`.
### Structure du Userspace
Dans le dossier `users` se trouve un répertoire pour chaque utilisateur. C'est un endroit où les utilisateurs peuvent mettre du code qui serait partagé entre plusieurs claviers. Merci de lire la documentation [Fonctionnalité Userspace](feature_userspace.md) pour plus d'information.
### Structure du projet clavier
Dans le dossier `keyboards`, son sous-dossier `handwired` et ses sous-dossiers pour les revendeurs et fabriquants (par exemple `clueboard`) se trouve un répertoire pour chaque projet clavier. Par exemple `qmk_firmware/keyboards/clueboard/2x1800`.
A l'intérieur, vous trouverez la structure suivante:
*`keymaps/`: différentes keymaps qui peuvent être compilées
*`rules.mk`: Ce fichier définit les options "make" par défaut. Ne modifiez pas ce fichier directement, utilisez à la place un `rules.mk` spécifique à la keymap.
*`config.h`: Ce fichier définit les options de compilation par défaut. Ne modifiez pas ce fichier directement, utilisez à la place un `config.h` spécifique à la keymap.
*`info.json`: Le fichier utilisé pour définir les options de layout de QMK Configurator. Voyez [Support Configurator](reference_configurator_support.md) pour plus d'information.
*`readme.md`: une brève description du clavier.
*`<keyboardName>.h`: Ce fichier définit le layout du fichier par rapport à la matrice de commutation.
*`<keyboardName>.c`: Ce fichier définit du code custom pour le clavier.
Pour plus d'information sur la structure du projet, voyez [Directives clavier QMK](hardware_keyboard_guidelines.md).
### Structure d'une Keymap
Dans chaque dossier keymap, vous allez trouver les fichiers suivants. Seul le fichier `keymap.c` est nécessaire, et si le reste des fichiers n'existent pas, les options par défaut seront choisies.
*`config.h`: les options de configuration de votre keymap
*`keymap.c`: tout le code de votre keymap, requis
*`rules.mk`: les features de QMK qui sont activées
*`readme.md`: une description de votre keymap, comment d'autres l'utiliseront, et des explications des fonctionnalités. Uploadez les images vers un service comme imgur.
Le système de compilation cherche automatiquement les fichiers de configuration dans l'ordre au dessus. Si vous souhaitez surcharger une configuration définie par un `config.h` précédent, vous devrez d'abord ajouter le code suivant.
```
#pragma once
```
Ensuite, pour surcharger l'option du fichier `config.h` précédent, vous devez `#undef` puis `#define` l'option à nouveau.
Voici à quoi l'ensemble du code resemble une fois regroupé:
QMK est un firmware Open Source pour votre clavier mécanique. Vous pouvez utiliser QMK pour customiser votre clavier de manière simple et puissante. Tout le monde, du débutant complet au développeur avancé, ont utilisé avec succès QMK pour customiser leur clavier. Ce guide vous aidera à faire de même, quelles que soient vos compétences.
Vous voulez savoir si votre clavier peut utiliser QMK? Si c'est un clavier mécanique que vous avez vous-même construit, il y a de bonnes chances que vous pouvez. Nous supportons un [grand nombre de "hobbyist boards"](http://qmk.fr/keyboards), donc même si votre clavier ne peut pas utiliser QMK, vous ne devriez pas avoir trop de problème pour en trouver un qui vous convienne.
## Vue d'ensemble
Il y a 7 sections principales dans ce guide:
* [Pour débuter](fr-FR/newbs_getting_started.md)
* [Compiler votre premier firmware en utilisant la ligne de commande](fr-FR/newbs_building_firmware.md)
* [Compiler votre premier firmware en utilisant l'interface graphique en ligne](fr-FR/newbs_building_firmware_configurator.md)
* [Flasher le Firmware](fr-FR/newbs_flashing.md)
* [Test et Débuggage](fr-FR/newbs_testing_debugging.md)
Ce guide a pour but principal d'aider quelqu'un qui n'a jamais compilé de logiciel avant. Les recommandations et les choix qu'il contient vont donc dans ce sens. Il y a des méthodes alternatives pour beaucoup de ces procédures, et nous supportons la plupart de ces alternatives. Si vous avez un doute sur comment accomplir une tâche, vous pouvez [nous demander de l'aide](fr-FR/getting_started_getting_help.md).
## Ressources additionnelles
* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) – Un blog créé par un utilisateur qui couvre les bases de l'utilisation du Firmware QMK, vue d'un point de vue d'un nouvel utilisateur (anglais).
## Ou, "Comment j'ai appris à ne plus m'en faire et aimer Git."
Ce document a pour but d'apprendre aux novices les meilleures solutions pour faciliter la contribution à QMK. Nous allons étudier le processus de contribution à QMK, détaillant quelques moyens de rendre cette tâche plus simple. Nous allons faire quelques erreurs afin de vous apprendre à les résoudre.
Ce document suppose les choses suivantes:
1. Vous avez un compte GitHub, et avez [créé un "fork" pour le dépôt qmk_firmware](fr-FR/getting_started_github.md) avec votre compte.
2. Vous avez [configuré votre environnement de compilation](fr-FR/newbs_getting_started.md?id=environment-setup).
## La branche master de votre fork: Mettre à jour souvent, ne jamais commit
Il est hautement recommandé pour le développement de QMK, peu importe ce qui est fait ou où, de garder votre branche `master` à jour, mais de ne ***jamais*** commit dessus. A la place, faites tous vos changement dans une branche de développement et crééz des "pull requests" de votre branche lorsque vous développez.
Pour réduire les chances de conflits de fusion (merge) — des cas où deux ou plus d'utilisateurs ont édité la même section d'un fichier en parallèle — gardez votre branche `master` relativement à jour et démarrez chaque nouveau développement en créant une nouvelle branche.
### Mettre à jour votre branche master
Pour garder votre branche `master` à jour, il est recommandé d'ajouter le dépôt du firmware QMK comme un dépôt distant (remote) dans git. pour se faire, ouvrez votre interface de ligne de commande Git et entrez:
Maintenant que c'est fait, vous pouvez vérifier les mises à jour au dépôt en lançant `git fetch upstream`. Cela récupère les branches et les tags — appelé de manière générale "refs" — du dépôt QMK, qui a maintenant le surnom `upstream`. Nous pouvons maintenant comparer les données sur notre "fork" `origin` à celles contenues par QMK.
Pour mettre à jour la branche master de votre "fork", lancez les commandes suivantes (en appuyant sur Enter après chaque ligne):
```bash
git checkout master
git fetch upstream
git pull upstream master
git push origin master
```
Cela vous change la branche courante en master, synchronise les données de réferences du dépôt QMK vers votre ordinateur. La commande pull tire les données de réferences vers votre branche courante puis les y téleverse. La commande push permet de pousser la branche courante (master) vers votre fork github.
### Faire des changements
Pour faire des changements, créez une nouvelle branche en entrant:
```bash
git checkout -b dev_branch
git push --set-upstream origin dev_branch
```
Ceci crée une branche nommée `dev_branch`, bascule vers cette branche, et ensuite sauvegarde cette nouvelle branche vers votre fork. L'argument `--set-upstream` demande à git d'utiliser votre fork et la branche `dev_branch` à chaque fois que vous utilisez `git push` ou `git pull` depuis cette branche. Vous ne devez l'utiliser que pour le premier "push", après celà, vous pouvez utiliser simplement `git push` ou `git pull`, sans le reste des arguments.
!> Avec `git push`, vous pouvez utiliser `-u` à la place de `--set-upstream`—`-u` est un alias pour `--set-upstream`.
Vous pouvez appeler votre branche à peu prêt comme vous voulez, toutefois il est recommandé d'utiliser un nom qui est lié aux changements que vous allez faire.
Par défaut, `git checkout -b` va faire de la branche actuelle la branche de base de votre nouvelle branche. Vous pouvez définir la base de votre nouvelle branche comme étant n'importe quelle branche existante qui n'est pas la courante en utilisant la commande:
```bash
git checkout -b dev_branch master
```
Maintenant que vous avez une branche de développement, ouvrez votre éditeur de texte et faites vos changements. Il est recommandé de faire beaucoup de petits commits dans votre branche. Ainsi, un changement qui crée un problème peut être plus facilement retracé et annulé si nécessaire. Pour faire un changement, éditez et sauvez n'importe quel fichier qui doit être mis à jour, ajoutez les à la *zone de staging* de Git, et commitez les vers votre branche:
```bash
git add path/to/updated_file
git commit -m "My commit message."
```
`git add` ajoute les fichiers qui ont été changés dans la *zone de staging* de Git, qui est sa "zone de chargement". Elle contient tous les changements qui vont être *validés* (committed) par `git commit`, qui sauvegarde les changements vers le dépôt. Utilisez des messages de validation descriptifs afin que vous puissiez savoir ce qui a changé d'un coup d'oeil.
!> Si vous changez beaucoup de fichiers, mais tous les fichiers font partie du même changement, vous pouvez utiliser `git add .` pour ajouter tous les fichiers changés dans le répertoire courant, plutôt que d'avoir à ajouter chaque fichiers individuellement.
### Publier Vos Changements
La dernière étape est de pousser vos changements vers votre fork. pour se faire, entrez `git push`. Git publie maintenant l'état courant de `dev_branch` vers votre fork.
## Résoudre Les Conflits De Merge
Parfois, lorsque votre travail sur une branche met beaucoup de temps à se compléter, des changements réalisés par d'autres peuvent entrer en conflit avec les changements que vous avez fait sur votre branche au moment où vous avez ouvert un pull request. Ceci est appelé un *conflit de merge*, et c'est ce qui arrive lorsque plusieurs personnes modifient les mêmes parties de mêmes fichiers.
### Rebaser Vos Changements
Un *rebase* est la manière pour Git de prendre les changements qui ont été faits à un point, les annuler, et les réappliquer sur un autre point. Dans le cas d'un conflit de merge, vous pouvez rebaser votre branche pour récupérer les changements qui ont été faits entre le moment où vous avez créé votre branche et le présent.
La commande `git rev-list` retourne le nombre de commits qui diffère entre la branche courante et la branche master de QMK. Nous lançons `git fetch` en premier afin d'être sûr que les refs qui représentent l'état courant du dépôt upstream soient à jour. Le résultat de la commande `git rev-list` retourne deux nombres:
Le premier nombre représente combien il y a eu de commits sur la branche courante depuis qu'elle a été créée, et le second nombre est combien de commits ont été faits sur la branche `upstream/master` depuis que la branche a été créée et, ainsi, les changements qui ne sont pas enregistrés sur la branche courante.
Maintenant que l'état actuel de la branche courante et la branche upstream sont connus, nous pouvons maintenant démarrer une opération de rebase:
```bash
git rebase upstream/master
```
Ceci dit à Git d'annuler les commits de la branche courrante puis de les réappliquer sur la branche master de QMK.
```bash
$ git rebase upstream/master
First, rewinding head to replay your work on top of it...
Applying: Commit #1
Using index info to reconstruct a base tree...
M conflicting_file_1.txt
Falling back to patching base and 3-way merge...
Auto-merging conflicting_file_1.txt
CONFLICT (content): Merge conflict in conflicting_file_1.txt
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0001 Commit #1
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
```
Ceci nous dit que nous avons un conflit de merge, et nous donne le nom du fichier en conflit. Ouvez le fichier conflictuel dans votre éditeur de texte et, quelque part dans le fichier, vous trouverez quelque chose comme ça:
```bash
<<<<<<< HEAD
<p>For help with any issues, email us at support@webhost.us.</p>
=======
<p>Need help? Email support@webhost.us.</p>
>>>>>>> Commit #1
```
La ligne `<<<<<<< HEAD` montre le début d'un conflit de merge et la ligne `>>>>>>> Commit #1` indique la fin, avec les sections conflictuelles séparées par `=======`. La partie du côté `HEAD` vient de la version du fichier provenant de la branche master de QMK, et la partie marquée avec le numéro du commit provient de la branche courrante.
Parce que Git suis *les changements des fichiers*, plutôt que les contenus des fichiers directement, si Git ne peut pas trouver le texte qu'il y avait dans le fichier avant que le commit soit fait, il ne saura pas comment modifier le fichier. Modifier le fichier à nouveau va résoudre le conflit. Faites votre changement, et sauvez le fichier.
```bash
<p>Need help? Email support@webhost.us.</p>
```
Maintenant, lancez:
```bash
git add conflicting_file_1.txt
git rebase --continue
```
Git enregistre le changement dans le fichier conflictuel, et continue à appliquer les commits depuis votre branche jusqu'à ce qu'il arrive à la fin.
Maintenant que vous avez configuré votre environnement de build, vous être prêts à compiler un firmware customisé. Pour cette section, nous allons utiliser trois programmes différents: votre explorateur de fichier, votre éditeur de texte et votre fenêtre de terminal. Gardez les 3 ouverts jusqu'à ce que vous ayez terminé et soyez content de votre firmware de clavier.
Si vous avez fermé et rouvert votre fenêtre de terminal depuis le démarrage de ce guide, n'oubliez pas de `cd qmk_firmware` afin que votre terminal soit dans le bon répertoire.
## Naviguez vers votre répertoire keymaps
Démarrez par naviguer dans le répertoire `keymaps` de votre clavier.
?> Si vous êtes sous macOS ou Windows, il y a des commandes que vous pouvez utiliser pour facilement ouvrir le dossier keymaps.
?> macOS:
open keyboards/<keyboard_folder>/keymaps
?> Windows:
start .\\keyboards\\<keyboard_folder>\\keymaps
## Créez une copie de la keymap `default`
Une fois le dossier `keymaps` ouvert, créez une copie du répertoire `default`. Nous vous recommandons de nommer ce répertoire de la même manière que votre nom d'utilisateur GitHub. Vous pouvez aussi utiliser le nom que vous voulez, tant qu'il contient uniquement des lettres minuscules, des nombres et le caractère souligné (_).
Afin d'automatiser ce processus, vous avez aussi l'option de lancer le script `new_keymap.sh`.
Naviguez vers le répertoire `qmk_firmware/util` et tapez ce qui suit:
```
./new_keymap.sh <keyboard path> <username>
```
Par exemple, pour un utilisateur s'appeleant John, essayant de créer une nouvelle keymap pour le 1up60hse, il taperait:
```
./new_keymap.sh 1upkeyboards/1up60hse john
```
## Ouvrez `keymap.c` dans votre éditeur de texte préféré
Ouvrez votre fichier `keymap.c`. Dans ce fichier, vous trouverez la structure qui contrôle comment votre clavier se comporte. En haut du fichier `keymap.c` il peut y avoir quelques `defines` et `enums` qui rendent la keymap plus simple à lire. Plus bas, vous trouverez une ligne telle que celle-ci:
Cette ligne indique le début d'une liste de calques (layers). En dessous, vous trouverez des lignes contenant soit `LAYOUT`, soit `KEYMAP` et ces lignes indiquent le début d'un calque. En dessous de cette ligne se trouve la liste des touches qui comprennent ce calque particulier.
!> Lorsque vous éditez votre fichier keymap, faites attention à ne pas ajouter ou enlever une virgule. Si vous le faites, vous aller empêcher votre firmware de compiler et il ne sera pas facile de trouver où la virgule est manquante ou en trop.
## Customisez le layout à votre goût
Libre à vous de choisir comment compléter cette étape. Faites le petit changement qui vous dérange ou retravaillez tout de zéro. Vous pouvez supprimer des calques si vous ne les utilisez pas tous, ou ajouter des calques jusqu'à un maximum de 32. Vérifiez la documentation suivante pour trouver ce que vous pouvez définir ici:
* [Keycodes](keycodes.md)
* [Fonctionnalités](features.md)
* [FAQ](faq.md)
?> Lorsque vous découvrez comment des keymaps fonctionnent, faites de petits changements. De gros changements rendent le débuggage des problèmes éventuels plus difficile.
## Compilez votre firmware
Lorsque les changements de votre keymap sont complets, vous allez devoir compiler le firmware. Pour ce faire, retournez à votre terminal et lancez la commande de compilation:
make <my_keyboard>:<my_keymap>
Par exemple, si votre keymap s'appelle "xyverz" et vous compilez une keymap pour une plank rev5, vous allez utiliser cette commande:
make planck/rev5:xyverz
Durant la compilation, vous allez avoir beaucoup de messages sur l'écran vous informant de quels fichiers sont en train d'être compilés. Il devrait se terminer avec des messages qui ressemblent comme suit:
```
Linking: .build/planck_rev5_xyverz.elf [OK]
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
Checking file size of planck_rev5_xyverz.hex [OK]
* File size is fine - 18392/28672
```
## Flasher votre firmware
Allez sur la page [Flasher le firmware](fr-FR/newbs_flashing.md) pour apprendre comment écrire votre nouveau firmware sur votre clavier.
Le [Configurateur de QMK](https://config.qmk.fm) est une interface graphique en ligne permettant de générer des fichiers "hex" du firmware de QMK.
?> **S'il vous plaît, suivez les étapes suivantes dans l'ordre.**
Regardez le [Tutoriel vidéo](https://youtu.be/tx54jkRC9ZY)
Le configurateur de QMK fonctionne mieux avec Chrome et Firefox.
!> **Les fichiers d'autres outils, tels que KLE ou kbfirmware ne seront pas compatibles avec le configurateur QMK. Ne les chargez pas, ne les importez pas. Le configurateur QMK est un outil DIFFERENT.**
## Sélectionner votre clavier
Cliquez la boîte déroulante et sélectionnez le clavier pour lequel vous voulez créer une keymap.
?> Si votre clavier a plusieurs versions, faites attention à utiliser la bonne.
Je vais le répéter, parce que c'est important
!> **FAITES ATTENTION A UTILISER LA BONNE VERSION !**
Si votre clavier est annoncé comme fonctionnant grâce à QMK mais n'est pas dans la liste, il y a des chances que le développeur ne l'ait pas encore fait, ou que nous n'avons pas encore eu le temps de le merger. Ajoutez un problème (issue) sur [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) demandant le support de votre clavier, s'il n'y a pas de [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) ouvert pour lui. Il y a aussi des clavier alimentés par QMK qui sont sur le compte GitHub du fabriquant, il est bon de le vérifier aussi.
## Sélectionner la disposition de votre clavier
Choisissez la disposition (layout) qui représente le mieux la keymap que vous voulez créer. Certains clavier n'ont pas encore assez de dispositions ou des dispositions incorrectes. Ils seront supportés dans le future.
## Nom de la Keymap
Appelez cette keymap comme vous voulez.
?> Si vous rencontrez des problèmes lors de la compilation, il peut être utile de changer ce nom, il peut déjà exister dans le dépôt du firmware QMK.
## Créer votre keymap
Entrer un keycode peut s'accomplir de 3 façons différentes.
1. Glisser déposer
2. Cliquer sur un endroit vide sur le layout et cliquer sur le keycode souhaité
3. Cliquer sur un endroit vide sur le layout et appuyer sur une touche physique de votre clavier.
Passez votre souris au dessus d'une touche et un affichage vous dira quel est le rôle du keycode. Pour une version plus verbeuse suivre:
Dans le cas où vous ne trouvez pas une disposition qui supporte votre keymap, par exemple trois places pour une barre d'espace, ou deux places pour retour clavier, ou deux places pour shift, etc. etc. remplissez les TOUTES.
### Exemples
3 places pour la barre d'espace: Remplissez les TOUTES avec la barre d'espace
2 places pour un retour clavier: Remplissez les DEUX avec un retour clavier
2 places pour un shift droit: Remplissez les DEUX avec un shift droit
1 place pour un shift gauche et 1 place pour le support ISO: Remplissez les deux avec un shift gauche
5 places, mais seulement 4 touches: Deviner et vérifier, ou demander à quelqu'un qui l'a déjà fait.
## Sauvez votre keymap pour des éditions futures
Une fois satisfait de votre keymap, ou si vous souhaitez revenir travailler dessus plus tard, appuyez sur le bouton `Export Keymap`. Il vous permettra de sauvegarder votre keymap avec le nom choisi au dessus suivi de .json.
Vous pouvez ensuite charger ce fichier .json à nouveau en appuxant sur le bouton `Import Keymap`.
!> **ATTENTION** Ce n'est pas le même type de fichier .json utilisé pour kbfirmware.com ou n'importe quel autre outil. Si vous essayez d'utiliser ce fichier pour d'autres outil, ou le fichier .json d'autres outils avec le configurateur QMK, il y a des chances que votre clavier **explose**.
## Générer votre fichier firmware
Appuyez sur le bouton `Compile`.
Une fois la compilation terminée, vous pourrez appuyer sur le bouton vert `Download Firmware`.
## Ecrire votre firmware sur votre clavier
Merci de vous référer à [Flasher le Firmware](fr-FR/newbs_flashing.md)
## Dépannage
#### Mon fichier json ne fonctionne pas
Si le fichier .json a été généré par le configurateur QMK, bravo vous avez trouvé un bug. Merci d'ouvrir une issue sur [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
Sinon... vous avez raté mon message écris en gras qui dit de ne pas utiliser d'autres fichiers .json?
#### Il y a des espaces en trop dans mon alyout? Qu'est-ce que je fais?
Si vous voulez dire que vous avez trois places pour une barre d'espace, le mieux est de les remplir tous avec une barre d'espace. Vous pouvez faire de même avec les retour clavier et les shift.
Merci de vérifier les autres dispositions de votre keymap afin d'être sûr qu'il n'y a pas de touches aléatoires.
## Problèmes et Bugs
Nous acceptons toujours les demandes des clients et les rapports de bugs. Merci de les remplirs sur [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.