* Add Korean keymap
* Switch to ANSI layout
* Update quantum/keymap_extras/keymap_korean.h
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
Co-authored-by: Konstantin Đorđević <vomindoraan@gmail.com>
* ADD DecadePad
* Fix Key display bug
* fix
* firmware1
THIS IS A Backup commit
* firmware2
* rename all fill with lower case
* fix bug
* Final Version
Fix all bugs
* Requested change apply
* suggested apply
* change apply
* via test
* Apply change and fix via support problem
* created initial files for the lattice60
* modifying the keymaps and config
* keymap edits and docs
* modifying docs and added personal keymap
* added pic and website to readme
* added layout image for default keymap
* updating layout pictures
* minor formatting edit
* file cleanup
* trying to prevent errors with usbconfig
* removed usbconfig.h
* cleaning up comments
* switched to use community hhkb layout
* Make initial batch of files
* Tweak keymap
* Mod default keymap
* Add via compat
* Update default keymap based on real world use
* Remove RGB, LCD, MIDI options
* Remove unnecessary functons from orbit_x.c
* Update readme
* Cleanup makefile as necessary
* Make the readme file for default keymap not completely empty
* Update keyboards/ai03/orbit_x/keymaps/default/keymap.c
* Update keyboards/ai03/orbit_x/readme.md
* Update keyboards/ai03/orbit_x/info.json
* Add VIA to Gingham
- Add VIA keymap
- Fix minor typo in config.h
- Remove redundunt methods and defines
* Update keyboards/gingham/config.h
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* define VID/PID in post_config.h, add via keymap
* update readme, set vid/pid for via
* update keymap
* delete usbconfig.h, update keymap
* add status led feature
* Apply suggestions from code review
Co-Authored-By: Joel Challis <git@zvecr.com>
* undef vid/pid in keymap
Co-authored-by: Joel Challis <git@zvecr.com>
* add feature part 01
* update sentences
* update sentences
* update sentences
* update file based on comment
* leave ctrl, shift, alt key name as alphabet
* update file based on comment
* update file based on comment
* update file based on comment
* update file based on comment
* remove unnecessary space on define line
* update sentence based on pull request's comment
* translate 'breathing' in document
* change expression in table
* update file based on comment
* change the word 'brightness', and update based on comment
* update based on comment
* update based on comment
* add language directory name to each internal link
* update based on comment
* update based on comment
* Changes to my Ergodox & Planck keymaps
* Fixed Typos
Corrected some typos and omissions to my Ergodox layout and readme
* Fixed Typos
Fixed some typos in my ErgoDox Readme and keymap.c files
* Add Serbian keymaps and sendstring LUT
* Apply suggestions from code review
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Fix formatting
Co-authored-by: Konstantin Đorđević <vomindoraan@gmail.com>
* Enable External EEPROM on Planck Rev6
* Update KC_MAKE macro to use qmk cli util
* Disable additional gradients for rgb matrix
* Update analog code for newer methods
* Update ergodox layout
* Disable Grave Escape
* Cleanup OLED code a bit
* Remove old unicode code
* Seperate RGB Matrix code from RGB Light code in userspace
* Massive overhaul an generalization of personal OLED code
Now lets hope I NEVER get a keyboard using a 128x32 in a normal orientation.
* Super tiny cleanup
* Enable Diablo layer on kyria
* clang format pass
* Additional OLED cleanup
* Added via config support for the launchpad
Added via config support for the launchpad
* Update keyboards/launchpad/keymaps/via/rules.mk
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/launchpad/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* 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
* Refactoring all my keymaps.
- Not use tap dance
- Remove not use define aliases
- Remove not use incluse and extern value.
* default keymap extra key was changed
* remove rgblight_config
Co-authored-by: root <root>
* 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
* fix missing music mode legend
* 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
* add sigul folder in Planck keymaps
* 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
* initial commit
* add ideas to readme
* comment key lock
* add a bunch of new features as stated in readme.md
* check features added and list to do
* add macros on RAISE
* add F keys on numbers row on FN layer
* flag features added
* fix macro formulas
* move DESK and SGCOM under D and S
* invert IT_EACC and S(IT_EACC) to align the layout with that of the default Planck
* invert IT_EACC and S(IT_EACC) to align the layout with that of the default Planck
fix spaces for readability
* add missing legends for accented vowels
* format for readability
* move MOUSE button on B (same key that activates it) on MOUSE layer
* 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
* change the included file from italian.h to italian_osx.h
* fix debug key
* edit Numapd layer, add enter and bsps
* change TAPPING_TOGGLE from 2 to 3
* change italian_osx.h to italian_ansi.h
* 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
* merge new italian
* add new osx_iso and osx_ansi version for italian.h and align BKSL to BSLS, fix double definition of PIPE
* rename BKSL to BSLS
* add FN_D and some comments
* add MOUSEKEY configuration
* update
* edit swap =/+ with ò/ì
* merge with master
* add MS_B to have _MOUSE when pressing B
* move RAISE on _FN
* add phone number
* remove CONTRA folder
* remove CONTRA folder
* Update keyboards/planck/keymaps/sigul/keymap.c
fix include definition
Co-Authored-By: Ryan <fauxpark@gmail.com>
* remove default planck kemap
* remove extern keymap_config_t keymap_config;
based on suggestion from @fauxpark, It's not needed as it should already be externed through one of the includes provided by QMK_KEYBOARD_H.
Co-Authored-By: Ryan <fauxpark@gmail.com>
* add user space for user sigul
* remove custom config moved to user space sigul
* comment tri layers state (moved to user space)
* remove tri layers update comment (code moved in user space)
* add secrets
* move enum and define to userspace
* Edit title
* move enum and define to sigul.h
* add thanks
* edit: moving to userspace enum, define and process_records
* add enum and defines
* add process_records
* cleaning code after moving code to user space
* add process_records
* cleaning code
* adding rules to manage secrets
* remove secretes
* first commit
* add macro timer
* add keycodes macro
* edit custom keycodes order
* add strings to send inside the secrets array
* remove codes for secrets & change secret to secrets
* edit secrets keycodes
* edit keycodes names and order
* add secrets.h and secrets.c
* add #pragma once
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update .gitignore
Co-Authored-By: Joel Challis <git@zvecr.com>
* add local gitignore for secrets
* remove secrets
* update for secrets
* change FN_D to IT_D
* remove FN_D definition
Co-authored-by: pisilvio <silvio@picampus.it>
Co-authored-by: admin <admin@admins-MacBook-Pro.local>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
* Rename UC_OSX (and related constants) to UC_MAC
* Update UNICODE_SONG_OSX references to UNICODE_SONG_MAC
* Update UC_M_OS references to UC_M_MA
* Add UC_OSX alias for backwards compatibility
* Add deprecation warning for UC_OSX to Unicode docs
* Add UC_M_OS alias for backwards compatibility
* Update newly found UC_M_OS and UNICODE_SONG_OSX references
* Add legacy UNICODE_MODE_OSX alias, revert changes to user keymaps
* Add legacy UNICODE_SONG_OSX alias, revert changes to user keymaps
* Replace removed sounds in Unicode song doc examples
* rewrite usbhid feature on vusb
* Apply suggestions from code review
Co-Authored-By: Ryan <fauxpark@gmail.com>
* fix typo
* fix typo again
* Update tmk_core/protocol/vusb/vusb.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* clean up defines
Co-authored-by: Ryan <fauxpark@gmail.com>
* Change PID to allow differentiation between Rev. 3 and Rev. 4
* Rebadge thumb keys in macro to show physical wiring better
* Add more rules for VIA keymap
* added the description of the reading order of the rules.mk files.
* Update docs/hardware_keyboard_guidelines.md
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update docs/hardware_keyboard_guidelines.md
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* Add keyboard jisplit89
Add jisplit89 keyboard.
A 89 keys JIS Layout keyboard.
Salicylic-acid3
* Update keyboards/jisplit89/keymaps/default/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/jisplit89/keymaps/default/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/jisplit89/keymaps/default/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/jisplit89/readme.md
Co-Authored-By: Takeshi ISHII <2170248+mtei@users.noreply.github.com>
* Update keyboards/jisplit89/rev1/rev1.h
Co-Authored-By: shela <shelaf@users.noreply.github.com>
* Copyright has been updated.
Changed signature to Salicylic_acid3 and changed year to 2020.
* Update readme
Added a note to the build guide.
* Remove unnecessary definitions.
Remove unnecessary definitions.
* Update keyboards/jisplit89/keymaps/default/keymap.c
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/rules.mk
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/rules.mk
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/default/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/default/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/jisplit89/keymaps/salicylic/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Delete config.h
Removed to make it more default
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Takeshi ISHII <2170248+mtei@users.noreply.github.com>
Co-authored-by: shela <shelaf@users.noreply.github.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
* CLI: More MSYS2 fixes
Now I can fully setup and work with qmk_firmware on an MSYS2
installation without any errors or exceptions.
* Apply suggestions from code review
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Some improvements
* Remove unnecessary import
* Remove slow, unused code
Getting the version from GIT was slow on both Windows and Docker.
Until we find a better, faster way, this is removed.
* remove unused imports
* Implement @vomindoraan's suggestions
* refine how we pick the shell to use
* Apply @fauxpark's suggestions
fauxpark investigated the topic of shells in MSYS2 a bit and we come to the conclusion that the safest bet was to just use the user's shell.
Anything more just opens up more edge-cases than it solves.
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Use `platform_id` in doctor
This will bring it in line with the new code.
Co-authored-by: skullydazed <skullydazed@users.noreply.github.com>
Co-authored-by: skullY <skullydazed@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* Update tmk_core/common/progmem.h
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update quantum/rgblight.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* fixed problem with implicit declaration in quantum/rgblight.c (#8381)
Co-authored-by: Ryan <fauxpark@gmail.com>
* convert my 60 keymap to alice
* add via to rules for alice
* remove split backspace and add backlight keycodes
* disable LTO for alice pcb
* keymap alignment formatting
* initial commit
* preliminary support for mb17 using the qmk default keymap
* add the VIA keymap
* add qmk configurator support
* code cleanups before submission
* Update keyboards/mountainblocks/mb17/rules.mk
* Update keyboards/mountainblocks/mb17/info.json
* remove file
* Port over some AVR backlight logic to SLEEP_LED
* Port over some AVR backlight logic to SLEEP_LED - add timer 3
* Port over some AVR backlight logic to SLEEP_LED - clang format
* Enable SLEEP_LED within vusb protocol
* Add support for RAW endpoint for arm_atsam
This the excellent work from helluvamatt/qmk_firmware in bb6eeb93b.
* Reformat arm_atsam RAW endpoint code
Co-authored-by: Matt Schneeberger <helluvamatt@gmail.com>
* Add initial KeebsPCB support
* Update readme
* Update readme
* Correct readme typo
* Update keyboards/acheron/keebspcb/config.h
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Apply @noroadsleft suggestions from code review
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/acheron/keebspcb/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/acheron/keebspcb/keymaps/default/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Gondolindrim <alvaro.augusto.volpato@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
* add new layout for 65% with blocker and add matching keymap
the rev2 pcb gets used in the kbd67 which has a blocker between the left arrow key and the right ctrl key. this layout is missing so far even though it's probably the most used one for this board.
* add split backspace layout with blocker
* change keycode for backslash
* update rules.mk and add missing layouts in info.json
* Update keyboards/kbdfans/kbd67/rev2/rules.mk
Co-Authored-By: Joel Challis <git@zvecr.com>
Co-authored-by: Joel Challis <git@zvecr.com>
* [Docs] Update RGB Matrix docs with function refs
* Fix up code samples
* suggestions by noroadsleft
* Fix small typo
Co-authored-by: James Young <xxiinophobia@yahoo.com>
* Add Kudox Game rev2.
* Add the keymap of Kudox Game a layer for regulating RGB.
* Modified rgblight_init when RGBLIGHT_ENABLE=no.
* Remove invalid codes.
* Modified *init* function right intention of framework.
* Set backlight and RGB pins for AVR onekeys
* Set pin for ADC as well
* Define ADC_PIN for F4 blackpills
* Use A0 for F4 ADCs
* Set ADC pins for F0 and F1
* [Keymap] Minidox Bepo layout
Todo :
Lower
Adjust
Update Lower E and Lower S on schema
* Added config.h
* Code review, update config.h
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: dolie <olivier.ghafari@pm.me>
Co-authored-by: Ryan <fauxpark@gmail.com>
* First cut at Josh Diamond's KBD75 customizations.
Includes:
* My unique keymap with ChromeOS specific keys
* Use RGB underglow to indicate Caps Lock
* Some unicode bindings
* Some changes to make debugging easier
* Updated spidey3 to be applicable to all 75_ansi boards
* Sadly, ChromeOS doesn't pay attention to most consumer codes
* Add mac layer; fix flakeyness in CAPS_LOCK underglow.
* Make layers.json match the keymap (to the extent possible)
* Major cleanup; fix broken debug persistence
* Cleanup some whitespace issues
* Fix incorrect log message.
* Rework layer indication to user RGBLIGHT_LAYERS
* Update layouts/community/75_ansi/spidey3/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Rename users/spidey3/rgblight.c to layer_rgb.c per suggestion
* Refactor to use set_single_persistant_default_layer().
* Use dprint/f to make logging more elegant.
* Update users/spidey3/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update users/spidey3/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update layouts/community/75_ansi/spidey3/rules.mk
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update users/spidey3/spidey3.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update users/spidey3/layer_rgb.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update users/spidey3/init.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Changes from code review
Co-authored-by: Joshua Diamond <jdiamond@Deep-Thought.local>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* creation
new numpad layout for 23 keys
creation of new keymap
* Update cospad.h
* Update info.json
* Update keymap.c
* Update keymap.c
Added a macro for the "00" key.
* added two new keymap. one for each new layout.
The new keymaps are based on the default keymap but focus on
* Update keyboards/cospad/cospad.h
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/cospad.h
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/numpad2/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/numpad2/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/numpad3/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/numpad3/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/numpad3/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keymap.c
layout name fix.
* Update keyboards/cospad/keymaps/johannbl/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/info.json
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/cospad/keymaps/johannbl/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Delete keymap.c
* Rename keyboards/cospad/keymaps/johannbl/numpad2/keymap.c to keyboards/cospad/keymaps/johannbl/split_plus_and_zero/keymap.c
* Rename keyboards/cospad/keymaps/johannbl/numpad3/keymap.c to keyboards/cospad/keymaps/johannbl/split_zero/keymap.c
* Rename keyboards/cospad/keymaps/johannbl/split_plus_and_zero/keymap.c to keyboards/cospad/keymaps/split_plus_and_zero/keymap.c
* Rename keyboards/cospad/keymaps/johannbl/split_zero/keymap.c to keyboards/cospad/keymaps/split_zero/keymap.c
* Update keyboards/cospad/keymaps/split_plus_and_zero/keymap.c
Co-Authored-By: Nick Brassel <nick@tzarc.org>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
* Improve process_record system
Code based on @colinta's
* Rename and better handle functions
* Fix incorrect function call to process_record_user
* Add documentation for post_process_record
* Add both get_event_keycode and get_record_keycode functions
And add some comments about these functions
* Update code format
* Cleanup merge artifacts
* Add Word Per Minute calculation feature
* Fix copyright info
* Remove header from quantum.c, setup overloadable keycode inclusion for WPM, update docs
* Simplify logic for keycode filtering
* Adding link from summary to wpm_feature info
* Update docs/feature_wpm.md
Typo in function prototype example in docs
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Add WPM transport via i2c
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
* Reorder logic within common_features.mk
* Revert haptic logic
* Add back path to make tests happy
* Update common_features.mk
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* Add support for Bootmagic lite when using SPLIT_HAND_PIN
* Deduplicate bootmagic_lite logic from within via
* Revert location of defaults so that user overrides still work for now
* Tidy up code slightly
* Lodestone: add ANSI and ISO layout data and keymaps
* rename layout macros
LAYOUT_ansi -> LAYOUT_65_ansi_blocker_split_bs
LAYOUT_iso -> LAYOUT_65_iso_blocker_split_bs
* use four-space indent on the new keymaps
* add 65_ansi_blocker and 65_iso_blocker layouts
* [Docs] Update layer documentation
* Add layer_state_cmp functions
* Fix cut/copy/paste issue
* Add id tags
* Apply noroads corrections
* Move Layers section to separate document
* Fix ID tag for layers
* Use better name for summary/side bar
* Fix feature page linkage
As well as a small spell error close by
* Remove paper analogy for now
* VIA Support: GH60 Rev C and GH60 Satan
* Corrected GH60 VIA default keymap
* Corrected GH60 VIA default keymap pt 2
* Copied default keymap over via default keymap
* Satan GH60 default corrected for VIA
* Satan GH60 default corrected for VIA pt 2
* Satan GH60 LTO enable for size
* Transparent 4th dynamic layer for GH60 Via support
* Update keyboards/gh60/revc/info.json
* Update keyboards/gh60/satan/info.json
* Update keyboards/gh60/satan/info.json
* Removed deprecated JSON keys gh60/revc/info.json
* Removed inline comment next to VID for GH60 Satan
* add via support for pdxkbc macropad
* add VIA support for the pdxkbc
* clean out some commented code
* remove unused files
* comment the vendor ID
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/pdxkbc/keymaps/via/keymap.c
Co-Authored-By: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
* Create rules.mk
Added rules.mk in keymaps/via
* Update rules.mk
Added new line at the end of the file
* Create via\keymap.c
Added keymap.c inside the via directory
* Update config.h in projectkb/alice
Defined VIA eeprom layout size to 2 bits to allow for 4 layout options
* Add Lodestone PCB
Working Firmware for Lodestone PCB tested on physical PCB prototypes.
* Update keyboards/flx/lodestone/lodestone.c
* Update keyboards/flx/lodestone/keymaps/default/config.h
* Update keyboards/flx/lodestone/rules.mk
* Update keyboards/flx/lodestone/readme.md
* Delete config.h
* Update keyboards/flx/lodestone/info.json
Suggested by noroadsleft
* Update keyboards/flx/lodestone/info.json
* Update keyboards/flx/lodestone/info.json
Changed maintainer name as suggested.
* Update keyboards/flx/lodestone/keymaps/default/readme.md
* Update keyboards/flx/lodestone/info.json
* Update keyboards/flx/lodestone/rules.mk
Changed Link_Time_Optimization to LTO didn't know this was a thing :)
* Update keyboards/flx/lodestone/keymaps/default/keymap.c
Removed 2 unessisary layers from the default map.
* Update keyboards/flx/lodestone/readme.md
* Update keyboards/flx/lodestone/info.json
* Changed from LAYOUT to LAYOUT_all
AS suggested by noroadsleft, changed 4 files to match, and re-testeed on my hardware to confirm working.
* Update keyboards/flx/lodestone/config.h
Cleaned up Manu, Product and Descriptor as suggested.
* Update keyboards/flx/lodestone/readme.md
* Update default keymap for Choco60
* Update keyboards/choco60/keymaps/default/keymap.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
* Assign unique VID to LazyDesigners' boards
* Add VIA support for LazyDesigners Dimple
* Apply @fauxpark's suggestions
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* Update switch to array to allow custom values
* Add adc keymap
* update docs to reflect alignment of default 10 bit
* start conversion to USE_ADCVn
* samplerate is hella wrong...stub out for now
* basic f1 and f4 functionality
* Tidy up current changes
* Restore old pinToMux function
* Add back sample rate for supported platforms
* F0 compile fixes
* wordsmithery
Co-Authored-By: Ryan <fauxpark@gmail.com>
* Remove reference to avr only function
Co-authored-by: Ryan <fauxpark@gmail.com>
* Remove unnecessary import of rgblight.h in tmk_core/protocol/*/*.c
* tmk_core/protocol/chibios/main.c
* tmk_core/protocol/lufa/lufa.c
see #8380 for tmk_core/protocol/vusb/main.c.
* Remove '#include "rgblight.h"' from tmk_core/protocol/vusb/main.c.
* fix CLI section links in the Summary
* fix heading in Pointing Device doc
* fix headings in PS/2 Mouse Support doc
* add explicit section ids to I2C Master Driver doc
* reformat GPIO Controls table
Much like the I2C Master Driver doc, I found this a bit less than ideal to read. (The table was actually wider than the space available for it.)
Reformatted so each GPIO function is an H3 heading, followed by a paragraph and a table of each architecture's old-style function.
* migrate changes from I2C Master Driver doc to Japanese translation
* add explicit anchors to I2C Master Driver docs
* fix code block language markers
The language markers are case-sensitive; using the wrong case means the syntax highlighting doesn't work.
Good: ```c
Bad: ```C
* restore Japanese I2C Master Driver doc to current master
Can't update the internal tracking references accurately until the changes to the English doc are committed to master.
* add explicit anchors to edited files
* change ChibiOS/ARM to ARM/ChibiOS
Because ARM/ATSAM is also a thing that exists.
* fix code block language markers again
Used the wrong markers in a few spots. Also these are apparently always supposed to be lowercase.
* add section anchors to cli.md
* restore table formatting on GPIO Control doc
* remove changes to _summary.md
* fix some broken links
* remove duplicate and confusing material from cli.md
* Switch brazil to the 2 letter country code
* Update docs/_langs.md
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* add via keymap for doro67
* have more sensible VID and PID
* apply the same VIA changes to the regular PCB
* Update keyboards/doro67/rgb/keymaps/via/keymap.c
* Update keyboards/doro67/regular/config.h
* fix some formatting
* add via support for multi doro67
* added olkb_style layout for XD75
* removed unnecessary config.h
* cleaned up empty functions
* refactored fuction type for clarity
* renamed the layout
* Use pathlib everywhere we can
* Improvements based on @erovia's feedback
* rework qmk compile and qmk flash to use pathlib
* style
* Remove the subcommand_name argument from find_keyboard_keymap()
* add experimental decorators
* Create decorators for finding keyboard and keymap based on current directory.
Decorators were inspired by @Erovia's brilliant work on the proof of concept.
* Fix extra keyboard report during test_fixture teardown
* Add tests for pressing two keys with only different modifers
* Fix#1708
When two keys that use the same keycode, but different modifiers were
pressed at the same time, the second keypress wasn't registered. This is
fixed by forcing a key release when we detect a new press for the same
keycode.
* Fix the NKRO version of is_key_pressed
* Fix uninitalized loop variable
Co-authored-by: Jack Humbert <jack.humb@gmail.com>
* Candybar: split lefty and righty into subprojects.
* Update readme.md
* Update readme.md
* Candybar: Moved STM32 library files into project root folder.
* Update keyboards/candybar/righty/readme.md
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/candybar/righty/readme.md
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/candybar/righty/readme.md
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/candybar/righty/readme.md
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/candybar/righty/righty.c
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Candybar: remove Boards directory so project uses one from drivers
* Update keyboards/candybar/righty/readme.md
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
* Update readme.md
* Update readme.md
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
* Add new keymap with split right shift and split backspace for bananasplit PCB
* Remove unecessary config.h
* Remove unecessary line breaks
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: Christopher Janzen <hello@christopherjanzen.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* Rearrange the custom CSS a bit.
* fix css name
* add missing quote
* Fix up dark mode rendering. (#8392)
* Fix up dark mode rendering.
* Update index.html
* Fix up code blocks
* Fix code in page toc
* Update docs/qmk_custom_dark.css
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-authored-by: skullY <skullydazed@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
* feat(build): added script for compiling with docker easily
* chore: bring my own build with docker to master
* chore: delete a file that does not make sense anymore
* feat: first redox for danielo
* chore: basic compatibility between redox and my space
* refactor: removed some old stuff
* feat: added go coding symbols
* feat: name control_k and alt_j
* chore: reduce combo term
* feat: improved first layer of redox
* feat: add configurations to the redox
* feat: make alt tab more portable
* feat: small improvements to redox layout
* feat: added leader
* refactor: move leader defs to my userspace config
* chore: movement modified
* feat: more predefined keys and a a new combo
* feat: redox alt tab functionality
* refactor: move alt_tab processing to a separate file
* refactor: early return
* refactor: move process record to a separate file
* format leader function
* chore: backspace on digits layer
* feat: add extra combo
* feat: added more combos
* implement guard proposed by @drashna
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* chore: include @drashna placeholder suggestion
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
* Add support for STM32L0/L1 onboard EEPROM.
* Update docs/eeprom_driver.md
Co-Authored-By: Joel Challis <git@zvecr.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Since #7773 caused a build error for `mxss:default`, I made similar changes to 'keyboards/mxss/rgblight.h' as #7773 did to 'quantum/rgblight.h'.
**This commit does not change the build result.**
Testing script
```shell
# build on versions earlier than PR #7773
git checkout 0.8.24
echo master > /tmp/master_md5.txt
make mxss:default:clean
make mxss:default
md5 mxss_default.hex >> /tmp/master_md5.txt
# build on this commit
git checkout fix-keyboards-mxss-rgblight.h
echo fix-keyboards-mxss-rgblight.h > /tmp/branch_md5.txt
make mxss:default:clean
make mxss:default
md5 mxss_default.hex >> /tmp/branch_md5.txt
diff -u /tmp/master_md5.txt /tmp/branch_md5.txt
```
Test result:
```
--- /tmp/master_md5.txt 2020-03-12 05:51:39.000000000 +0900
+++ /tmp/branch_md5.txt 2020-03-12 05:51:49.000000000 +0900
@@ -1,2 +1,2 @@
-master
+fix-keyboards-mxss-rgblight.h
MD5 (mxss_default.hex) = 3034b2504d0c7fc6bd8bf1dffb6b8486
```
* Initial commit of oddball keyboard
* Update oddball project url
* Update pointer functions to only run on master side
* Add unique product version
* Capitalise product name
* Convert oddball keymap layer flags to enum
* Remove commented keyboard boilerplate code
* Remove unused keymap config
* Fix incorrect layout in info.json
* Add markdown link text in readme
* VIA_ENABLE Tokyo60 PCB
* Update config.h
* Apply suggestions from code review
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
* New feature: RGBLIGHT_LAYERS
This feature allows users to define multiple independent layers of lighting
that can be toggled on and off individually, making it easy to use your
RGB lighting to indicate things like active keyboard layer & modifier state.
* Demonstrate built in functions for layer state checking
Also link the video in the docs.
* Follow existing pattern for setting rgblight_status flags
* Eliminate rgblight_is_static_mode since it's not needed
Just check to see if the timer is enabled directly.
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](feature_encoders.md).
This driver is currently AVR-only. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V).
This driver currently supports both AVR and a limited selection of ARM devices. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V for AVR, 3.3V only for ARM), however on ARM there is more flexibility in control of operation through `#define`s if you need more precision.
## Usage
@ -20,6 +20,8 @@ Then place this include at the top of your code:
@ -39,8 +41,84 @@ Then place this include at the top of your code:
<sup>\* The ATmega328P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
### ARM
Note that some of these pins are doubled-up on ADCs with the same channel. This is because the pins can be used for either ADC.
Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-based, whereas the F3 has 4 ADCs and the channels are 1 based. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
@ -48,3 +126,28 @@ Then place this include at the top of your code:
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `F6` for ADC6 on the ATmega32U4. |
|`pinToMux(pin)` |Translates a given QMK pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
### ARM
Note that care was taken to match all of the functions used for AVR devices, however complications in the ARM platform prevent that from always being possible. For example, the `STM32` chips do not have assigned Arduino pins. We could use the default pin numbers, but those numbers change based on the package type of the device. For this reason, please specify your target pins with their identifiers (`A0`, `F3`, etc.). Also note that there are some variants of functions that accept the target ADC for the pin. Some pins can be used for multiple ADCs, and this specified can help you pick which ADC will be used to interact with that pin.
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
|`analogReadPinAdc(pin, adc)`|Reads the value from the specified QMK pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function.|
|`pinToMux(pin)` |Translates a given QMK pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)".|
|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and adc combination. See your MCU's datasheet for more information.|
## Configuration
## ARM
The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates.
|ADC_CIRCULAR_BUFFER|`bool`|`false` |If `TRUE`, then the implementation will use a circular buffer.|
|ADC_NUM_CHANNELS |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`.|
|ADC_BUFFER_DEPTH |`int` |`2` |Sets the depth of each result. Since we are only getting a 12-bit result by default, we set this to `2` bytes so we can contain our one value. This could be set to 1 if you opt for a 8-bit or lower result.|
|ADC_SAMPLING_RATE |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
|ADC_RESOLUTION |`int` |`ADC_CFGR1_RES_12BIT`|The resolution of your result. We choose 12 bit by default, but you can opt for 12, 10, 8, or 6 bit. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
Run it with no arguments to format all core code that has been changed. Default checks `origin/master` with `git diff`, branch can be changed using `-b <branch_name>`
Run it with `-a` to format all core code, or pass filenames on the command line to run it on specific files.
**Usage for specified files**:
```
qmk cformat [file1] [file2] [...] [fileN]
```
**Usage for all core files**:
```
qmk cformat -a
```
**Usage for only changed files against origin/master**:
```
qmk cformat
```
**Usage for only changed files against branch_name**:
```
qmk cformat -b branch_name
```
## `qmk compile`
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm>, compile keymaps in the repo, or compile the keyboard in the current working directory.
**Usage for Configurator Exports**:
```
qmk compile <configuratorExport.json>
```
**Usage for Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
**Usage in Keyboard Directory**:
Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap <keymap_name>`
```
qmk compile
```
**Usage for building all keyboards that support a specific keymap**:
```
qmk compile -kb all -km <keymap_name>
```
**Example**:
```
$ qmk config compile.keymap=default
$ cd ~/qmk_firmware/keyboards/planck/rev6
$ qmk compile
Ψ Compiling keymap with make planck/rev6:default
...
```
or with optional keymap argument
```
$ cd ~/qmk_firmware/keyboards/clueboard/66/rev4
$ qmk compile -km 66_iso
Ψ Compiling keymap with make clueboard/66/rev4:66_iso
...
```
or in keymap directory
```
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
$ qmk compile
Ψ Compiling keymap with make make gh60/satan:colemak
...
```
**Usage in Layout Directory**:
Must be under `qmk_firmware/layouts/`, and in a keymap folder.
```
qmk compile -kb <keyboard_name>
```
**Example**:
```
$ cd ~/qmk_firmware/layouts/community/60_ansi/mechmerlin-ansi
$ qmk compile -kb dz60
Ψ Compiling keymap with make dz60:mechmerlin-ansi
...
```
## `qmk flash`
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default.
To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing.md) guide for more details of the available bootloaders.
This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
**Usage**:
```
qmk docs [-p PORT]
```
## `qmk doctor`
This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to.
**Usage**:
```
qmk doctor [-y] [-n]
```
**Examples**:
Check your environment for problems and prompt to fix them:
qmk doctor
Check your environment and automatically fix any problems found:
qmk doctor -y
Check your environment and report problems only:
qmk doctor -n
## `qmk json2c`
Creates a keymap.c from a QMK Configurator export.
**Usage**:
```
qmk json2c [-o OUTPUT] filename
```
## `qmk kle2json`
This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
**Usage**:
```
qmk kle2json [-f] <filename>
```
**Examples**:
```
$ qmk kle2json kle.txt
☒ File info.json already exists, use -f or --force to overwrite.
```
```
$ qmk kle2json -f kle.txt -f
Ψ Wrote out to info.json
```
## `qmk list-keyboards`
This command lists all the keyboards currently defined in `qmk_firmware`
**Usage**:
```
qmk list-keyboards
```
## `qmk list-keymaps`
This command lists all the keymaps for a specified keyboard (and revision).
**Usage**:
```
qmk list-keymaps -kb planck/ez
```
## `qmk new-keymap`
This command creates a new keymap based on a keyboard's existing default keymap.
**Usage**:
```
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
```
## `qmk pyformat`
This command formats python code in `qmk_firmware`.
**Usage**:
```
qmk pyformat
```
## `qmk pytest`
This command runs the python test suite. If you make changes to python code you should ensure this runs successfully.
@ -190,6 +190,8 @@ If you define these options you will enable the associated feature, which may in
* pin the DI on the WS2812 is hooked-up to
*`#define RGBLIGHT_ANIMATIONS`
* run RGB animations
*`#define RGBLIGHT_LAYERS`
* Lets you define [lighting layers](feature_rgblight.md) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
`EEPROM_DRIVER = vendor` | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
`EEPROM_DRIVER = vendor`(default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
## Vendor Driver Configuration
!> Resetting EEPROM using an STM32L0/L1 device takes up to 1 second for every 1kB of internal EEPROM used.
# Switching and Toggling Layers :id=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.md) 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.
## 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](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.
# 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 :id=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.
@ -63,10 +20,14 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
You can also chain them, for example `LCTL(LALT(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
# Legacy Content
# Legacy Content :id=legacy-content
This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
@ -123,7 +123,7 @@ If you would like to change the hotkey assignments for Bootmagic, `#define` thes
# Bootmagic Lite :id=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.
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:
@ -131,7 +131,7 @@ To enable this version of Bootmagic, you need to enable it in your `rules.mk` wi
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:
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
@ -144,9 +144,20 @@ And to trigger the bootloader, you hold this key down when plugging the keyboard
!> Using bootmagic lite will **always reset** the EEPROM, so you will lose any settings that have been saved.
## Split Keyboards
When handedness is predetermined via an option like `SPLIT_HAND_PIN`, you might need to configure a different key between halves. This To do so, add these entries to your `config.h` file:
```c
#define BOOTMAGIC_LITE_ROW_RIGHT 4
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
```
By default, these values are not set.
## 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.
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:
@ -163,4 +174,4 @@ void bootmagic_lite(void) {
}
```
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.
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.
One of the most powerful and well used features of QMK Firmware is the ability to use layers. For most people, this amounts to a function key that allows for different keys, much like what you would see on a laptop or tablet keyboard.
For a detailed explanation of how the layer stack works, checkout [Keymap Overview](keymap.md#keymap-and-layers).
## Switching and Toggling Layers :id=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. 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.md) 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.
### Caveats :id=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`. Specifically, dual function keys like `LT` and `MT` use a 16 bit keycode. 4 bits are used for the function identifier, the next 12 are divided into the parameters. Layer Tap uses 4 bits for the layer (and is why it's limited to layers 0-16, actually), while Mod Tap does the same, 4 bits for the identifier, 4 bits for which mods are used, and all of them use 8 bits for the keycode. Because of this, the keycode used is limited to `0xFF` (0-255), which are the basic keycodes only.
Expanding this would be complicated, at best. Moving to a 32-bit keycode would solve a lot of this, but would double the amount of space that the keymap matrix uses. And it could potentially cause issues, too. If you need to apply modifiers to your tapped keycode, [Tap Dance](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.
## Working with Layers :id=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 :id=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 :id=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 :id=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).
## Functions :id=functions
There are a number of functions (and variables) related to how you can use or manipulate the layers.
| `layer_state_set(layer_mask)` | Directly sets the layer state (recommended, do not use unless you know what you are doing). |
| `layer_clear()` | Clears all layers (turns them all off). |
| `layer_move(layer)` | Turns specified layer on, and all other layers off. |
| `layer_on(layer)` | Turns specified layer on, leaves all other layers in existing state. |
| `layer_off(layer)` | Turns specified layer off, leaves all other layers in existing state. |
| `layer_invert(layer)` | Interverts/toggles the state of the specified layer |
| `layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing layer state. |
| `layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing layer state. |
| `layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing layer state. |
| `layer_debug(layer_mask)` | Prints out the current bit mask and highest active layer to debugger console. |
| `default_layer_set(layer_mask)` | Directly sets the default layer state (recommended, do not use unless you know what you are doing). |
| `default_layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing default layer state. |
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
In additional to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passed the layer state to the function, which can be read or modified.
| `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. |
| `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. |
| `default_layer_state_set_kb(layer_state_t state)` | Callback for default layer functions, for keyboard. Called on keyboard initialization. |
| `default_layer_state_set_user(layer_state_t state)` | Callback for default layer functions, for users. Called on keyboard initialization. |
?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document.
| `layer_state_cmp(cmp_layer_state, layer)` | This checks the `cmp_layer_state` to see if the specific `layer` is enabled. This is meant for use with the layer callbacks. |
| `layer_state_is(layer)` | This checks the layer state to see if the specific `layer` is enabled. (calls `layer_state_cmp` for the global layer state). |
!> There is `IS_LAYER_ON(layer)` as well, however the `layer_state_cmp` function has some additional handling to ensure that on layer 0 that it returns the correct value. Otherwise, if you check to see if layer 0 is on, you may get an incorrect value returned.
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) 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.
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.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.
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 will then disable the filtering, and you'll need to specify the whole keycode.
In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
In this example, we modify most normal keypresses so that `F22` is pressed before the keystroke is normally sent, and release it __only after__ it's been released.
@ -58,6 +58,8 @@ This is the default mode. You can adjust the cursor and scrolling acceleration u
|`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_DELAY` |300 |Delay between pressing a wheel key and wheel movement |
|`MOUSEKEY_WHEEL_INTERVAL` |100 |Time between wheel movements |
|`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 |
@ -66,6 +68,7 @@ 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.
* Setting `MOUSEKEY_WHEEL_INTERVAL` too low will make scrolling too fast. Setting it too high will make scrolling too slow when the wheel key is held down.
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).
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:
```
```makefile
POINTING_DEVICE_ENABLE= yes
```
@ -25,7 +25,7 @@ When the mouse report is sent, the x, y, v, and h values are set to 0 (this is d
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:
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
## Driver configuration :id=driver-configuration
---
### IS31FL3731
### IS31FL3731 :id=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
```makefile
RGB_MATRIX_ENABLE= IS31FL3731
```
Configure the hardware via your `config.h`:
```C
```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:
@ -39,7 +39,7 @@ Currently only 2 drivers are supported, but it would be trivial to support all 4
Define these arrays listing all the LEDs in your `<keyboard>.c`:
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).
!> 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
```makefile
RGB_MATRIX_ENABLE= IS31FL3733
```
Configure the hardware via your `config.h`:
```C
```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:
@ -90,7 +90,7 @@ Currently only a single drivers is supported, but it would be trivial to support
Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
```c
constis31_ledg_is31_leds[DRIVER_LED_TOTAL]={
/* Refer to IS31 manual for these locations
* driver
@ -107,17 +107,17 @@ Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](
---
### WS2812
### WS2812 :id=ws2812
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
```makefile
RGB_MATRIX_ENABLE= WS2812
```
Configure the hardware via your `config.h`:
```C
```c
// The pin connected to the data pin of the LEDs
#define RGB_DI_PIN D7
// The number of LEDs connected
@ -128,7 +128,7 @@ Configure the hardware via your `config.h`:
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
```c
x=224/(NUMBER_OF_COLS-1)*COL_POSITION
y=64/(NUMBER_OF_ROWS-1)*ROW_POSITION
```
@ -157,7 +157,7 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
`// 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.
@ -169,7 +169,7 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
|`#define LED_FLAG_UNDERGLOW 0x02` |If the LED is for underglow. |
|`#define LED_FLAG_KEYLIGHT 0x04` |If the LED is for key backlight. |
## Keycodes
## Keycodes :id=keycodes
All RGB keycodes are currently shared with the RGBLIGHT system:
@ -189,11 +189,11 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
*`RGB_MODE_*` keycodes will generally work, but are not currently mapped to the correct effects for the RGB Matrix system
## RGB Matrix Effects
## RGB Matrix Effects :id=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
```c
enumrgb_matrix_effects{
RGB_MATRIX_NONE=0,
RGB_MATRIX_SOLID_COLOR=1,// Static single hue, no speed support
@ -285,7 +285,7 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
By setting `RGB_MATRIX_CUSTOM_USER` (and/or `RGB_MATRIX_CUSTOM_KB`) in `rules.mk`, new effects can be defined directly from userspace, without having to edit any QMK core files.
@ -294,7 +294,7 @@ To declare new effects, create a new `rgb_matrix_user/kb.inc` that looks somethi
`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.
#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
@ -386,28 +386,98 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
#define RGB_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
```
## EEPROM storage
## EEPROM storage :id=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
```c
#define EECONFIG_RGB_MATRIX (uint32_t *)28
```
Where `28` is an unused index from `eeconfig.h`.
## Suspended state
## Functions :id=functions
To use the suspend feature, add this to your `<keyboard>.c`:
|`rgb_matrix_set_color_all(r, g, b)` |Set all of the LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|`rgb_matrix_set_color(index, r, g, b)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255, and `index` is between 0 and `DRIVER_LED_TOTAL` (not written to EEPROM) |
|`rgb_matrix_increase_hue()` |Increase the hue for effect range LEDs. This wraps around at maximum hue |
|`rgb_matrix_decrease_hue()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue |
|`rgb_matrix_increase_sat()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation |
|`rgb_matrix_decrease_sat()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation |
|`rgb_matrix_increase_val()` |Increase the value for effect range LEDs. This wraps around at maximum value |
|`rgb_matrix_decrease_val()` |Decrease the value for effect range LEDs. This wraps around at minimum value |
|`rgb_matrix_sethsv(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|`rgb_matrix_sethsv_noeeprom(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
### Query Current Status :id=query-current-status
|Function |Description |
|-----------------------|-----------------|
|`rgb_matrix_get_mode()` |Get current mode |
|`rgb_matrix_get_hue()` |Get current hue |
|`rgb_matrix_get_sat()` |Get current sat |
|`rgb_matrix_get_val()` |Get current val |
## Callbacks :id=callbacks
### Indicators :id=indicators
If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `rgb_matrix_indicators_kb` or `rgb_matrix_indicators_user` function for that:
```c
voidrgb_matrix_indicators_kb(void){
rgb_matrix_set_color(index,red,green,blue);
}
```
### Suspended state :id=suspended-state
To use the suspend feature, make sure that `#define RGB_DISABLE_WHEN_USB_SUSPENDED true` is added to the `config.h` file.
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
To define a layer, we modify `keymap.c` to list out LED ranges and the colors we want to overlay on them using an array of `rgblight_segment_t` using the `RGBLIGHT_LAYER_SEGMENTS` macro. We can define multiple layers and enable/disable them independently:
```c
// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore!
We combine these layers into an array using the `RGBLIGHT_LAYERS_LIST` macro, and assign it to the `rgblight_layers` variable during keyboard setup. Note that you can only define up to 8 lighting layers. Any extra layers will be ignored. Since the different lighting layers overlap, the order matters in the array, with later layers taking precedence:
```c
// Now define the array of layers. Later layers take precedence
Note: For split keyboards with two controllers, both sides need to be flashed when updating the contents of rgblight_layers.
## Functions
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:
@ -263,6 +321,12 @@ rgblight_sethsv(HSV_GREEN, 2); // led 2
|`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) |
[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 with QWERTY Keyboard :id=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 with Steno Protocol :id=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`.
@ -20,26 +20,26 @@ In this mode Plover expects to speak with a steno machine over a serial port so
> 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 :id=tx-bolt
TX Bolt communicates the status of 24 keys over a very simple protocol in variable-sized (1-5 byte) packets.
### GeminiPR
### GeminiPR :id=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
## Configuring QMK for Steno :id=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
```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
```c
voidmatrix_init_user(){
steno_set_mode(STENO_MODE_GEMINI);// or STENO_MODE_BOLT
}
@ -49,37 +49,37 @@ Once you have your keyboard flashed launch Plover. Click the 'Configure...' butt
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
## Interfacing with the code :id=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.
@ -90,13 +90,15 @@ Unicode input in QMK works by inputting a sequence of characters to the OS, sort
The following input modes are available:
* **`UC_OSX`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with Unicode Map).
* **`UC_MAC`**: 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.
By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_MAC`](#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_OSX` is a deprecated alias of `UC_MAC` that will be removed in a future version of QMK.
* **`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.
@ -124,7 +126,7 @@ You can switch the input mode at any time by using one of the following keycodes
@ -180,7 +182,7 @@ You can customize the keys used to trigger Unicode input for macOS, Linux and Wi
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`).
@ -97,13 +97,25 @@ 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
## Build All Keyboards That Support a Specific Keymap
Want to check all your keymaps build in a single command? You can run:
make all:<name>
For example,
make all:jack
This is ideal for when you want ensure everything compiles successfully when preparing a [_Pull request_](https://github.com/qmk/qmk_firmware/pulls).
## 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
### 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.
@ -130,7 +142,7 @@ The `_keymap` part here doesn't matter, it just needs to be something other than
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
### 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.
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.
Github can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK.
?> This guide assumes you're somewhat comfortable with running things at the command line, and have git installed on your system.
Start on the [QMK Github page](https://github.com/qmk/qmk_firmware), and you'll see a button in the upper right that says "Fork":

If you're a part of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button:

And be sure to select "HTTPS", and select the link and copy it:

From here, enter `git clone --recurse-submodules ` into the command line, and then paste your link:
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
```
You now have your QMK fork on your local machine, and you can add your keymap, compile it and flash it to your board. Once you're happy with your changes, you can add, commit, and push them to your fork like this:
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
Your changes now exist on your fork on Github - if you go back there (`https://github.com/<whoeveryouare>/qmk_firmware`), you can create a "New Pull Request" by clicking this button:
After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :)
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.