Compare commits

...

83 Commits

Author SHA1 Message Date
Jack Humbert
cf9f6bbd91 adds per-layer rgb color option to ez 2017-11-06 08:38:36 -05:00
Jack Humbert
41df0dc9a7 update gh60 info 2017-11-05 12:06:45 -05:00
Jack Humbert
30dc34d529 add gh60 info.json 2017-11-05 12:04:52 -05:00
Michael F. Lamb
e899cb8940 several improvements for mitosis:datagrok (#1960)
* mitosis/datagrok: reduce features from rules.mk

* mitosis/datagrok: make both layer keys neighbor shift

* mitosis/datagrok: (no-op) tweak some comments

* mitosis/datagrok: set baudrate to 250k

This requires a corresponding change to the mitosis wireless firmware:
https://github.com/reversebias/mitosis/pull/10

* mitosis/datagrok: move design description from code comment to a readme

* mitosis/datagrok: new layout, new shifted keys, efficient LED code

This is experimental, but compiles and seems to work correctly.

* mitosis/datagrok: whoops, move readme.md

* mitosis/datagrok: a minor layout improvement simplifies custom-shifted code

instead of [, .] [? !], using [, ?] [. !] greatly simplifies the code
needed to perform the shifted-key switching. (And keeps , and . on the
same keys that they are under qwerty.)

also: layout improvements for symbols

* mitosis/datagrok: make my code conform to QMK style guidelines

* mitosis/datagrok: TODO note for layout table in README

* mitosis/datagrok: remove led_set_user until i figure out other changes

need to see if the corresponding changes needed in the keyboard-level code
is okay.

* mitosis/datagrok: simpler layer indicator

* mitosis/datagrok: undo change to keyboard baud; make it in my layout dir.

* mitosis/datagrok: apply same punctuation hack to qwerty layer

* mitosis/datagrok: enable qwerty layer toggle

* mitosis/datagrok: update readme
2017-11-03 11:56:06 -04:00
M Rawash
80e489e122 Added hand-swap matrix to the mitosis 2017-11-03 11:55:37 -04:00
Jennifer
29d1abff07 have led default to off on start up 2017-11-03 11:55:07 -04:00
Jennifer
b546da0a19 make more generic, and properly handle inits 2017-11-03 11:55:07 -04:00
skullY
f357bd0ccc fix a typo 2017-11-02 17:36:15 -07:00
skullY
685d4c2f97 Do some cleanup for the API 2017-11-02 16:47:39 -07:00
skullY
535c2f60a9 use real greater than and less than chars 2017-11-02 16:27:17 -07:00
skullY
65eaab8a1a fix labels 2017-11-02 12:49:23 -07:00
skullY
18f3cd1123 add labels to the clueboard layout 2017-11-02 12:47:34 -07:00
skullY
e45ce2dcb3 Merge branch 'master' of github.com:qmk/qmk_firmware 2017-11-02 12:39:25 -07:00
skullY
137456e5b1 fix the clueboard layout json 2017-11-02 11:51:06 -07:00
Jack Humbert
ec59147507 fix 2u alignment in info.jsons 2017-11-02 12:28:15 -04:00
Jack Humbert
074b78700a update preonic, add info.json 2017-11-02 12:18:18 -04:00
skullY
432674781a Document info.json files 2017-11-02 01:31:02 -07:00
skullY
4e41beeaa6 Fix a typo 2017-11-02 01:30:51 -07:00
Jack Humbert
00733f4b87 update contributing guidelines 2017-11-01 21:42:05 -04:00
dkrieger
19753788c1 Add satan keymap: HHKB-alike based on dbroqua's, with mouse functionality (#1948)
* Add satan keymap: HHKB-alike based on dbroqua's, with mouse functionality and without LED functionality

* move mouse layer to DOUBLE_HOLD, add UTIL layer for TRIPLE_HOLD

- UTIL layer
    - currently has "RESET" key and nothing else.
    - functionality otherwise covered by bootmagic should go here

- small bugfix: dispatch of [QTY]_HOLD should be based on range tap count
  falls in, not exact count.
2017-11-01 21:29:23 -04:00
Pawnerd
54a8abd785 Added support for Knops Mini (3x2 macropad) keyboard. (#1953)
* Added support for Knops Mini (3x2 macropad) keyboard.

* Added better documentation, according to the QMK standards.

* Fixed typo.

* Changed names of files to comply with QMK standards.

* Ignored makefile in keymap.

* Removed makefiles and added my credentials in the copyrights.
2017-11-01 21:24:59 -04:00
Jack Humbert
d6ad9787a0 update template readme 2017-11-01 21:14:24 -04:00
Jack Humbert
e2e387f8f8 update qmk template 2017-11-01 21:10:05 -04:00
Jack Humbert
039cc8c932 ignore more makefiles 2017-11-01 20:59:44 -04:00
QMK Bot
004826e1b8 convert to unix line-endings [skip ci] 2017-11-02 00:51:41 +00:00
Jack Humbert
f445a7f971 adds .hex for teensy 2.0 using B0 as reset 2017-11-01 20:42:03 -04:00
Danny Nguyen
13e1388f2d Add nano switch pad 2017-11-01 20:02:52 -04:00
Jack Humbert
fe56fffe7d Adds .qmk file type as a target for QMK Toolbox (#1084)
* adds .qmk file type as a target

* adds info.json with vendor and product

* add files for qmk info script

* add layout file for planck

* ignore .qmk files

* more settings

* update rules for avr and chibios

* update .qmk generation for info.json and inheritence
2017-11-01 20:01:45 -04:00
Jack Humbert
d069a42c07 Update getting_started_github.md 2017-11-01 14:10:28 -04:00
Jack Humbert
029234f1f1 adds other layouts to rules.mk 2017-11-01 13:21:17 -04:00
Jack Humbert
ddf49e8b21 Merge branch 'master' of https://github.com/qmk/qmk_firmware 2017-11-01 12:22:31 -04:00
Jack Humbert
371922ad61 update layout macros for planck 2017-11-01 12:20:46 -04:00
skullY
f868a3bb86 Fix the json for clueboard 2017-11-01 09:19:40 -07:00
skullY
5329a80f6c fixup json 2017-11-01 09:04:45 -07:00
Arialdo Martini
32bb8f6b8a Improvements to documentation (#1919)
* Typo: Github => GitHub

* Typo: windows => Windows, docker => Docker, and some punctuations

* "QMK Introduction" links to the right file

* "Unix" rather than "UNIX", which is a trademark

* Directory name is "keyboards", not "keyboard"

* "handwired" is a subdirectory of "keyboards"

* Punctuation and minor fixes

* macOS rather than Mac

* Punctuation and other minor fixes

* Vagrant Guide links to an existing file

* Jun Wako referenced with his name rather than his nickname

* Saxon genitive 's outside the link
2017-11-01 11:21:54 -04:00
Jack Humbert
1683d3a559 adds info.json files to planck 2017-11-01 10:08:40 -04:00
drashna
b79a4cfeba Updated personal keymaps (#1945)
* Add woodpad

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Fix odd merge issue

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add forced NKRO

* Added Colemak and Dvorak layers to default orthodox keymap

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others

* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts

* Made "make" keystroke universal

* Clean up and updates of drashna keymaps

* Add workman layer to planck

* Update to keymaps

* Fix accidental commit because I don't know how to git

* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox

* missing underscore in init function declaration

* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function

* Remove unnecessary planck layout
2017-11-01 00:13:20 -07:00
skullY
44d9ad95b7 Add info.json files for clueboard 66 2017-11-01 00:03:35 -07:00
Danny Nguyen
fad967af4c Remove extra underscore from MASTER_RIGHT define 2017-11-01 01:19:06 -04:00
DangerousParts
20e18d15e3 Created Kona Classic config (#1791)
* Created Kona Classic config

* Fixed KonaClassic config

* Updated README

* Updated Readme to conform to format standards

* Added ANSI and ISO layout options

* Fixed images in Readme

* Added labels to images

* Added absolute links to images in Readme

* Image link updates again

* Fixed bottom row keys in some layouts

* Fixed Grave and Tilde

* Fixed Underglow in Kona Classic configs

* Renamed KonaClassic to kona_classic
2017-10-31 23:59:23 -04:00
Danny
83af62322c Add Levinson rev2 (#1939)
* Add levinson rev2 files

* Add hexwire keymap

* Remove redefinition of backlight defines
2017-10-31 23:58:38 -04:00
Rob Rogers
2d77f9cbb9 Fix pointing device feature 2017-10-31 20:59:55 -04:00
Danny Nguyen
c9a0436422 Add 6-ball macropad 2017-10-31 20:59:26 -04:00
GlenPickle
fca03e15b9 Chimera Ortho Readme (#1943)
* Added Chimera Ortho keymap

* added readme

* fixed hardware link
2017-10-31 20:58:46 -04:00
Erez Zukerman
bc98b0d9eb Merge pull request #1915 from dondelelcaro/ergodox_ez_left_leds
Ergodox ez left leds support
2017-10-31 11:33:09 -07:00
Jack Humbert
38261920a9 update hand wiring link 2017-10-31 13:38:57 -04:00
Danny Nguyen
f9881793e3 Add hexwire keymap for Eco 2017-10-31 12:27:49 -04:00
tsankuanglee
04b9b62bdc RETRO_TAPPING (#1922)
* add RETRO_TAP: tap anyway, even after TAP_TERM, if no interruption

* consistent variable name

* add option doc

* change name for consistency

* make RETRO_TAPPING default to off
2017-10-31 11:15:22 -04:00
Louis Orleans
b2bbbc2dfc layout(infinity ergodox): dudeofawesome's layout (#1932)
* 🎉 Building simple flasher

* 🎉 Flashing works

* 🎨 Cleaning up

* 🐛 Being more specific with board identity

* 🐛 Flashing correct keymap

* 🎉 Adding keymap

*  Updating keymap

* 🚨 RGB

*  Revert "🚨 RGB"

This reverts commit 9ceabfb267.

*  Improvements to flasher

*  Layout tweaks

* 💄 Messing around with LCD

* 💄 Enabling LCD backlight matching

* 🔧 Updating layout

* 🐛 Fixing console logging

* 🎨 Cleaning up indentation

* 🔧 Adding editorconfig

*  Adding game layer

* 💄 Changing numpad layout

* 🔥 redoing entire layout

It's now more similar to the Planck default layout

*  add workman and dvorak layouts

* 🐛 fix numpad

* 🐛 fix layer orders

* 🐛 fix layer toggling

* 🐛 fix tri-layer switching

* 🐛 fix LCD colors for adjustment layers

* 🔥 remove old flasher project

* 🔥 remove simple_visualizer

* 💄 update LCD colors

* 📝 fix layout comments

* 💄  swapping 2u buttons

* 🔥🔧 removing editorconfig

* 🚨 using 2 spaces

* 📝 add README

*  Revert "💄 Enabling LCD backlight matching"

This reverts commit 51577903df.

*  Revert "💄 Messing around with LCD"

This reverts commit fdd9acdae5.
2017-10-31 11:14:43 -04:00
Louis Orleans
6169cd52ba Add EditorConfig file (#1930)
* 🔧 add editorconfig

This makes supported editors automatically change their settings to match desired code styles

* 🔧 add extension recommendation for VSCode

This will cause VS Code to prompt the user to install the EditorConfig extension when they open the project.

If this is felt to be too opinionated, I can revert it.
2017-10-31 11:13:40 -04:00
drashna
101b998ac2 Fix Pointing Device code (#1934)
* Fix pointer device options

when the feature was added, the appropriate option definition wasn't created.  This needs to be added to function properly.

* Update common_features.mk

* missing underscore in init function declaration
2017-10-31 11:13:00 -04:00
Takayuki Matsubara
7b65b7e948 fix Logical Maximum to be recognized as 255 instead of -1
SEE ALSO: https://github.com/qmk/qmk_firmware/issues/312
2017-10-31 11:12:06 -04:00
Zach Burchill
4c1164c469 fixed two typos
I'm almost 100% sure "else if (state->count = 2) {" was a typo (it should have two ='s for a logical operator), and I'm *pretty* sure "if (state->interrupted || state->!pressed) return SINGLE_TAP;" has a typo. At least, it returns an error on my machine saying something about an unexpected '!'.  
I changed it to a slightly longer form (i.e., "state->pressed==0"), and that worked fine.
2017-10-31 00:40:27 -04:00
Gun Pinyo
e555e42aae add Thai layers for the GunP planck (#1910)
* Add a layout of planck named GunP, ready for pull request review.

* add Thai layers for the GunP planck
2017-10-31 00:39:33 -04:00
William Wilson
38da7795f4 Added Chimera Ortho keymap 2017-10-31 00:30:24 -04:00
Pentti Laitinen
8c10b60c5f Initial commit for nordic layout for ergodox infinity.
- Added nordic infinity ergodox layout
- Fixed typo in ergodox infinity readme.md
2017-10-31 00:29:51 -04:00
Nathan Sharfi
c8fca10f0d zweihander-osx: Remove app keys, etc.
- add right command keys
- add F16 on ;' for Siri
- remove command-Q (too easy to hit)
2017-10-31 00:28:56 -04:00
Louis Orleans
1f6002db3f layout(planck): dudeofawesome's layout with simultaneous RGB and audio support (#1929)
* layout(planck): new layout initial commit

* feat(planck): add workman layout

* fix(planck): switching to workman

* layout(planck): swapping mnext and mplay

* feat(planck): prep for RGB

* perf(planck): remove plover

saves 256 bytes of memory

* perf(planck): remove colemak

saves 128 bytes

* layout(planck): swapping enter and quote

* perf(planck): disable console

frees 1664 bytes

* feat(planck): RGB under-lighting

* refactor(planck): change RGB pin

Uses pin labeled PB2

* feat(planck): add RGB keycodes

* feat(planck): re-enable audio

* style(planck): fixing indentation

Because who indents like that?

* style(planck): clean up keycodes

* layout(planck): remove del

* feat(planck): add tap-space to layer keys

* docs(planck): specify pin on PCB for RGB

* bug(planck): reducing tap time

* Revert "bug(planck): reducing tap time"

This reverts commit 62606b2dc6.

* Revert "feat(planck): add tap-space to layer keys"

This reverts commit c74de5a4aa.

* perf(planck): remove backlit case

* feat(planck): swap enter and quote

* bug(planck): moving right shift

* doc(planck): update README

* chore(planck): remove makefile
2017-10-31 00:27:07 -04:00
James Morgan
07017871e5 README, keymap & config update to 3 keyboards (#1911)
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware

* Fix terminus_mini & nyquist/DivergeJM readme files

Previously an outdated copy of the default readme. Updated to match the  Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)

* Update makefiles to rules.mk

Renamed both Makefiles to rules.mk, removed references to makefiles

* Updated rules.mk

Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.

Also disabled Tap_Dance in both rules.mk files

* Moved terminus_mini to handwired

Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.

* New Frosty Flake layout for QFR TKL

Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.

* README fix & keymap update for 3 keyboards

Fixed the markdown for the handwired/terminus_mini:default, Nyqyist:DivergeJM & frosty_flake:QFR_JM.

Added TAPPING_TERM =  150 to config.h for all keyboards

Switched LT(LOWER) and LAlt on the mod row for ortholinear boards.

* Update readme for QFR_JM to include make instructions

* Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware"

This reverts commit a45f264ada, reversing
changes made to 62349c3341.

* Revert "Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware""

This reverts commit eae54fb3be.

* Added QWERTY support to the QFR_JM

Implemented variable default base layer from the Planck default keymap.

* Update README to reflect QWERTY support
2017-10-29 20:07:36 -04:00
Jody Foo
f4949fdd32 Fix for issue https://github.com/qmk/qmk_firmware/issues/1751 2017-10-29 20:05:54 -04:00
Shihpin Tseng
750f8ec94e Fix process_combo.c compile warning 2017-10-29 20:05:26 -04:00
Jeremy Cowgar
49c32021db Added missing RGB and Auto Shift in main feature list. Also standardized on period at the end of each feature list item. 2017-10-29 20:04:10 -04:00
Jeremy Cowgar
76d807fe7d Fix code example in auto shift docs 2017-10-29 20:04:10 -04:00
Jeremy Cowgar
bf1fedc05e Fixed various feature links 2017-10-29 20:04:10 -04:00
Maxr1998
5960d0349c Add grave key 2017-10-29 20:02:52 -04:00
Sebastian Kaim
0afaed8535 Extended the hint of the programmer to link to the relevant README part instead of giving a generic hint. 2017-10-29 19:59:16 -04:00
Sebastian Kaim
688343f218 Added a better description for the bootloader key 2017-10-29 19:59:16 -04:00
Jack Humbert
4d421ee31c adds flashing docs 2017-10-29 18:44:29 -04:00
Campbell Barton
91683d56fa ergodox qwerty_code_friendly: add macro keys (#1918)
Also add more configurable keys.
2017-10-29 15:34:02 -07:00
Pentti Laitinen
9ee207acac Added Iso(ish) layout for tada68. (#1924)
- Basic layout with one function layer.
- Added correct mapping for ISO layout into tada68.h.
- Readme for the keymap.
2017-10-29 15:22:07 -07:00
Don Armstrong
0bb457e573 document how to define LEFT_LEDS and how that hack is done 2017-10-27 13:46:51 -07:00
Don Armstrong
364aeeec53 implement ergodox_left_leds_update in ergodox_ez
Previously, this code was implemented in keymap.c, but I'm unaware of
someone with a different implementation of this particular hack. [If
someone has it, we can add another #ifdef in the future.]
2017-10-27 13:34:03 -07:00
Don Armstrong
2e3b99f7f1 update left led support 2017-10-27 13:24:30 -07:00
Don Armstrong
bcfba27101 add initial support for left leds on an ergodox ez 2017-10-27 13:24:30 -07:00
Ethan Madden
b45b223389 Small documentation and keymap tweaks for my minivan layout (#1891)
* Added personal minivan keymap

more consistent layer setup

documentation!

slide some things around

more doc jiggling

* Small layout and documentation tweaks

Small documentation updates

dropped Makefile that for some reason was still in my branch

* found and removed extra makefile
2017-10-25 13:01:47 -10:00
Sebastian Kaim
7b754e1a5a added bfake support as a subproject (#1903)
* added bfake support as a subproject

also moved existing bmini stuff to a subproject

fixed columns

minor keymap update

making this a subproject

remove old stuff

got subproject stuff figured out

* travis was upset because a board didn't have a default keymap
2017-10-25 13:01:02 -10:00
Manassarn Manoonchai
a3f53aeaa1 Add narze keymaps for Ergodox & Planck with SuperDuper mode implementation (#1883)
* Fork default planck keymap

* Esc -> CapsLock

* Swap Tilde & Grave in Lower & Raise

* Replace Blacklight key with Raise

* Add Hyper/Esc & Shift/Enter key

* Add super duper mode using S+D combo

* Change superduper mode sound

* Add more functionality to superduper mode

* Fork default

* Replace all left shift to shift/parensopen (space cadet)

* Super / Underscore

* Try superduper on z/slash held

* Use function/macro instead, LGUI_UNDS alone not working

*  Add mouse layer 🐭

* 🐛 Fix superduper

*  Fix GUI_UNDS

* 🐛 Fix registering underscore when releasing too fast

* 🐛 Fix Shift/( with LT z

*  Add superduper for colemak

*  Add Qwerty on software Colemak layout & make Superduper available on multile layouts

*  Enable/disable superduper mode & fix layer switching

* 🐛 Fix superduper not unregister mods

*  Update planck-like ergodox (wip)

* 🐛 Fix return before changing tap count & modify comments

*  Replace with planck code

* 📝 Update readme

*  Fix SuperDuper by using intermediate layers

* Remove LT from inner lower & raise for ease of use

* Change TG to LG

* Add options & disable audio

* 🔧 Enable ignore mod tap interrupt & shorting tapping term

* 📝 Update readme

* Remove including quantum makefile

* 📝 Update readme

* Rename Makefiles
2017-10-25 06:11:07 -10:00
Doug Krieger
6c4639bfac Add RESET to satan:dbroqua mapping 2017-10-25 02:40:15 -10:00
skullydazed
67cc5cebc0 Restructure the hardware and feature docs to make things easier to find (#1888)
* fix #1313 by documenting more config.h options

* Clean up and organize documentation
2017-10-24 20:34:28 -07:00
heartrobotninja
8892c50336 Moving LOCK and adding RUN. Fixing equal key to actually use equal keycode. 2017-10-24 17:07:09 -10:00
Dylan Khor
9128ed50c2 Add macro to sleep Windows 10 2017-10-24 17:04:12 -10:00
Sebastian Kaim
1f43495922 Added a new keycode for cycling through RBG modes which reverses directions when shift is hold.
This commit adds a new keycode `RGB_SMOD` which is the same as `RGB_MOD` (cycle through all modes),
but when it is used in combination with shift it will reverse the direction.
2017-10-24 17:02:20 -10:00
Gun Pinyo
21dfa29c28 Add a layout of planck named GunP, ready for pull request review. 2017-10-24 17:01:20 -10:00
288 changed files with 11461 additions and 1586 deletions

18
.editorconfig Normal file
View File

@@ -0,0 +1,18 @@
# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
# We recommend you to keep these unchanged
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
indent_size = 4

8
.gitignore vendored
View File

@@ -4,6 +4,7 @@
*.eep
*.elf
*.hex
*.qmk
!util/bootloader.hex
!quantum/tools/eeprom_reset.hex
*.log
@@ -27,7 +28,14 @@ cmake-build-debug
/util/win_downloaded
/keyboards/*/Makefile
/keyboards/*/*/Makefile
/keyboards/*/*/*/Makefile
/keyboards/*/*/*/*/Makefile
/keyboards/*/*/*/*/*/Makefile
/keyboards/*/keymaps/Makefile
/keyboards/*/*/keymaps/Makefile
/keyboards/*/*/*/keymaps/Makefile
/keyboards/*/*/*/*/keymaps/Makefile
/keyboards/*/*/*/*/*/keymaps/Makefile
# Eclipse/PyCharm/Other IDE Settings
.cproject

6
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,6 @@
// Suggested extensions
{
"recommendations": [
"EditorConfig.EditorConfig"
]
}

View File

@@ -70,6 +70,8 @@ ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes)
endif
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
OPT_DEFS += -DMOUSE_ENABLE
SRC += $(QUANTUM_DIR)/pointing_device.c
endif

View File

@@ -3,6 +3,7 @@
* [Install Build Tools](getting_started_build_tools.md)
* Alternative: [Vagrant Guide](getting_started_vagrant_guide.md)
* [Build/Compile instructions](getting_started_make_guide.md)
* [Flashing instructions](flashing.md)
* [Contributing to QMK](contributing.md)
* [How to Use Github](getting_started_github.md)
@@ -12,57 +13,63 @@
* [Debugging/Troubleshooting QMK](faq_debug.md)
* [Keymap](faq_keymap.md)
* [Hardware](hardware.md)
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* [AVR Processors](hardware_avr.md)
* ARM Processors (TBD)
* [Drivers](hardware_drivers.md)
* [Features](features.md)
* [Layouts](feature_layouts.md)
* [Common Shortcuts](feature_common_shortcuts.md)
* [Userspace](feature_userspace.md)
* [Advanced Keycodes](feature_advanced_keycodes.md)
* [Audio](feature_audio.md)
* [Auto Shift](feature_auto_shift.md)
* [Backlight](feature_backlight.md)
* [Bootmagic](feature_bootmagic.md)
* [Dynamic Macros](dynamic_macros.md)
* [Key Lock](key_lock.md)
* [Dynamic Macros](feature_dynamic_macros.md)
* [Key Lock](feature_key_lock.md)
* [Layouts](feature_layouts.md)
* [Leader Key](feature_leader_key.md)
* [Macros](macros.md)
* [Mouse keys](mouse_keys.md)
* [Macros](feature_macros.md)
* [Mouse keys](feature_mouse_keys.md)
* [Pointing Device](feature_pointing_device.md)
* [PS2 Mouse](feature_ps2_mouse.md)
* [Space Cadet](space_cadet_shift.md)
* [Tap Dance](tap_dance.md)
* [Audio](feature_audio.md)
* [Thermal Printer](feature_thermal_printer.md)
* [Stenography](stenography.md)
* [Unicode](unicode.md)
* [RGB Lighting](feature_rgblight.md)
* [Space Cadet](feature_space_cadet.md)
* [Stenography](feature_stenography.md)
* [Tap Dance](feature_tap_dance.md)
* [Terminal](feature_terminal.md)
* [Thermal Printer](feature_thermal_printer.md)
* [Unicode](feature_unicode.md)
* [Userspace](feature_userspace.md)
* Reference
* [Glossary](glossary.md)
* [Keymap overview](keymap.md)
* [Keycodes](keycodes.md)
* [Basic](keycodes_basic.md)
* [Quantum](quantum_keycodes.md)
* [Backlight](feature_backlight.md#backlight-keycodes)
* [Bluetooth](feature_bluetooth.md#bluetooth-keycodes)
* [Bootmagic](feature_bootmagic.md#bootmagic-keycodes)
* [Layer Switching](feature_common_shortcuts.md#switching-and-toggling-layers)
* [Mod+Key](feature_common_shortcuts.md#modifier-keys)
* [Mod Tap](feature_common_shortcuts.md#mod-tap)
* [One Shot Keys](feature_common_shortcuts.md#one-shot-keys)
* [Shifted Keys](feature_common_shortcuts.md#shifted-keycodes)
* [Stenography](stenography.md#keycode-reference)
* [RGB Light](feature_rgblight.md#rgblight-keycodes)
* [Thermal Printer](feature_thermal_printer.md#thermal-printer-keycodes)
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
* [The `config.h` File](config_options.md)
* [Config Options](config_options.md)
* [Customizing Functionality](custom_quantum_functions.md)
* [Documentation Best Practices](documentation_best_practices.md)
* [Documentation Templates](documentation_templates.md)
* [Glossary](glossary.md)
* [Keymap overview](keymap.md)
* [Keycodes](keycodes.md)
* [Backlight](feature_backlight.md#backlight-keycodes)
* [Basic](keycodes_basic.md)
* [Bluetooth](feature_bluetooth.md#bluetooth-keycodes)
* [Bootmagic](feature_bootmagic.md#bootmagic-keycodes)
* [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers)
* [Mod+Key](feature_advanced_keycodes.md#modifier-keys)
* [Mod Tap](feature_advanced_keycodes.md#mod-tap)
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys)
* [Quantum](quantum_keycodes.md)
* [RGB Light](feature_rgblight.md#rgblight-keycodes)
* [Shifted Keys](feature_advanced_keycodes.md#shifted-keycodes)
* [Stenography](feature_stenography.md#keycode-reference)
* [Thermal Printer](feature_thermal_printer.md#thermal-printer-keycodes)
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
* [Unit Testing](unit_testing.md)
* For Makers and Modders
* [Adding a keyboard to QMK](adding_a_keyboard_to_qmk.md)
* [Hand Wiring Guide](hand_wiring.md)
* [Hand Wiring Guide](hand_wire.md)
* [ISP flashing guide](isp_flashing_guide.md)
* [Modding your keyboard](modding_your_keyboard.md)
* [Porting your keyboard to QMK](porting_your_keyboard_to_qmk.md)
* For a Deeper Understanding
* [How Keyboards Work](how_keyboards_work.md)

View File

@@ -1,35 +0,0 @@
# Adding your keyboard to QMK
We welcome all keyboard projects into QMK, but ask that you try to stick to a couple guidelines that help us keep things organised and consistent.
## Naming your directory/project
All names should be lowercase alphanumeric, and separated by an underscore (`_`), but not begin with one. Your directory and your `.h` and `.c` files should have exactly the same name. All folders should follow the same format.
## `readme.md`
All projects need to have a `readme.md` file that explains what the keyboard is, who made it, where it is available, and links to move information (template coming).
## Image/Hardware files
In an effort to keep the repo size down, we're no longer accepting images of any format in the repo, with few exceptions. Hosting them elsewhere (imgur) and linking them in the readme.md is the preferred method.
Any sort of hardware file (plate, case, pcb) can't be stored in qmk_firmware, but we have the [qmk.fm repo](https://github.com/qmk/qmk.fm) where such files (as well as in-depth info) can be store, and viewed on [qmk.fm](http://qmk.fm). Downloadable files are stored in `/<keyboard>/` (name follows the same format as above) which are served at `http://qmk.fm/<keyboard>/`, and pages are generated from `/_pages/<keyboard>/` which are served at the same location (.md files are generated into .html files through Jekyll). Check out the `lets_split` directory for an example.
## Non-production/handwired projects
We're happy to accept any project that uses QMK, including prototypes and handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder!
## Warnings as errors
When developing your keyboard, keep in mind that all warnings will be treated as errors - these small warnings can build-up and cause larger errors down the road (and keeping them is generally a bad practice).
## Licenses
If you're adapting your keyboard's setup from another project, but not using the same code, but sure to update the copyright header at the top of the files to show your name, in this format:
Copyright 2017 Your Name <your@email.com>
## Technical details
If you're looking for more information on making your keyboard work with QMK, [check out this guide](porting_your_keyboard_to_qmk.md)!

View File

@@ -1,129 +1,200 @@
# The `config.h` file
# Configuring QMK
This is a c header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere (namely keymaps). This file can exist at a couple different levels:
QMK is nearly infinitely configurable. Wherever possible we err on the side of allowing users to customize their keyboard, even at the expense of code size. That level of flexibility makes for a daunting configuration experience, however.
There are two main types of configuration files in QMK- `config.h` and `rules.mk`. These files exist at various levels in QMK and all files of the same type are combined to build the final configuration. The levels, from lowest priority to highest priority, are:
* QMK Default
* Keyboard
* Folders (Up to 5 levels deep)
* Keymap
## QMK Default
Every available setting in QMK has a default. If that setting is not set at the Keyboard, Folder, or Keymap level this is the setting that will be used.
## Keyboard
```c
#ifndef CONFIG_H
#define CONFIG_H
This level contains config options that should apply to the whole keyboard. Some settings won't change in revisions, or most keymaps. Other settings are merely defaults for this keyboard and can be overridden by folders and/or keymaps.
#include "config_common.h"
## Folders
// config options
#endif
```
This file contains config options that should apply to the whole keyboard, and won't change in revisions, or most keymaps. The revision block here only applies to keyboards with revisions.
## Revisions
```c
#ifndef <revision>_CONFIG_H
#define <revision>_CONFIG_H
#include "config_common.h"
// config options
#endif
```
For keyboards that have revisions, this file contains config options that should apply to only that revisions, and won't change in most keymaps.
Some keyboards have folders and sub-folders to allow for different hardware configurations. Most keyboards only go 1 folder deep, but QMK supports structures up to 5 folders deep. Each folder can have its own `config.h` and `rules.mk` files that are incorporated into the final configuration.
## Keymap
```c
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
This level contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
#include "config_common.h"
# The `config.h` file
// config options
This is a C header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere.
#endif
```
## `config.h` Options
This file contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
### Hardware Options
* `#define VENDOR_ID 0x1234`
* defines your VID, and for most DIY projects, can be whatever you want
* `#define PRODUCT_ID 0x5678`
* defines your PID, and for most DIY projects, can be whatever you want
* `#define DEVICE_VER 0`
* defines the device version (often used for revisions)
* `#define MANUFACTURER Me`
* generally who/whatever brand produced the board
* `#define PRODUCT Board`
* the name of the keyboard
* `#define DESCRIPTION a keyboard`
* a short description of what the keyboard is
* `#define MATRIX_ROWS 5`
* the number of rows in your keyboard's matrix
* `#define MATRIX_COLS 15`
* the number of columns in your keyboard's matrix
* `#define MATRIX_ROW_PINS { D0, D5, B5, B6 }`
* pins of the rows, from top to bottom
* `#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }`
* pins of the columns, from left to right
* `#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 }`
* pins unused by the keyboard for reference
* `#define MATRIX_HAS_GHOST`
* define is matrix has ghost (unlikely)
* `#define DIODE_DIRECTION COL2ROW`
* COL2ROW or ROW2COL - how your matrix is configured. COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows.
* `#define AUDIO_VOICES`
* turns on the alternate audio voices (to cycle through)
* `#define C6_AUDIO`
* enables audio on pin C6
* `#define B5_AUDIO`
* enables audio on pin B5 (duophony is enable if both are enabled)
* `#define BACKLIGHT_PIN B7`
* pin of the backlight - B5, B6, B7 use PWM, others use softPWM
* `#define BACKLIGHT_LEVELS 3`
* number of levels your backlight will have (not including off)
* `#define DEBOUNCING_DELAY 5`
* the delay when reading the value of the pin (5 is default)
* `#define LOCKING_SUPPORT_ENABLE`
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
* `#define LOCKING_RESYNC_ENABLE`
* tries to keep switch state consistent with keyboard LED state
* `#define IS_COMMAND() ( keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) )`
* key combination that allows the use of magic commands (useful for debugging)
# Config Options
### Features That Can Be Disabled
```c
#define VENDOR_ID 0x1234 // defines your VID, and for most DIY projects, can be whatever you want
#define PRODUCT_ID 0x5678 // defines your PID, and for most DIY projects, can be whatever you want
#define DEVICE_VER 0 // defines the device version (often used for revisions)
If you define these options you will disable the associated feature, which can save on code size.
#define MANUFACTURER Me // generally who/whatever brand produced the board
#define PRODUCT Board // the name of the keyboard
#define DESCRIPTION a keyboard // a short description of what the keyboard is
* `#define NO_DEBUG`
* disable debuging
* `#define NO_PRINT`
* disable printing/debugging using hid_listen
* `#define NO_ACTION_LAYER`
* disable layers
* `#define NO_ACTION_TAPPING`
* disable tap dance and other tapping features
* `#define NO_ACTION_ONESHOT`
* disable one-shot modifiers
* `#define NO_ACTION_MACRO`
* disable all macro handling
* `#define NO_ACTION_FUNCTION`
* disable the action function (deprecated)
#define MATRIX_ROWS 5 // the number of rows in your keyboard's matrix
#define MATRIX_COLS 15 // the number of columns in your keyboard's matrix
### Features That Can Be Enabled
#define MATRIX_ROW_PINS { D0, D5, B5, B6 } // pins of the rows, from top to bottom
#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } // pins of the columns, from left to right
#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 } // pins unused by the keyboard for reference
#define MATRIX_HAS_GHOST // define is matrix has ghost (unlikely)
#define DIODE_DIRECTION COL2ROW // COL2ROW or ROW2COL - how your matrix is configured
// COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows
If you define these options you will enable the associated feature, which may increase your code size.
#define AUDIO_VOICES // turns on the alternate audio voices (to cycle through)
#define C6_AUDIO // enables audio on pin C6
#define B5_AUDIO // enables audio on pin B5 (duophony is enable if both are enabled)
* `#define FORCE_NKRO`
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of eeprom setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
* `#define PREVENT_STUCK_MODIFIERS`
* when switching layers, this will release all mods
#define BACKLIGHT_PIN B7 // pin of the backlight - B5, B6, B7 use PWM, others use softPWM
#define BACKLIGHT_LEVELS 3 // number of levels your backlight will have (not including off)
### Behaviors That Can Be Configured
#define DEBOUNCING_DELAY 5 // the delay when reading the value of the pin (5 is default)
* `#define TAPPING_TERM 200`
* how long before a tap becomes a hold
* `#define RETRO_TAPPING`
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
* `#define TAPPING_TOGGLE 2`
* how many taps before triggering the toggle
* `#define PERMISSIVE_HOLD`
* makes tap and hold keys work better for fast typers who don't want tapping term set above 500
* `#define LEADER_TIMEOUT 300`
* how long before the leader key times out
* `#define ONESHOT_TIMEOUT 300`
* how long before oneshot times out
* `#define ONESHOT_TAP_TOGGLE 2`
* how many taps before oneshot toggle is triggered
* `#define IGNORE_MOD_TAP_INTERRUPT`
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
#define LOCKING_SUPPORT_ENABLE // mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
#define LOCKING_RESYNC_ENABLE // tries to keep switch state consistent with keyboard LED state
### RGB Light Configuration
#define IS_COMMAND() ( \ // key combination that allows the use of magic commands (useful for debugging)
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
* `#define RGB_DI_PIN D7`
* pin the DI on the ws2812 is hooked-up to
* `#define RGBLIGHT_ANIMATIONS`
* run RGB animations
* `#define RGBLED_NUM 15`
* number of LEDs
* `#define RGBLIGHT_HUE_STEP 12`
* units to step when in/decreasing hue
* `#define RGBLIGHT_SAT_STEP 25`
* units to step when in/decresing saturation
* `#define RGBLIGHT_VAL_STEP 12`
* units to step when in/decreasing value (brightness)
* `#define RGBW_BB_TWI`
* bit-bangs twi to EZ RGBW LEDs (only required for Ergodox EZ)
// the following options can save on file size at the expense of that feature
#define NO_DEBUG // disable debuging (saves on file size)
#define NO_PRINT // disable printing (saves of file size)
#define NO_ACTION_LAYER // no layers
#define NO_ACTION_TAPPING // no tapping for layers/mods
#define NO_ACTION_ONESHOT // no oneshot for layers/mods
#define NO_ACTION_MACRO // no macros
#define NO_ACTION_FUNCTION // no functions
### Mouse Key Options
#define FORCE_NKRO // NKRO by default requires to be turned on, this forces it to be on always
* `#define MOUSEKEY_INTERVAL 20`
* `#define MOUSEKEY_DELAY 0`
* `#define MOUSEKEY_TIME_TO_MAX 60`
* `#define MOUSEKEY_MAX_SPEED 7`
* `#define MOUSEKEY_WHEEL_DELAY 0`
#define PREVENT_STUCK_MODIFIERS // when switching layers, this will release all mods
# The `rules.mk` File
#define TAPPING_TERM 200 // how long before a tap becomes a hold
#define TAPPING_TOGGLE 2 // how many taps before triggering the toggle
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
#define PERMISSIVE_HOLD // makes tap and hold keys work better for fast typers who don't want tapping term set above 500
## `rules.mk` options
#define LEADER_TIMEOUT 300 // how long before the leader key times out
### Build Options
#define ONESHOT_TIMEOUT 300 // how long before oneshot times out
#define ONESHOT_TAP_TOGGLE 2 // how many taps before oneshot toggle is triggered
* `DEFAULT_FOLDER`
* Used to specify a default folder when a keyboard has more than one sub-folder.
* `SRC`
* Used to add files to the compilation/linking list.
* `LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
#define IGNORE_MOD_TAP_INTERRUPT // makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
### AVR MCU Options
* `MCU = atmega32u4`
* `F_CPU = 16000000`
* `ARCH = AVR8`
* `F_USB = $(F_CPU)`
* `OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT`
* `OPT_DEFS += -DBOOTLOADER_SIZE=4096`
// ws2812 options
#define RGB_DI_PIN D7 // pin the DI on the ws2812 is hooked-up to
#define RGBLIGHT_ANIMATIONS // run RGB animations
#define RGBLED_NUM 15 // number of LEDs
#define RGBLIGHT_HUE_STEP 12 // units to step when in/decreasing hue
#define RGBLIGHT_SAT_STEP 25 // units to step when in/decresing saturation
#define RGBLIGHT_VAL_STEP 12 // units to step when in/decreasing value (brightness)
### Feature Options
#define RGBW_BB_TWI // bit-bangs twi to EZ RGBW LEDs (only required for Ergodox EZ)
Use these to enable or disable building certain features. The more you have enabled the bigger your firmware will be, and you run the risk of building a firmware too large for your MCU.
// mousekey options (self-describing)
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 0
```
* `BOOTMAGIC_ENABLE`
* Virtual DIP switch configuration(+1000)
* `MOUSEKEY_ENABLE`
* Mouse keys(+4700)
* `EXTRAKEY_ENABLE`
* Audio control and System control(+450)
* `CONSOLE_ENABLE`
* Console for debug(+400)
* `COMMAND_ENABLE`
* Commands for debug and configuration
* `NKRO_ENABLE`
* USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
* `AUDIO_ENABLE`
* Enable the audio subsystem.
* `RGBLIGHT_ENABLE`
* Enable keyboard underlight functionality
* `MIDI_ENABLE`
* MIDI controls
* `UNICODE_ENABLE`
* Unicode
* `BLUETOOTH_ENABLE`
* Enable Bluetooth with the Adafruit EZ-Key HID

View File

@@ -104,6 +104,8 @@ Most first-time QMK contributors start with their personal keymaps. We try to ke
* Write a `readme.md` using [the template](https://docs.qmk.fm/documentation_templates.html#).
* All Keymap PR's are squashed, so if you care about how your commits are squashed you should do it yourself
* Do not lump features in with keymap PR's. Submit the feature first and then a second PR for the keymap.
* Do not include `Makefile`s in your keymap folder (they're no longer used)
* Update copyrights in file headers (look for `REPLACE_WITH_YOUR_NAME `)
## Keyboards
@@ -114,6 +116,9 @@ We also ask that you follow these guidelines:
* Write a `readme.md` using [the template](https://docs.qmk.fm/documentation_templates.html#).
* Keep the number of commits reasonable or we will squash your PR
* Do not lump core features in with new keyboards. Submit the feature first and then submit a separate PR for the keyboard.
* Name `.c`/`.h` file after the immediate parent folder, eg `/keyboards/<kb1>/<kb2>/<kb2>.[ch]`
* Do not include `Makefile`s in your keyboard folder (they're no longer used)
* Update copyrights in file headers (look for `REPLACE_WITH_YOUR_NAME `)
## Quantum/TMK Core
@@ -144,4 +149,4 @@ To maintain a clear vision of how things are laid out in QMK we try to plan out
# What does the Code of Conduct mean for me?
Our Code of Conduct means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.
Our [Code of Conduct](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.

View File

@@ -10,7 +10,7 @@
## What Differences Are There Between QMK and TMK?
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert's](https://github.com/jackhumbert) fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert](https://github.com/jackhumbert)'s fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
From a technical standpoint QMK builds upon TMK by adding several new features. Most notably QMK has expanded the number of available keycodes and uses these to implement advanced features like `S()`, `LCTL()`, and `MO()`. You can see a complete list of these keycodes in [Keycodes](keycodes.md).

View File

@@ -7,6 +7,17 @@ See [Keycodes](keycodes.md) for an index of keycodes available to you. These lin
Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h).
## What Are The Default Keycodes?
There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here:
<!-- Source for this image: http://www.keyboard-layout-editor.com/#/gists/9ce023dc6caadc0cf11c88c782350a8c -->
![Keyboard Layout Image](https://i.imgur.com/45m4mRf.png)
## The Menu Key Isn't Working
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when that key was invented there was already a key named `MENU` in the relevant standards, so MS chose to call that the `APP` key.
## `KC_SYSREQ` isn't working
Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.

View File

@@ -1,6 +1,8 @@
# Common Keymap Shortcuts
# Advanced Keycodes
Your keymap can include shortcuts to common operations, for example shifted keys. This page documents the functions that are available to you.
Your keymap can include keycodes that are more advanced than normal, for example shifted keys. This page documents the functions that are available to you.
### Assigning Custom Names
People often define custom names using `#define`. For example:
@@ -15,7 +17,7 @@ This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping i
Currently, the keycodes able to used with these functions are limited to the [Basic Keycodes](keycodes_basic.html), meaning you can't use keycodes like `KC_TILD`, or anything greater than 0xFF. For a full list of the keycodes able to be used see [Basic Keycodes](keycodes_basic.html).
## Switching and toggling layers
# Switching and toggling layers
These functions allow you to activate layers in various ways.
@@ -25,7 +27,7 @@ These functions allow you to activate layers in various ways.
* `TO(layer)` - Goes to a layer. This code is special, because it lets you go either up or down the stack -- just goes directly to the layer you want. So while other codes only let you go _up_ the stack (from layer 0 to layer 3, for example), `TO(2)` is going to get you to layer 2, no matter where you activate it from -- even if you're currently on layer 5. This gets activated on keydown (as soon as the key is pressed).
* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, the layer becomes active, and then deactivates when you let go. And if you tap it, the layer simply becomes active (toggles on). It needs 5 taps by default, but you can set it by defining `TAPPING_TOGGLE`, for example, `#define TAPPING_TOGGLE 2` for just two taps.
## Working With Layers
# 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.
@@ -47,7 +49,7 @@ Once you have a good feel for how layers work and what you can do, you can get m
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.
## Modifier keys
# Modifier keys
These functions allow you to combine a mod with a keycode. When pressed the keydown for the mod will be sent first, and then *kc* will be sent. When released the keyup for *kc* will be sent and then the mod will be sent.
@@ -67,7 +69,7 @@ You can also chain these, like this:
LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress.
## Shifted Keycodes
# Shifted Keycodes
The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols.
@@ -95,7 +97,7 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u
| KC_PIPE | &#x7C; |
| KC_COLN | : |
## Mod Tap
# Mod Tap
`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down.
@@ -125,7 +127,7 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac
* `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped
* `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift.
## One Shot Keys
# One Shot Keys
One shot keys are keys that remain active until the next key is pressed, and then are releasd. This allows you to type keyboard combinations without pressing more than one key at a time.

View File

@@ -136,24 +136,22 @@ completely normal and with no intention of shifted keys.
#### An example run
'''
hello world. my name is john doe. i am a computer programmer playing with
keyboards right now.
hello world. my name is john doe. i am a computer programmer playing with
keyboards right now.
[PRESS KC_ASDN quite a few times]
[PRESS KC_ASDN quite a few times]
heLLo woRLd. mY nAMe is JOHn dOE. i AM A compUTeR proGRaMMER PlAYiNG witH
KEYboArDS RiGHT NOw.
heLLo woRLd. mY nAMe is JOHn dOE. i AM A compUTeR proGRaMMER PlAYiNG witH
KEYboArDS RiGHT NOw.
[PRESS KC_ASUP a few times]
[PRESS KC_ASUP a few times]
hello world. my name is john Doe. i am a computer programmer playing with
keyboarDs right now.
hello world. my name is john Doe. i am a computer programmer playing with
keyboarDs right now.
[PRESS KC_ASRP]
[PRESS KC_ASRP]
115
'''
115
The keyboard typed `115` which represents your current `AUTO_SHIFT_TIMEOUT`
value. You are now set! Practice on the *D* key a little bit that showed up

View File

@@ -88,6 +88,7 @@ These control the RGB Lighting functionality.
|-----------|------------|-------------|
||`RGB_TOG`|toggle on/off|
||`RGB_MOD`|cycle through modes|
||`RGB_SMOD`|cycle through modes, use reverse direction when shift is hold|
||`RGB_HUI`|hue increase|
||`RGB_HUD`|hue decrease|
||`RGB_SAI`|saturation increase|

View File

@@ -200,12 +200,12 @@ typedef struct {
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
//If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
if (state->interrupted || state->!pressed) return SINGLE_TAP;
if (state->interrupted || state->pressed==0) return SINGLE_TAP;
else return SINGLE_HOLD;
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap. In example below, that means to send `xx` instead of `Escape`.
else if (state->count = 2) {
else if (state->count == 2) {
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;

View File

@@ -1,105 +1,26 @@
# QMK Features
QMK has a staggering number of features for building your keyboard. It can take some time to understand all of them and determine which one will acheive your goal.
## Space Cadet Shift: The future, built in
Steve Losh [described](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/) the Space Cadet Shift quite well. Essentially, you hit the left Shift on its own, and you get an opening parenthesis; hit the right Shift on its own, and you get the closing one. When hit with other keys, the Shift key keeps working as it always does. Yes, it's as cool as it sounds. Head on over to the [Space Cadet Shift](space_cadet_shift.md) page to read about it.
## The Leader key: A new kind of modifier
Most modifiers have to be held or toggled. But what if you had a key that indicated the start of a sequence? You could press that key and then rapidly press 1-3 more keys to trigger a macro, or enter a special layer, or anything else you might want to do. To learn more about it check out the [Leader Key](feature_leader_key.md) page.
## Tap Dance: A single key can do 3, 5, or 100 different things
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. Read more about it on the [Tap Dance](tap_dance.md) page.
## Temporarily setting the default layer
`DF(layer)` - sets default layer to _layer_. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.
## Macro shortcuts: Send a whole string when pressing just one key
How would you like a single keypress to send a whole word, sentence, paragraph, or even document? Head on over to the [Macros](macros.md) page to read up on all aspects of Simple and Dynamic Macros.
## Additional keycode aliases for software-implemented layouts \(Colemak, Dvorak, etc\)
Everything is assuming you're in Qwerty \(in software\) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
```
#include <keymap_colemak.h>
```
If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to:
* `CM_*` for all of the Colemak-equivalent characters
* `DV_*` for all of the Dvorak-equivalent characters
These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features.
To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F`. Using `KC_F` under these same circumstances would result in `T`.
## Backlight Breathing
In order to enable backlight breathing, the following line must be added to your config.h file.
```
#define BACKLIGHT_BREATHING
```
The following function calls are used to control the breathing effect.
* `breathing_enable()` - Enable the free-running breathing effect.
* `breathing_disable()` - Disable the free-running breathing effect immediately.
* `breathing_self_disable()` - Disable the free-running breathing effect after the current effect ends.
* `breathing_toggle()` - Toggle the free-running breathing effect.
* `breathing_defaults()` - Reset the speed and brightness settings of the breathing effect.
The following function calls are used to control the maximum brightness of the breathing effect.
* `breathing_intensity_set(value)` - Set the brightness of the breathing effect when it is at its max value.
* `breathing_intensity_default()` - Reset the brightness of the breathing effect to the default value based on the current backlight intensity.
The following function calls are used to control the cycling speed of the breathing effect.
* `breathing_speed_set(value)` - Set the speed of the breathing effect - how fast it cycles.
* `breathing_speed_inc(value)` - Increase the speed of the breathing effect by a fixed value.
* `breathing_speed_dec(value)` - Decrease the speed of the breathing effect by a fixed value.
* `breathing_speed_default()` - Reset the speed of the breathing effect to the default value.
The following example shows how to enable the backlight breathing effect when the FUNCTION layer macro button is pressed:
```
case MACRO_FUNCTION:
if (record->event.pressed)
{
breathing_speed_set(3);
breathing_enable();
layer_on(LAYER_FUNCTION);
}
else
{
breathing_speed_set(1);
breathing_self_disable();
layer_off(LAYER_FUNCTION);
}
break;
```
The following example shows how to pulse the backlight on-off-on when the RAISED layer macro button is pressed:
```
case MACRO_RAISED:
if (record->event.pressed)
{
layer_on(LAYER_RAISED);
breathing_speed_set(2);
breathing_pulse();
update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
}
else
{
layer_off(LAYER_RAISED);
update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
}
break;
```
* [Advanced Keycodes](feature_advanced_keycodes.md) - Change layers, type shifted keys, and more. Go beyond typing simple characters.
* [Audio](feature_audio.md) - Connect a speaker to your keyboard for audio feedback, midi support, and music mode.
* [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state.
* [Backlight](feature_backlight.md) - LED lighting support for your keyboard.
* [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys.
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
* [Key Lock](feature_key_lock.md) - Lock a key in the "down" state.
* [Layouts](feature_layouts.md) - Use one keymap with any keyboard that supports your layout.
* [Leader Key](feature_leader_key.md) - Tap the leader key followed by a sequence to trigger custom behavior.
* [Macros](feature_macros.md) - Send multiple key presses when pressing only one physical key.
* [Mouse keys](feature_mouse_keys.md) - Control your mouse pointer from your keyboard.
* [Pointing Device](feature_pointing_device.md) - Framework for connecting your custom pointing device to your keyboard.
* [PS2 Mouse](feature_ps2_mouse.md) - Driver for connecting a ps2 mouse directly to your keyboard.
* [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard.
* [Space Cadet](feature_space_cadet_shift.md) - Use your left/right shift keys to type parenthesis and brackets.
* [Stenography](feature_stenography.md) - Put your keyboard into Plover mode for stenography use.
* [Tap Dance](feature_tap_dance.md) - Make a single key do as many things as you want.
* [Terminal](feature_terminal.md) - CLI interface to the internals of your keyboard.
* [Thermal Printer](feature_thermal_printer.md) - Connect a thermal printer to your keyboard to be able to toggle on a printed log of everything you type.
* [Unicode](feature_unicode.md) - Unicode input support.
* [Userspace](feature_userspace.md) - Share code between different keymaps and keyboards.

74
docs/flashing.md Normal file
View File

@@ -0,0 +1,74 @@
# Flashing Intrustructions
There are quite a few different types of bootloaders that keyboards use, and just about all of the use a different flashing method. Luckily, projects like the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) aim to be compatible with all the different types without having to think about it much, but this article will describe the different types of bootloaders, and available methods for flashing them.
## DFU
Atmel's DFU bootloader comes on all atmega32u4 chips by default, and is used by many keyboards that have their own ICs on their PCBs (Older OLKB boards, Clueboards). Some keyboards may also use LUFA's DFU bootloader (or QMK's fork) (Newer OLKB boards) that adds in additional features specific to that hardware.
These bootloaders are usually 4096 bytes for the atmega32u4 chip.
Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` in QMK (recommended commandline)
* [Atmel's Flip](http://www.atmel.com/tools/flip.aspx) (not recommended)
Flashing sequence:
1. Press the `RESET` keycode, or tap the RESET button (or short RST to GND).
2. Wait for the OS to detect the device
3. Erase the memory (may be done automatically)
4. Flash a .hex file
5. Reset the device into application mode (may be done automatically)
or:
make <keyboard>:<keymap>:dfu
## Caterina
Arduino boards and their clones use the [Caterina bootloader](https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/bootloaders/caterina) (any keyboard built with a Pro Micro, or clone), and uses the avr109 protocol to communicate through virtual serial. Bootloaders like [A-Star](https://www.pololu.com/docs/0J61/9) are based on Caterina.
This block of code allows for Caterina compatibility in QMK:
#define CATERINA_BOOTLOADER
These bootloaders are usually 4096 bytes for the atmega32u4 chip.
Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [avrdude](http://www.nongnu.org/avrdude/) with avr109 / `:avrdude` (recommended commandline)
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
Flashing sequence:
1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters)
2. Wait for the OS to detect the device
4. Flash a .hex file
5. Wait for the device to reset automatically
or
make <keyboard>:<keymap>:avrdude
## Halfkay
Halfkay is a super-slim protocol developed by PJRC that uses HID, and come on all Teensys (namely the 2.0).
This bootloader is 512 bytes.
Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
* [Teensy Loader Command Line](https://www.pjrc.com/teensy/loader_cli.html) (recommended commandline)
Flashing sequence:
1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters)
2. Wait for the OS to detect the device
4. Flash a .hex file
5. Reset the device into application mode (may be done automatically)

View File

@@ -1,6 +1,6 @@
# Installing Build Tools
This page describes setting up the build environment for QMK. These instructions cover AVR processors (such as the atmega32u4.)
This page describes setting up the build environment for QMK. These instructions cover AVR processors (such as the atmega32u4).
<!-- FIXME: We should have ARM instructions somewhere. -->
@@ -44,7 +44,7 @@ By default, this will download compilers for both AVR and ARM. If you don't need
nix-shell --arg arm false
## Mac
## macOS
If you're using [homebrew,](http://brew.sh/) you can use the following commands:
brew tap osx-cross/avr
@@ -58,10 +58,10 @@ This is the recommended method. If you don't have homebrew, [install it!](http:/
## Windows with msys2 (recommended)
The best environment to use, for Windows Vista through any later version (tested on 7 and 10,) is [msys2](http://www.msys2.org).
The best environment to use, for Windows Vista through any later version (tested on 7 and 10), is [msys2](http://www.msys2.org).
* Install msys2 by downloading and following the instructions here: http://www.msys2.org
* Open the "MSYS2 MingGW 64-bit" shortcut
* Install msys2 by downloading it and following the instructions here: http://www.msys2.org
* Open the ``MSYS2 MingGW 64-bit`` shortcut
* Navigate to your qmk checkout. For example, if it's in the root of your c drive:
* `$ cd /c/qmk_firmware`
* Run `util/msys2_install.sh` and follow the prompts
@@ -80,7 +80,7 @@ If you already have cloned the repository on your Windows file system you can ig
You will need to clone the repository to your Windows file system using the normal Git for Windows and **not** the WSL Git. So if you haven't installed Git before, [download](https://git-scm.com/download/win) and install it. Then [set it up](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup), it's important that you setup the e-mail and user name, especially if you are planning to contribute.
Once Git is installed, open the Git bash command and change the directory to where you want to clone QMK, note that you have to use forward slashes, and that your c drive is accessed like this `/c/path/to/where/you/want/to/go`. Then run `git clone --recurse-submodules https://github.com/qmk/qmk_firmware`, this will create a new folder `qmk_firmware` as a subfolder of the current one.
Once Git is installed, open the Git Bash command and change the directory to where you want to clone QMK; note that you have to use forward slashes, and that your c drive is accessed like this `/c/path/to/where/you/want/to/go`. Then run `git clone --recurse-submodules https://github.com/qmk/qmk_firmware`, this will create a new folder `qmk_firmware` as a subfolder of the current one.
### Toolchain setup
The Toolchain setup is done through the Windows Subsystem for Linux, and the process is fully automated. If you want to do everything manually, there are no other instructions than the scripts themselves, but you can always open issues and ask for more information.
@@ -122,8 +122,11 @@ If this is a bit complex for you, Docker might be the turn-key solution you need
# defaults are ergodox/default
docker run -e keymap=gwen -e keyboard=ergodox_ez --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
```
# On windows docker seems to have issue with VOLUME tag in Dockerfile, and $('pwd') won't print a windows compliant path, use full path instead like this
On Windows Docker seems to have issues with the VOLUME tag in Dockerfile, and `$('pwd')` won't print a Windows compliant path; use full path instead, like this:
```bash
docker run -e keymap=default -e keyboard=ergobox_ez --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware
```
@@ -131,4 +134,4 @@ docker run -e keymap=default -e keyboard=ergobox_ez --rm -v D:/Users/Sacapuces/D
This will compile the targeted keyboard/keymap and leave it in your QMK directory for you to flash.
## Vagrant
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [vagrant guide](vagrant_guide.md).
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [vagrant guide](getting_started_vagrant.md).

View File

@@ -52,7 +52,7 @@ 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:
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:
![New Pull Request](http://i.imgur.com/DxMHpJ8.jpg)
@@ -60,4 +60,4 @@ Here you'll be able to see exactly what you've committed - if it all looks good,
![Create Pull Request](http://i.imgur.com/Ojydlaj.jpg)
After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :)
After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :)

View File

@@ -1,22 +1,22 @@
# Introduction
This page attempts to explain the basic information you need to know to work with the QMK project. It assumes that you are familiar with navigating a UNIX shell, but does not assume you are familiar with C or with compiling using make.
This page attempts to explain the basic information you need to know to work with the QMK project. It assumes that you are familiar with navigating a Unix shell, but does not assume you are familiar with C or with compiling using make.
## Basic QMK structure
QMK is a fork of @tmk's [tmk_keyboard](https://github.com/tmk/tmk_keyboard) project. The original TMK code, with modifications, can be found in the `tmk` folder. The QMK additions to the project may be found in the `quantum` folder. Keyboard projects may be found in the `handwired` and `keyboard` folders.
QMK is a fork of [Jun Wako](https://github.com/tmk)'s [tmk_keyboard](https://github.com/tmk/tmk_keyboard) project. The original TMK code, with modifications, can be found in the `tmk` folder. The QMK additions to the project may be found in the `quantum` folder. Keyboard projects may be found in the `handwired` and `keyboard` folders.
### Keyboard project structure
Within the `handwired` and `keyboard` folders is a directory for each keyboard project, for example `qmk_firmware/keyboards/clueboard`. Within you'll find the following structure:
Within the folder `keyboards` and its subfolder `handwired` is a directory for each keyboard project, for example `qmk_firmware/keyboards/clueboard`. Within it you'll find the following structure:
* `keymaps/`: Different keymaps that can be built
* `rules.mk`: The file that sets the default "make" options. Do not edit this file directly, instead use a keymap specific `Makefile`.
* `rules.mk`: The file that sets the default "make" options. Do not edit this file directly, instead use a keymap specific `Makefile`
* `config.h`: The file that sets the default compile time options. Do not edit this file directly, instead use a keymap specific `config.h`.
### Keymap structure
In every keymap folder, the following files may be found. Only `keymap.c` is required, if the rest of the files are not found the default options will be chosen.
In every keymap folder, the following files may be found. Only `keymap.c` is required, and if the rest of the files are not found the default options will be chosen.
* `config.h`: the options to configure your keymap
* `keymap.c`: all of your keymap code, required
@@ -30,7 +30,7 @@ There are 2 `config.h` locations:
* keyboard (`/keyboards/<keyboard>/config.h`)
* keymap (`/keyboards/<keyboard>/keymaps/<keymap>/config.h`)
If the keymap `config.h` exists that file is included by the build system and the keyboard `config.h` is not included. If you wish to override settings in your keymap's `config.h` you will need to include some glue code:
If the keymap `config.h` exists, that file is included by the build system and the keyboard `config.h` is not included. If you wish to override settings in your keymap's `config.h` you will need to include some glue code:
```
#ifndef CONFIG_USER_H

View File

@@ -131,7 +131,7 @@ This consumes about 5390 bytes.
`KEY_LOCK_ENABLE`
This enables [key lock](key_lock.md). This consumes an additional 260 bytes.
This enables [key lock](feature_key_lock.md). This consumes an additional 260 bytes.
## Customizing Makefile options on a per-keymap basis

View File

@@ -36,7 +36,7 @@ An alternative keyboard layout developed by Dr. August Dvorak in the 1930's. A s
## Dynamic Macro
A macro which has been recorded on the keyboard and which will be lost when the keyboard is unplugged or the computer rebooted.
* [Dynamic Macro Documentation](dynamic_macros.html)
* [Dynamic Macro Documentation](feature_dynamic_macros.md)
## Eclipse
An IDE that is popular with many C developers.
@@ -93,7 +93,7 @@ A wiring pattern of columns and rows that enables the MCU to detect keypresses w
## Macro
A feature that lets you send muiltple keypress events (hid reports) after having pressed only a single key.
* [Macro Documentation](macros.html)
* [Macro Documentation](feature_macros.md)
## MCU
Microcontrol Unit, the processor that powers your keyboard.
@@ -104,7 +104,7 @@ A key that is held down while typing another key to modify the action of that ke
## Mousekeys
A feature that lets you control your mouse cursor and click from your keyboard.
* [Mousekeys Documentation](mouse_keys.html)
* [Mousekeys Documentation](feature_mouse_keys.html)
## N-Key Rollover (NKRO)
A term that applies to keyboards that are capable of reporting any number of key-presses at once.
@@ -133,7 +133,7 @@ A 1 byte number that is sent as part of a HID report over USB that represents a
## Space Cadet Shift
A special set of shift keys which allow you to type various types of braces by tapping the left or right shift one or more times.
* [Space Cadet Shift Documentation](space_cadet_shift.html)
* [Space Cadet Shift Documentation](feature_space_cadet.html)
## Tap
Pressing and releasing a key. In some situations you will need to distinguish between a key down and a key up event, and Tap always refers to both at once.
@@ -141,7 +141,7 @@ Pressing and releasing a key. In some situations you will need to distinguish be
## Tap Dance
A feature that lets you assign muiltple keycodes to the same key based on how many times you press it.
* [Tap Dance Documentation](tap_dance.md)
* [Tap Dance Documentation](feature_tap_dance.md)
## Teensy
A low-cost AVR development board that is commonly used for hand-wired builds. A teensy is often chosen despite costing a few dollors more due to its halfkay bootloader, which makes flashing very simple.
@@ -152,7 +152,7 @@ A generic term for LEDs that light the underside of the board. These LED's typic
## Unicode
In the larger computer world Unicode is a set of encoding schemes for representing characters in any language. As it relates to QMK it means using various OS schemes to send unicode codepoints instead of scancodes.
* [Unicode Documentation](unicode.md)
* [Unicode Documentation](feature_unicode.md)
## Unit Testing
A framework for running automated tests against QMK. Unit testing helps us be confident that our changes do not break anything.

8
docs/hardware.md Normal file
View File

@@ -0,0 +1,8 @@
# Hardware
QMK runs on a variety of hardware. If your processor can be targetted by [LUFA](http://www.fourwalledcubicle.com/LUFA.php) or [ChibiOS](http://www.chibios.com) you can probably get QMK running on it. This section explores getting QMK running on, and communicating with, hardware of all kinds.
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* [AVR Processors](hardware_avr.md)
* ARM Processors (TBD)
* [Drivers](hardware_drivers.md)

157
docs/hardware_avr.md Normal file
View File

@@ -0,0 +1,157 @@
# Keyboards With AVR Processors
This page describes the support for for AVR processors in QMK. AVR processors include the atmega32u4, atmega32u2, at90usb1286, and other processors from Atmel Corporation. AVR processors are 8-bit MCU's that are designed to be easy to work with. The most common AVR processors in keyboards have on-board USB and plenty of GPIO for supporting large keyboard matrices. They are the most popular MCU for use in keyboards today.
If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_guidelines.md) to get a sense of how keyboards fit into QMK.
## Adding Your AVR Keyboard to QMK
QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started run the `util/new_project.sh` script:
```
$ util/new_project.sh my_awesome_keyboard
######################################################
# /keyboards/my_awesome_keyboard project created. To start
# working on things, cd into keyboards/my_awesome_keyboard
######################################################
```
This will create all the files needed to support your new keyboard, and populate the settings with default values. Now you just need to customize it for your keyboard.
## `readme.md`
This is where you'll describe your keyboard. Please follow the [Keyboard Readme Template](documentation_templates.md#keyboard-readmemd-template) when writing your `readme.md`. You're encouraged to place an image at the top of your `readme.md`, please use an external service such as [Imgur](http://imgur.com) to host the images.
## `<keyboard>.c`
This is where all the custom logic for your keyboard goes. Many keyboards do not need to put anything at all in here. You can learn more about writing custom logic in [Custom Quantum Functions](custom_quantum_functions.md).
## `<keyboard>.h`
This is the file you define your [Layout Macro(s)](feature_layouts.md) in. At minumum you should have a `#define LAYOUT` for your keyboard that looks something like this:
```
#define LAYOUT( \
k00, k01, k02, \
k10, k11 \
) { \
{ k00, k01, k02 }, \
{ k10, KC_NO, k11 }, \
}
```
The first half of the `LAYOUT` pre-processor macro defines the physical arrangement of keys. The second half of the macro defines the matrix the switches are connected to. This allows you to have a physical arrangement of keys that differs from the wiring matrix.
Each of the `k__` variables needs to be unique, and typically they follow the format `k<row><col>`.
The physical matrix (the second half) must have a number of rows equalling `MATRIX_ROWS`, and each row must have exactly `MATRIX_COLS` elements in it. If you do not have this many physical keys you can use `KC_NO` to fill in the blank spots.
## `config.h`
The `config.h` file is where you configure the hardware and feature set for your keyboard. There are a lot of options that can be placed in that file, too many to list there. For a complete overview of available options see the [Config Options](config_options.md) page.
### Hardware Configuration
At the top of the `config.h` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `VENDOR_ID` as `0xFEED`. For the `PRODUCT_ID` you should pick a number that is not yet in use.
Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately reflect your keyboard.
```
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT my_awesome_keyboard
#define DESCRIPTION A custom keyboard
```
{% hint style='info' %}
Note: On Windows and macOS the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. On Linux these values will not be visible in `lsusb`, since Linux takes that information from the list published by the USB-IF.
{% endhint %}
### Keyboard Matrix Configuration
The next section of the `config.h` file deals with your keyboard's matrix. The first thing you should set is the matrix's size. This is usually, but not always, the same number of rows and columns as the physical key arrangement.
```
#define MATRIX_ROWS 2
#define MATRIX_COLS 3
```
Once you've defined the size of your matrix you need to define which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins:
```
#define MATRIX_ROW_PINS { D0, D5 }
#define MATRIX_COL_PINS { F1, F0, B0 }
#define UNUSED_PINS
```
The number of `MATRIX_ROW_PINS` entries must be the same as the number you assigned to `MATRIX_ROWS`, and likewise for `MATRIX_COL_PINS` and `MATRIX_COLS`. You do not have to specify `UNUSED_PINS`, but you can if you want to document what pins are open.
Finally, you can specify the direction your diodes point. This can be `COL2ROW`, `ROW2COL`, or `CUSTOM_MATRIX`.
```
#define DIODE_DIRECTION COL2ROW
```
### Backlight Configuration
By default QMK supports backlighting on pins `B5`, `B6`, and `B7`. If you are using one of those you can simply enable it here. For more details see the [Backlight Documentation](feature_backlight.md).
```
#define BACKLIGHT_PIN B7
#define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
```
{% hint style='info' %}
You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details.
{% endhint %}
### Other Configuration Options
There are a lot of features that can be configured or tuned in `config.h`. You should see the [Config Options](config_options.md) page for more details.
## `rules.mk`
You use the `rules.mk` file to tell QMK what files to build and what features to enable. If you are building around an atmega32u4 you can largely leave these defaults alone. If you are using another MCU you may have to tweak some parameters.
### MCU Options
These options tell the build system what CPU to build for. Be very careful if you change any of these settings, you can render your keyboard inoperable.
```
MCU = atmega32u4
F_CPU = 16000000
ARCH = AVR8
F_USB = $(F_CPU)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
```
### Bootloader Size
The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. If you are using a teensy 2.0, or a device like the Ergodox EZ that uses the teensy bootloader you should set this to `512`. Most other bootloaders should be set to `4096`, but `1024` and `2048` are other possible values you may encounter.
#### Teensy 2.0 Bootloader Example
```
OPT_DEFS += -DBOOTLOADER_SIZE=512
```
#### Teensy 2.0++ Bootloader Example
```
OPT_DEFS += -DBOOTLOADER_SIZE=1024
```
#### Atmel DFU Loader Example
```
OPT_DEFS += -DBOOTLOADER_SIZE=4096
```
### Build Options
There are a number of features that can be turned on or off in `rules.mk`. See the [Config Options](config_options.md#feature-options) page for a detailed list and description.

27
docs/hardware_drivers.md Normal file
View File

@@ -0,0 +1,27 @@
# QMK Hardware Drivers
QMK is used on a lot of different hardware. While support for the most common MCU's and matrix configurations is built-in there are a number of drivers that can be added to a keyboard to support additional hardware. Examples include mice and other pointing devices, i/o expanders for split keyboards, bluetooth modules, and LCD, OLED, and TFT screens.
<!-- FIXME: This should talk about how drivers are integrated into QMK and how you can add your own driver.
# Driver System Overview
-->
# Available Drivers
## ProMicro (AVR only)
Support for addressing pins on the ProMicro by their Arduino name rather than their AVR name. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
## SSD1306 (AVR only)
Support for SSD1306 based OLED displays. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
## uGFX
You can make use of uGFX within QMK to drive character and graphic LCD's, LED arrays, OLED, TFT, and other display technologies. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
## WS2812 (AVR only)
Support for WS2811/WS2812{a,b,c} LED's. For more information see the [RGB Light](feature_rgblight.md) page.

View File

@@ -0,0 +1,137 @@
# QMK Keyboard Guidelines
We welcome all keyboard projects into QMK, but ask that you try to stick to a couple guidelines that help us keep things organised and consistent.
## Naming your keyboard/project
All names should be lowercase alphanumeric, and separated by an underscore (`_`), but not begin with one. Your directory and your `.h` and `.c` files should have exactly the same name. All folders should follow the same format.
## `readme.md`
All projects need to have a `readme.md` file that explains what the keyboard is, who made it, where it is available, and links to more information. Please follow the [published template](documentation_templates.md#keyboard-readmemd-template).
## Image/Hardware files
In an effort to keep the repo size down, we're no longer accepting images of any format in the repo, with few exceptions. Hosting them elsewhere (imgur) and linking them in the `readme.md` is the preferred method.
Any sort of hardware file (plate, case, pcb) can't be stored in qmk_firmware, but we have the [qmk.fm repo](https://github.com/qmk/qmk.fm) where such files (as well as in-depth info) can be stored and viewed on [qmk.fm](http://qmk.fm). Downloadable files are stored in `/<keyboard>/` (name follows the same format as above) which are served at `http://qmk.fm/<keyboard>/`, and pages are generated from `/_pages/<keyboard>/` which are served at the same location (.md files are generated into .html files through Jekyll). Check out the `lets_split` directory for an example.
## Keyboard Metadata
As QMK grows so does the ecosystem surrounding QMK. To make it easier for projects in that ecosystem to tie into QMK as we make changes we are developing a metadata system to expose information about keyboards in QMK.
You can create `info.json` files at every level under `qmk_firmware/keyboards/<name>` to specify this metadata. These files are combined, with more specific files overriding keys in less specific files. This means you do not need to duplicate your metadata information. For example, `qmk_firmware/keyboards/clueboard/info.json` specifies `manufacturer` and `maintainer`, while `qmk_firmware/keyboards/clueboard/66/info.json` specifies more specific information about Clueboard 66%.
### `info.json` Format
The `info.json` file is a JSON formatted dictionary with the following keys available to be set. You do not have to set all of them, merely the keys that apply to your keyboard.
* `keyboard_name`
* A free-form text string describing the keyboard.
* Example: `Clueboard 66%`
* `manufacturer`
* A free-form text string naming the manufacturer.
* Example: `Clueboard`
* `identifier`
* The Vendor, Product, and Revision ID's joined by a :
* Example: `c1ed:2370:0001`
* `url`
* A URL to the keyboard's product page, [QMK.fm/keyboards](https://qmk.fm/keyboards) page, or other page describing information about the keyboard.
* `processor`
* The MCU or CPU this keyboard uses.
* Example: `atmega32u4` or `stm32f303`
* `bootloader`
* What bootloader this keyboard uses. Available options:
* `atmel-dfu`
* `kiibohd-dfu-util`
* `lufa-dfu`
* `qmk-dfu`
* `stm32-dfu-util`
* (FIXME: This list is incomplete.)
* `maintainer`
* GitHub username of the maintainer, or `qmk` for community maintained boards
* `width`
* Width of the board in Key Units
* `height`
* Height of the board in Key Units
* `layouts`
* Physical Layout representations. See the next section for more detail.
#### Layout Format
Within our `info.json` file the `layouts` portion of the dictionary contains several nested dictionaries. The outer layer consists of QMK layout macros, for example `LAYOUT_ansi` or `LAYOUT_iso`. Within each layout macro are keys for `width`, `height`, and `key_count`, each of which should be self-explanatory.
* `width`
* Optional: The width of the layout in Key Units
* `height`
* Optional: The height of the layout in Key Units
* `key_count`
* **Required**: The number of keys in this layout
* `layout`
* A list of Key Dictionaries describing the physical layout. See the next section for more details.
#### Key Dictionary Format
Each Key Dictionary in a layout describes the physical properties of a key. If you are familiar with the Raw Code for <http://keyboard-layout-editor.com> you will find many of the concepts the same. We re-use the same key names and layout choices wherever possible, but unlike keyboard-layout-editor each key is stateless, inheriting no properties from the keys that came before it.
All key positions and rotations are specified in relation to the top-left corner of the keyboard, and the top-left corner of each key.
* `X`
* **Required**: The absolute position of the key in the horizontal axis, in Key Units.
* `Y`
* **Required**: The absolute position of the key in the vertical axis, in Key Units.
* `W`
* The width of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `H`
* The height of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `R`
* How many degrees clockwise to rotate the key.
* `RX`
* The absolute position of the point to rotate the key around in the horizontal axis. Default: `x`
* `RY`
* The absolute position of the point to rotate the key around in the vertical axis. Default: `y`
* `KS`
* Key Shape: define a polygon by providing a list of points, in Key Units.
* **Important**: These are relative to the top-left of the key, not absolute.
* Example ISO Enter: `[ [0,0], [1.5,0], [1.5,2], [0.25,2], [0.25,1], [0,1], [0,0] ]`
### How Is The Metadata Exposed?
This metadata is primarily used in two ways:
* To allow web-based configurators to dynamically generate UI
* To support the new `make keyboard:keymap:qmk` target, which bundles this metadata up with the firmware to allow QMK Toolbox to be smarter.
Configurator authors can see the [QMK Compiler](https://docs.compile.qmk.fm/api_docs.html) docs for more information on using the JSON API.
## Non-production/handwired projects
We're happy to accept any project that uses QMK, including prototypes and handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder!
## Warnings as errors
When developing your keyboard, keep in mind that all warnings will be treated as errors - these small warnings can build-up and cause larger errors down the road (and keeping them is generally a bad practice).
## Copyright Blurb
If you're adapting your keyboard's setup from another project, but not using the same code, but sure to update the copyright header at the top of the files to show your name, in this format:
Copyright 2017 Your Name <your@email.com>
If you are modifying someone else's code and have made only trivial changes you should leave their name in the copyright statement. If you have done significant work on the file you should add your name to theirs, like so:
Copyright 2017 Their Name <original_author@example.com> Your Name <you@example.com>
The year should be the first year the file is created. If work was done to that file in later years you can reflect that by appending the second year to the first, like so:
Copyright 2015-2017 Your Name <you@example.com>
## License
The core of QMK is licensed under the [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). If you are shipping binaries for AVR processors you may choose either [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or [GPLv3](https://www.gnu.org/licenses/gpl.html). If you are shipping binaries for ARM processors you must choose [GPL Version 3](https://www.gnu.org/licenses/gpl.html) to comply with the [ChibiOS](http://www.chibios.org) GPLv3 license.
If your keyboard makes use of the [uGFX](https://ugfx.io) features within QMK you must comply with the [uGFX License](https://ugfx.io/license.html), which requires a separate commercial license before selling a device containing uGFX.
## Technical details
If you're looking for more information on making your keyboard work with QMK, [check out the hardware section](hardware.md)!

View File

@@ -187,22 +187,22 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
|`KC_KP_EQUAL_AS400`||Keypad Equal Sign|
|`KC_NO`||Ignore this key. (NOOP) |
|`KC_TRNS`||Make this key transparent to find the key on a lower layer.|
|[`KC_MS_UP`](mouse_keys.md)|`KC_MS_U`|Mouse Cursor Up|
|[`KC_MS_DOWN`](mouse_keys.md)|`KC_MS_D`|Mouse Cursor Down|
|[`KC_MS_LEFT`](mouse_keys.md)|`KC_MS_L`|Mouse Cursor Left|
|[`KC_MS_RIGHT`](mouse_keys.md)|`KC_MS_R`|Mouse Cursor Right|
|[`KC_MS_BTN1`](mouse_keys.md)|`KC_BTN1`|Mouse Button 1|
|[`KC_MS_BTN2`](mouse_keys.md)|`KC_BTN2`|Mouse Button 2|
|[`KC_MS_BTN3`](mouse_keys.md)|`KC_BTN3`|Mouse Button 3|
|[`KC_MS_BTN4`](mouse_keys.md)|`KC_BTN4`|Mouse Button 4|
|[`KC_MS_BTN5`](mouse_keys.md)|`KC_BTN5`|Mouse Button 5|
|[`KC_MS_WH_UP`](mouse_keys.md)|`KC_WH_U`|Mouse Wheel Up|
|[`KC_MS_WH_DOWN`](mouse_keys.md)|`KC_WH_D`|Mouse Wheel Down|
|[`KC_MS_WH_LEFT`](mouse_keys.md)|`KC_WH_L`|Mouse Wheel Left|
|[`KC_MS_WH_RIGHT`](mouse_keys.md)|`KC_WH_R`|Mouse Wheel Right|
|[`KC_MS_ACCEL0`](mouse_keys.md)|`KC_ACL0`|Mouse Acceleration 0|
|[`KC_MS_ACCEL1`](mouse_keys.md)|`KC_ACL1`|Mouse Acceleration 1|
|[`KC_MS_ACCEL2`](mouse_keys.md)|`KC_ACL2`|Mouse Acceleration 2|
|[`KC_MS_UP`](feature_mouse_keys.md)|`KC_MS_U`|Mouse Cursor Up|
|[`KC_MS_DOWN`](feature_mouse_keys.md)|`KC_MS_D`|Mouse Cursor Down|
|[`KC_MS_LEFT`](feature_mouse_keys.md)|`KC_MS_L`|Mouse Cursor Left|
|[`KC_MS_RIGHT`](feature_mouse_keys.md)|`KC_MS_R`|Mouse Cursor Right|
|[`KC_MS_BTN1`](feature_mouse_keys.md)|`KC_BTN1`|Mouse Button 1|
|[`KC_MS_BTN2`](feature_mouse_keys.md)|`KC_BTN2`|Mouse Button 2|
|[`KC_MS_BTN3`](feature_mouse_keys.md)|`KC_BTN3`|Mouse Button 3|
|[`KC_MS_BTN4`](feature_mouse_keys.md)|`KC_BTN4`|Mouse Button 4|
|[`KC_MS_BTN5`](feature_mouse_keys.md)|`KC_BTN5`|Mouse Button 5|
|[`KC_MS_WH_UP`](feature_mouse_keys.md)|`KC_WH_U`|Mouse Wheel Up|
|[`KC_MS_WH_DOWN`](feature_mouse_keys.md)|`KC_WH_D`|Mouse Wheel Down|
|[`KC_MS_WH_LEFT`](feature_mouse_keys.md)|`KC_WH_L`|Mouse Wheel Left|
|[`KC_MS_WH_RIGHT`](feature_mouse_keys.md)|`KC_WH_R`|Mouse Wheel Right|
|[`KC_MS_ACCEL0`](feature_mouse_keys.md)|`KC_ACL0`|Mouse Acceleration 0|
|[`KC_MS_ACCEL1`](feature_mouse_keys.md)|`KC_ACL1`|Mouse Acceleration 1|
|[`KC_MS_ACCEL2`](feature_mouse_keys.md)|`KC_ACL2`|Mouse Acceleration 2|
|[`RESET`](quantum_keycodes.md#qmk-keycodes)||Put the keyboard into DFU mode for flashing|
|[`DEBUG`](quantum_keycodes.md#qmk-keycodes)||Toggles debug mode|
|[`KC_GESC`](quantum_keycodes.md#qmk-keycodes)|`GRAVE_ESC`|Acts as escape when pressed normally but when pressed with Shift or GUI will send a `~`|
@@ -311,5 +311,5 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
|[`TT(layer)`](feature_common_shortcuts.md#switching-and-toggling-layers)||tap toggle? idk FIXME`|
|[`OSM(mod)`](quantum_keycodes.md#one-shot-keys)||hold mod for one keypress|
|[`OSL(layer)`](quantum_keycodes.md#one-shot-keys)||switch to layer for one keypress|
|[`UNICODE(n)`](unicode.md)|[`UC(n)`](unicode.md)|if `UNICODE_ENABLE`, this will send characters up to `0x7FFF`|
|[`X(n)`](unicode.md)||if `UNICODEMAP_ENABLE`, also sends unicode via a different method|
|[`UNICODE(n)`](feature_unicode.md)|[`UC(n)`](feature_unicode.md)|if `UNICODE_ENABLE`, this will send characters up to `0x7FFF`|
|[`X(n)`](feature_unicode.md)||if `UNICODEMAP_ENABLE`, also sends unicode via a different method|

View File

@@ -35,7 +35,7 @@ Keymap layer has its state in two 32 bit parameters:
Keymap has its state in two parameter **`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit.
Keymap layer '0' is usually `default_layer` and which is the only valid layer and other layers is initially off after boot up firmware, though, you can configured them in `config.h`.
To change `default_layer` will be useful when you switch key layout completely, say you want Colmak instead of Qwerty.
To change `default_layer` will be useful when you switch key layout completely, say you want Colemak instead of Qwerty.
Initial state of Keymap Change base layout
----------------------- ------------------

View File

@@ -1,63 +0,0 @@
# Porting your keyboard to QMK
This page describes the technical details of porting an existing keyboard to QMK. If you're looking to add your keyboard to QMK, please [look through these guidelines](adding_a_keyboard_to_qmk.md)!
If your keyboard is running an Atmega chip (atmega32u4 and others), it's pretty easy to get things setup for compiling your own firmware to flash onto your board. There is a `/util/new_project.sh <keyboard>` script to help get you started - you can simply pass your keyboard's name into the script, and all of the necessary files will be created. The components of each are described below.
## `/keyboards/<keyboard>/config.h`
The `USB Device descriptor parameter` block contains parameters are used to uniquely identify your keyboard, but they don't really matter to the machine.
Your `MATRIX_ROWS` and `MATRIX_COLS` are the numbers of rows and cols in your keyboard matrix - this may be different than the number of actual rows and columns on your keyboard. There are some tricks you can pull to increase the number of keys in a given matrix, but most keyboards are pretty straight-forward.
The `MATRIX_ROW_PINS` and `MATRIX_COL_PINS` are the pins your MCU uses on each row/column. Your schematic (if you have one) will have this information on it, and the values will vary depending on your setup. This is one of the most important things to double-check in getting your keyboard setup correctly.
For the `DIODE_DIRECTION`, most hand-wiring guides will instruct you to wire the diodes in the `COL2ROW` position, but it's possible that they are in the other - people coming from EasyAVR often use `ROW2COL`. Nothing will function if this is incorrect.
`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to. Currently only B5, B6, and B7 are supported.
`BACKLIGHT_BREATHING` is a fancier backlight feature that adds breathing/pulsing/fading effects to the backlight. It uses the same timer as the normal backlight. These breathing effects must be called by code in your keymap.
`BACKLIGHT_LEVELS` is how many levels exist for your backlight - max is 15, and they are computed automatically from this number.
## `/keyboards/<keyboard>/rules.mk`
The values at the top likely won't need to be changed, since most boards use the `atmega32u4` chip. The `BOOTLOADER_SIZE` will need to be adjusted based on your MCU type. It's defaulted to the Teensy, since that's the most common controller. Below is quoted from the `Makefile`.
```
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=512
```
At the bottom of the file, you'll find lots of features to turn on and off - all of these options should be set with `?=` to allow for the keymap overrides. `?=` only assigns if the variable was previously undefined. For the full documenation of these features, see the [Makefile options](getting_started_make_guide.md#makefile-options).
## `/keyboards/<keyboard>/readme.md`
This is where you'll describe your keyboard - please write as much as you can about it! Talking about default functionality/features is useful here. Feel free to link to external pages/sites if necessary. Images can be included here as well, as long as they're hosted elsewhere (imgur).
## `/keyboards/<keyboard>/<keyboard>.c`
This is where all of the custom logic for your keyboard goes - you may not need to put anything in this file, since a lot of things are configured automatically. All of the `*_kb()` functions are defined here. If you modify them, remember to keep the calls to `*_user()`, or things in the keymaps might not work. You can read more about the functions [here](custom_quantum_functions.md).
## `/keyboards/<keyboard>/<keyboard>.h`
Here is where you can (optionally) define your `KEYMAP` function to remap your matrix into a more readable format. With ortholinear boards, this isn't always necessary, but it can help to accomodate the dead spots on your matrix, where there are keys that take up more than one space (2u, staggering, 6.25u, etc). The example shows the difference between the physical keys, and the matrix design:
```
#define KEYMAP( \
k00, k01, k02, \
k10, k11 \
) \
{ \
{ k00, k01, k02 }, \
{ k10, KC_NO, k11 }, \
}
```
Each of the `kxx` variables needs to be unique, and usually follows the format `k<row><col>`. You can place `KC_NO` where your dead keys are in your matrix.

View File

@@ -16,7 +16,7 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are
|`KC_LSPO`|Left shift when held, open paranthesis when tapped|
|`KC_RSPC`|Right shift when held, close paranthesis when tapped|
|`KC_LEAD`|The [leader key](feature_leader_key.md)|
|`KC_LOCK`|The [lock key](key_lock.md)|
|`KC_LOCK`|The [lock key](feature_key_lock.md)|
|`FUNC(n)`/`F(n)`|Call `fn_action(n)` (deprecated)|
|`M(n)`|to call macro n|
|`MACROTAP(n)`|to macro-tap n idk FIXME|

View File

@@ -1,12 +1,44 @@
{
"redirects": [
{
"from": "adding_a_keyboard_to_qmk.html",
"to": "hardware_keyboard_guidelines.html"
},
{
"from": "build_environment_setup.html",
"to": "getting_started_build_tools.html"
},
{
"from": "dynamic_macros.html",
"to": "feature_dynamic_macros.html"
},
{
"from": "feature_common_shortcuts.html",
"to": "feature_advanced_keycodes.html"
},
{
"from": "key_lock.html",
"to": "feature_key_lock.html"
},
{
"from": "make_instructions.html",
"to": "getting_started_make_guide.html"
},
{
"from": "porting_your_keyboard_to_qmk.html",
"to": "hardware_avr.html"
},
{
"from": "space_cadet_shift.html",
"to": "feature_space_cadet.html"
},
{
"from": "tap_dance.html",
"to": "feature_tap_dance.html"
},
{
"from": "unicode.html",
"to": "feature_unicode.html"
}
]
}
}

5
keyboards/6ball/6ball.c Normal file
View File

@@ -0,0 +1,5 @@
#include "6ball.h"
void matrix_init_kb(void) {
matrix_init_user();
}

16
keyboards/6ball/6ball.h Normal file
View File

@@ -0,0 +1,16 @@
#ifndef SIXBALL_H
#define SIXBALL_H
#include "quantum.h"
#define KEYMAP( \
k01, k02, k03, \
k04, k05, k06 \
) \
{ \
{ k02, k03, k06, k05, k04, k01 } \
}
#define KC_KEYMAP(k01, k02, k03, k04, k05, k06) KEYMAP(KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06)
#endif

53
keyboards/6ball/config.h Normal file
View File

@@ -0,0 +1,53 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xCEEB
#define PRODUCT_ID 0x0007
#define DEVICE_VER 0x0001
#define MANUFACTURER That-Canadian
#define PRODUCT 6-Ball
#define DESCRIPTION 6-Ball Macropuck
/* key matrix size */
#define MATRIX_ROWS 1
#define MATRIX_COLS 6
/* pin-out */
#define MATRIX_ROW_PINS { F5 }
#define MATRIX_COL_PINS { F4, D4, B5, B6, B2, F6 }
#define UNUSED_PINS
/* ws2812 RGB LED */
#define RGB_DI_PIN F7
#define RGBLIGHT_TIMER
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 6 // Number of LEDs
#define ws2812_PORTREG PORTD
#define ws2812_DDRREG DDRD
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
#define TAPPING_TERM 200
#endif

View File

@@ -0,0 +1,28 @@
#include "6ball.h"
#define _MAIN 0
#define _FN 1
#define KC_ KC_TRNS
#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen
#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen
#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen
#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen
#define KC_X0 LT(_FN, KC_ESC)
#define KC_RTOG RGB_TOG
#define KC_RMOD RGB_MOD
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAIN] = KC_KEYMAP(
F , X0 ,LCTL,
R , D , M
),
[_FN] = KC_KEYMAP(
F , ,RHUI,
RTOG,RMOD,RHUD
)
};

View File

@@ -0,0 +1,3 @@
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

14
keyboards/6ball/readme.md Normal file
View File

@@ -0,0 +1,14 @@
6-Ball
======
A circular 6-key macropad made by ThatCanadian.
Keyboard Maintainer: QMK Community
Hardware Supported: Pro Micro ATmega32U4
Hardware Availability: ThatCanadian
Make example for this keyboard (after setting up your build environment):
make 6ball:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

67
keyboards/6ball/rules.mk Normal file
View File

@@ -0,0 +1,67 @@
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = yes # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

View File

@@ -0,0 +1,31 @@
#include "chimera_ortho.h"
void uart_init(void) {
SERIAL_UART_INIT();
}
void led_init(void) {
DDRD |= (1<<1);
PORTD |= (1<<1);
DDRF |= (1<<4) | (1<<5);
PORTF |= (1<<4) | (1<<5);
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
uart_init();
led_init();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
void led_set_kb(uint8_t usb_led) {
}

View File

@@ -0,0 +1,66 @@
#ifndef CHIMERA_ORTHO_H
#define CHIMERA_ORTHO_H
#include "quantum.h"
#include "matrix.h"
#include "backlight.h"
#include <stddef.h>
#define red_led_off PORTF |= (1<<5)
#define red_led_on PORTF &= ~(1<<5)
#define blu_led_off PORTF |= (1<<4)
#define blu_led_on PORTF &= ~(1<<4)
#define grn_led_off PORTD |= (1<<1)
#define grn_led_on PORTD &= ~(1<<1)
#define set_led_off red_led_off; grn_led_off; blu_led_off
#define set_led_red red_led_on; grn_led_off; blu_led_off
#define set_led_blue red_led_off; grn_led_off; blu_led_on
#define set_led_green red_led_off; grn_led_on; blu_led_off
#define set_led_yellow red_led_on; grn_led_on; blu_led_off
#define set_led_magenta red_led_on; grn_led_off; blu_led_on
#define set_led_cyan red_led_off; grn_led_on; blu_led_on
#define set_led_white red_led_on; grn_led_on; blu_led_on
/*
#define LED_B 5
#define LED_R 6
#define LED_G 7
#define all_leds_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G)
#define red_led_on PORTF |= (1<<LED_R)
#define red_led_off PORTF &= ~(1<<LED_R)
#define grn_led_on PORTF |= (1<<LED_G)
#define grn_led_off PORTF &= ~(1<<LED_G)
#define blu_led_on PORTF |= (1<<LED_B)
#define blu_led_off PORTF &= ~(1<<LED_B)
#define set_led_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G)
#define set_led_red PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_G) | (1<<LED_R)
#define set_led_blue PORTF = PORTF & ~(1<<LED_G) & ~(1<<LED_R) | (1<<LED_B)
#define set_led_green PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_R) | (1<<LED_G)
#define set_led_yellow PORTF = PORTF & ~(1<<LED_B) | (1<<LED_R) | (1<<LED_G)
#define set_led_magenta PORTF = PORTF & ~(1<<LED_G) | (1<<LED_R) | (1<<LED_B)
#define set_led_cyan PORTF = PORTF & ~(1<<LED_R) | (1<<LED_B) | (1<<LED_G)
#define set_led_white PORTF |= (1<<LED_B) | (1<<LED_R) | (1<<LED_G)
*/
// This a shortcut to help you visually see your layout.
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, k12, k13, \
k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, \
k28, k29, k31, k32, k33, k34, k35, k36, k37, k38, k41, k42, k43, k44,\
k45, k46, k47, k48 \
) \
{ \
{ KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k08, KC_##k09, KC_##k10, KC_##k11, KC_##k12 }, \
{ KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26 }, \
{ KC_##k29, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k37, KC_##k38, KC_##k41, KC_##k42, KC_##k43 }, \
{ KC_NO, KC_##k06, KC_##k20, KC_##k35, KC_##k46, KC_##k47, KC_##k36, KC_##k21, KC_##k07, KC_NO }, \
{ KC_NO, KC_##k28, KC_##k14, KC_##k00, KC_##k45, KC_##k48, KC_##k13, KC_##k27, KC_##k44, KC_NO }, \
}
#endif

View File

@@ -0,0 +1,87 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER unknown
#define PRODUCT Chimera Ortho
#define DESCRIPTION q.m.k. keyboard firmware for Chimera Ortho
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 10
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
//#define BACKLIGHT_LEVELS 3
#define ONESHOT_TIMEOUT 500
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
#define PREVENT_STUCK_MODIFIERS
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
//UART settings for communication with the RF microcontroller
#define SERIAL_UART_BAUD 1000000
#define SERIAL_UART_DATA UDR1
#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
#define SERIAL_UART_INIT() do { \
/* baud rate */ \
UBRR1L = SERIAL_UART_UBRR; \
/* baud rate */ \
UBRR1H = SERIAL_UART_UBRR >> 8; \
/* enable TX and RX */ \
UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
/* 8-bit data */ \
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
} while(0)
#endif

View File

@@ -0,0 +1,193 @@
// this is the style you want to emulate.
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
#include "chimera_ortho.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum chimera_ortho_layers
{
_QWERTY,
_CAPS,
_NUMPAD,
_SYMBOLS,
_MACROS,
_NAV
};
#define KC_NMPD TG(_NUMPAD)
#define KC_SYMB TG(_SYMBOLS)
#define KC_SPFN LT(_NAV,KC_EQL)
#define KC_SCTL MT(MOD_LCTL, KC_LBRC)
#define KC_SCTR MT(MOD_LCTL, KC_RBRC)
#define KC_SPLT MT(MOD_LALT, KC_MINS)
#define KC_SPRT MT(MOD_LALT, KC_1)
#define KC_GBRC MT(MOD_RGUI, KC_8)
#define KC_GQOT MT(MOD_LGUI, KC_QUOT)
#define KC_MESC LT(_MACROS, KC_ESC)
#define KC_INCL M(0)
#define KC_PULL M(1)
#define KC_PUSH M(2)
#define KC_SCAP M(3)
#define KC_SCOF M(4)
#define KC_CAD LALT(LCTL(KC_DEL))
#define LONGPRESS_DELAY 150
//#define LAYER_TOGGLE_DELAY 300
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define KC_ KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
MESC, Q , W , E , R , T ,SCTL, SCTR, Y , U , I , O , P ,QUOT,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
TAB , A , S , D , F , G ,SPLT, SPRT, H , J , K , L ,SCLN,ENT ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
LSPO, Z , X , C , V , B ,SPFN, GBRC, N , M ,COMM,DOT ,SLSH,RSPC,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
NMPD,BSPC, SPC ,SYMB
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_CAPS] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, , , , , , , , , , , , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , ,UNDS, , , , , ,COLN, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
SCOF, , , , , , , , , , , , ,SCOF,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_NUMPAD] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, ,COLN , , , , , , , 7 , 8 , 9 ,ASTR,MINS,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, ,DOT , , , , , , , 4 , 5 , 6 ,PLUS, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , , , , , 1 , 2 , 3 ,SLSH, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , 0
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_SYMBOLS] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
,EXLM, AT ,HASH,DLR ,PERC, , ,CIRC,AMPR,ASTR,LPRN,RPRN,BSLS,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, F1 , F2 , F3 , F4 , F5 , , ,TILD,COLN,UNDS,LCBR,RCBR, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, F6 , F7 , F8 , F9 ,F10 , , ,GRV ,SCLN,MINS,LBRC,RBRC, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
PIPE, , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_NAV] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, , , , , , , , , , UP , ,PSCR, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , , , , ,LEFT,DOWN,RGHT, , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , , , , ,PGUP,PGDN, , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
,DEL , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_MACROS] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, , , , , , , , , ,INCL, , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , ,CAD , , , , , , , , , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
SCAP, , , , , , , , , ,PULL,PUSH, ,SCAP,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
)
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
/* include some kind of library or header */
case 0:
if (record->event.pressed) {
SEND_STRING("#include <>");
return MACRO( T(LEFT), END);
}
break;
case 1:
if (record->event.pressed) {
SEND_STRING("git pull");
return MACRO( T(ENT), END );
}
break;
case 2:
if (record->event.pressed){
SEND_STRING("git push");
return MACRO( T(ENT), END );
}
break;
case 3:
if (record->event.pressed){
layer_on(_CAPS);
register_code(KC_CAPSLOCK);
unregister_code(KC_CAPSLOCK);
}
break;
case 4:
if (record->event.pressed){
layer_off(_CAPS);
register_code(KC_CAPSLOCK);
unregister_code(KC_CAPSLOCK);
}
break;
}
return MACRO_NONE;
};
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
switch (layer) {
case _QWERTY:
set_led_green;
break;
case _CAPS:
set_led_white;
break;
case _NUMPAD:
set_led_blue;
break;
case _SYMBOLS:
set_led_red;
break;
case _NAV:
set_led_magenta;
break;
case _MACROS:
set_led_cyan;
break;
default:
set_led_green;
break;
}
};

View File

@@ -0,0 +1,164 @@
/*
Copyright 2012 Jun Wako
Copyright 2014 Jack Humbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#if defined(__AVR__)
#include <avr/io.h>
#endif
#include "wait.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "timer.h"
#if (MATRIX_COLS <= 8)
# define print_matrix_header() print("\nr/c 01234567\n")
# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
# define matrix_bitpop(i) bitpop(matrix[i])
# define ROW_SHIFTER ((uint8_t)1)
#elif (MATRIX_COLS <= 16)
# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
# define matrix_bitpop(i) bitpop16(matrix[i])
# define ROW_SHIFTER ((uint16_t)1)
#elif (MATRIX_COLS <= 32)
# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
# define matrix_bitpop(i) bitpop32(matrix[i])
# define ROW_SHIFTER ((uint32_t)1)
#endif
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
__attribute__ ((weak))
void matrix_init_quantum(void) {
matrix_init_kb();
}
__attribute__ ((weak))
void matrix_scan_quantum(void) {
matrix_scan_kb();
}
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__ ((weak))
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__ ((weak))
void matrix_init_user(void) {
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
inline
uint8_t matrix_rows(void) {
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void) {
return MATRIX_COLS;
}
void matrix_init(void) {
matrix_init_quantum();
}
uint8_t matrix_scan(void)
{
SERIAL_UART_INIT();
uint32_t timeout = 0;
//the s character requests the RF slave to send the matrix
SERIAL_UART_DATA = 's';
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
//there are 10 bytes corresponding to 10 columns, and an end byte
for (uint8_t i = 0; i < 11; i++) {
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
while(!SERIAL_UART_RXD_PRESENT){
timeout++;
if (timeout > 10000){
break;
}
}
uart_data[i] = SERIAL_UART_DATA;
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
if (uart_data[10] == 0xE0)
{
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
}
}
matrix_scan_quantum();
return 1;
}
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & ((matrix_row_t)1<col));
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
print_matrix_header();
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row); print(": ");
print_matrix_row(row);
print("\n");
}
}
uint8_t matrix_key_count(void)
{
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += matrix_bitpop(i);
}
return count;
}

View File

@@ -0,0 +1,19 @@
# Chimera Ortho
![Chimera Ortho](https://imgur.com/pbdNsoP.jpg)
A split wireless 40% ortholinear keyboard
Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle)
Hardware Supported: Chimera Ortho PCB, WaveShare core nRF51822
Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ortho/gerbers)
Make example for this keyboard (after setting up your build environment):
make chimera_ortho:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

View File

@@ -0,0 +1,78 @@
OPT_DEFS += -DCHIMERA_ORTHO_PROMICRO
OPT_DEFS += -DCATERINA_BOOTLOADER
CHIMERA_ORTHO_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
# # project specific files
SRC = matrix.c
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
USB = /dev/ttyACM0

View File

@@ -0,0 +1,12 @@
{
"keyboard_name": "Clueboard 66%",
"processor": "atmega32u4",
"bootloader": "atmel-dfu",
"width": 16.5,
"height": 5,
"layouts": {
"KEYMAP": {
"layout": [{"x": 0, "y": 0, "w": 1, "label": "GRAVE"}, {"x": 1, "y": 0, "w": 1, "label": "1"}, {"x": 2, "y": 0, "w": 1, "label": "2"}, {"x": 3, "y": 0, "w": 1, "label": "3"}, {"x": 4, "y": 0, "w": 1, "label": "4"}, {"x": 5, "y": 0, "w": 1, "label": "5"}, {"x": 6, "y": 0, "w": 1, "label": "6"}, {"x": 7, "y": 0, "w": 1, "label": "7"}, {"x": 8, "y": 0, "w": 1, "label": "8"}, {"x": 9, "y": 0, "w": 1, "label": "9"}, {"x": 10, "y": 0, "w": 1, "label": "0"}, {"x": 11, "y": 0, "w": 1, "label": "DASH"}, {"x": 12, "y": 0, "w": 1, "label": "EQUALSIGN"}, {"x": 13, "y": 0, "w": 1, "label": "YEN"}, {"x": 14, "y": 0, "w": 1, "label": "BACKSPACE"}, {"x": 15.5, "y": 0, "w": 1, "label": "PAGEUP"}, {"x": 0, "y": 1, "w": 1.5, "label": "TAB"}, {"x": 1.5, "y": 1, "w": 1, "label": "Q"}, {"x": 2.5, "y": 1, "w": 1, "label": "W"}, {"x": 3.5, "y": 1, "w": 1, "label": "E"}, {"x": 4.5, "y": 1, "w": 1, "label": "R"}, {"x": 5.5, "y": 1, "w": 1, "label": "T"}, {"x": 6.5, "y": 1, "w": 1, "label": "Y"}, {"x": 7.5, "y": 1, "w": 1, "label": "U"}, {"x": 8.5, "y": 1, "w": 1, "label": "I"}, {"x": 9.5, "y": 1, "w": 1, "label": "O"}, {"x": 10.5, "y": 1, "w": 1, "label": "P"}, {"x": 11.5, "y": 1, "w": 1, "label": "LBRACKET"}, {"x": 12.5, "y": 1, "w": 1, "label": "RBRACKET"}, {"x": 13.5, "y": 1, "w": 1.5, "label": "BACKSLASH"}, {"x": 15.5, "y": 1, "w": 1, "label": "PAGEDOWN"}, {"x": 0, "y": 2, "w": 1.75, "label": "CAPSLOCK"}, {"x": 1.75, "y": 2, "w": 1, "label": "A"}, {"x": 2.75, "y": 2, "w": 1, "label": "S"}, {"x": 3.75, "y": 2, "w": 1, "label": "D"}, {"x": 4.75, "y": 2, "w": 1, "label": "F"}, {"x": 5.75, "y": 2, "w": 1, "label": "G"}, {"x": 6.75, "y": 2, "w": 1, "label": "H"}, {"x": 7.75, "y": 2, "w": 1, "label": "J"}, {"x": 8.75, "y": 2, "w": 1, "label": "K"}, {"x": 9.75, "y": 2, "w": 1, "label": "L"}, {"x": 10.75, "y": 2, "w": 1, "label": "SEMICOLON"}, {"x": 11.75, "y": 2, "w": 1, "label": "QUOTE"}, {"x": 12.75, "y": 2, "w": 1, "label": "ISOHASH"}, {"x": 13.75, "y": 2, "w": 1.25, "label": "ENTER"}, {"x": 0, "y": 3, "w": 1.25, "label": "LSHIFT"}, {"x": 1.25, "y": 3, "w": 1, "label": "ISOBACKSLASH"}, {"x": 2.25, "y": 3, "w": 1, "label": "Z"}, {"x": 3.25, "y": 3, "w": 1, "label": "X"}, {"x": 4.25, "y": 3, "w": 1, "label": "C"}, {"x": 5.25, "y": 3, "w": 1, "label": "V"}, {"x": 6.25, "y": 3, "w": 1, "label": "B"}, {"x": 7.25, "y": 3, "w": 1, "label": "N"}, {"x": 8.25, "y": 3, "w": 1, "label": "M"}, {"x": 9.25, "y": 3, "w": 1, "label": "COMMA"}, {"x": 10.25, "y": 3, "w": 1, "label": "PERIOD"}, {"x": 11.25, "y": 3, "w": 1, "label": "SLASH"}, {"x": 12.25, "y": 3, "w": 1, "label": "JPBACKSLASH"}, {"x": 13.25, "y": 3, "w": 1.25, "label": "RSHIFT"}, {"x": 14.5, "y": 3, "w": 1, "label": "UP"}, {"x": 0, "y": 4, "w": 1.25, "label": "LCTRL"}, {"x": 1.25, "y": 4, "w": 1, "label": "LALT"}, {"x": 2.25, "y": 4, "w": 1.25, "label": "LCMD"}, {"x": 3.5, "y": 4, "w": 1.25, "label": "MUHENKAN"}, {"x": 4.75, "y": 4, "w": 2, "label": "SPACE1"}, {"x": 6.75, "y": 4, "w": 2, "label": "SPACE2"}, {"x": 8.75, "y": 4, "w": 1.25, "label": "HENKAN"}, {"x": 10, "y": 4, "w": 1.25, "label": "RCMD"}, {"x": 11.25, "y": 4, "w": 1, "label": "RCTRL"}, {"x": 12.25, "y": 4, "w": 1.25, "label": "FN"}, {"x": 13.5, "y": 4, "w": 1, "label": "LEFT"}, {"x": 14.5, "y": 4, "w": 1, "label": "DOWN"}, {"x": 15.5, "y": 4, "w": 1, "label": "RIGHT"}]
}
}
}

View File

@@ -0,0 +1,3 @@
{
"identifier":"c1ed:2301:0003"
}

View File

@@ -0,0 +1,3 @@
{
"identifier":"c1ed:2320:0001"
}

View File

@@ -0,0 +1,3 @@
{
"identifier":"c1ed:2370:0001"
}

View File

@@ -0,0 +1,4 @@
{
"manufacturer": "Clueboard",
"maintainer": "skullydazed"
}

View File

@@ -19,7 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define USE_SERIAL
#define MASTER_LEFT
// #define _MASTER_RIGHT
// #define MASTER_RIGHT
// #define EE_HANDS

View File

@@ -19,7 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define USE_SERIAL
#define MASTER_LEFT
// #define _MASTER_RIGHT
// #define MASTER_RIGHT
// #define EE_HANDS

View File

@@ -19,7 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define USE_SERIAL
#define MASTER_LEFT
// #define _MASTER_RIGHT
// #define MASTER_RIGHT
// #define EE_HANDS

View File

@@ -1,9 +1,28 @@
#include "dz60.h"
#include "led.h"
void matrix_init_kb(void) {
// Keyboard start-up code goes here
// Runs once when the firmware starts up
matrix_init_user();
led_init_ports();
};
void matrix_scan_kb(void) {
// Looping keyboard code goes here
// This runs every cycle (a lot)
matrix_scan_user();
};
void led_init_ports(void) {
// Set caps lock LED pin as output
DDRB |= (1 << 2);
// Default to off
PORTB |= (1 << 2);
}
void led_set_kb(uint8_t usb_led) {
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
DDRB |= (1 << 2); PORTB &= ~(1 << 2);
} else {
DDRB &= ~(1 << 2); PORTB &= ~(1 << 2);
}
}
// Code for caps lock LED as reported by the OS
// Set this per keymap, instead of globally
led_set_user(usb_led);
}

View File

@@ -8,7 +8,20 @@
#include "rev2.h"
#endif
#include "quantum.h"
#endif
// Used to create a keymap using only KC_ prefixed keys
#define KC_KEYMAP( \
k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012, k013, k014, \
k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112, k113, k114, \
k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212, k213, k214, \
k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312, k313, k314 \
) \
{ \
{ KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k010, KC_##k011, KC_##k012, KC_##k013, KC_##k014 }, \
{ KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k110, KC_##k111, KC_##k112, KC_##k113, KC_##k114 }, \
{ KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k210, KC_##k211, KC_##k212, KC_##k213, KC_##k214 }, \
{ KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k310, KC_##k311, KC_##k312, KC_##k313, KC_##k314 } \
}
#endif

View File

@@ -0,0 +1,120 @@
// Default ECO Layout
// KLE here : http://www.keyboard-layout-editor.com/#/gists/0733eca6b4cb88ff9d7de746803f4039
#include "eco.h"
#include "action_layer.h"
#include "eeconfig.h"
extern keymap_config_t keymap_config;
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _FN3 3
enum eco_keycodes {
QWERTY = SAFE_RANGE,
LOWER,
RAISE,
};
// Fillers to make layering more clear
#define KC_ KC_TRNS
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define KC_RST RESET
#define KC_DBUG DEBUG
#define KC_LOWR MO(_LOWER)
#define KC_RASE MO(_RAISE)
#define KC_ENTS MT(MOD_LSFT, KC_ENT)
#define KC_ESCC MT(MOD_LCTL, KC_ESC)
#define KC_GRVF LT(_FN3, KC_GRV)
#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen
#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen
#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen
#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen
#define KC_RTOG RGB_TOG
#define KC_RMOD RGB_MOD
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
#define KC_RSAI RGB_SAI
#define KC_RSAD RGB_SAD
#define KC_RVAI RGB_VAI
#define KC_RVAD RGB_VAD
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = KC_KEYMAP(
//,----+----+----+----+----+----+----+----+----+----+----+----+----+----.
TAB , Q , W , E , R , T ,LPRN,RPRN, Y , U , I , O , P ,MINS,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
ESCC, A , S , D , F , G ,LBRC,RBRC, H , J , K , L ,SCLN,QUOT,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
LSFT, Z , X , C , V , B ,LCBR,RCBR, N , M ,COMM,DOT ,SLSH,ENTS,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
GRVF,LCTL,LALT,LGUI,LOWR,SPC ,SPC ,BSPC,BSPC,RASE,LEFT,DOWN, UP ,RGHT
//`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
),
[_LOWER] = KC_KEYMAP(
//,----+----+----+----+----+----+----+----+----+----+----+----+----+----.
, 1 , 2 , 3 , 4 , 5 ,LPRN,RPRN, 6 , 7 , 8 , 9 , 0 , ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
DEL ,CAPP,LEFT,RGHT, UP ,LBRC,LBRC,RBRC,RBRC, P4 , P5 , P6 ,PLUS,PIPE,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
,CPYP, , ,DOWN,LCBR,LCBR,RCBR,RCBR, P1 , P2 , P3 ,MINS, ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
, , , , , , ,DEL ,DEL , , P0 ,PDOT, ,
//`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
),
[_RAISE] = KC_KEYMAP(
//,----+----+----+----+----+----+----+----+----+----+----+----+----+----.
,EXLM, AT ,HASH,DLR ,PERC, , ,CIRC,AMPR,ASTR,LPRN,RPRN, ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, , ,EQL ,HOME, , , ,BSLS,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
MUTE,MSTP,MPLY,VOLD,PGDN,MINS, , ,PLUS,END , , , , ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
, , , , , , , , , , , , ,
//`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
),
[_FN3] = KC_KEYMAP(
//,----+----+----+----+----+----+----+----+----+----+----+----+----+----.
F12 , F1 , F2 , F3 , F4 , F5 , , , F6 , F7 , F8 , F9 ,F10 ,F11 ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
RTOG,RMOD,RHUI,RSAI,RVAI, , , , , , , , , ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
RST ,DBUG,RHUD,RSAD,RVAD, , , , , , , , , ,
//|----+----+----+----+----+----+----+----+----+----+----+----+----+----|
, , , , , , , , , , , , ,
//`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
),
};
void persistant_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
persistant_default_layer_set(1UL<<_QWERTY);
}
return false;
break;
}
return true;
}

View File

@@ -0,0 +1,25 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View File

@@ -92,4 +92,4 @@ ONEHAND_ENABLE = no # Disable Onehand
RGBLIGHT_ENABLE = no
MIDI_ENABLE = no
LAYOUTS = ergodox ergodox_80
LAYOUTS = ergodox

View File

@@ -0,0 +1,21 @@
#ifndef CONFIG_H_
#define CONFIG_H_
#include "../../config.h"
#undef TAPPING_TERM
#define TAPPING_TERM 150
// Combos not working yet
// #define COMBO_TERM 20
// #define COMBO_COUNT 1
// #define COMBO_ALLOW_ACTION_KEYS
#define IGNORE_MOD_TAP_INTERRUPT
#define PERMISSIVE_HOLD
#define PREVENT_STUCK_MODIFIERS
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 100
#endif

View File

@@ -0,0 +1 @@
https://i.imgur.com/fKX0Zbs.png

View File

@@ -0,0 +1 @@
https://i.imgur.com/giAc3M9.jpg

View File

@@ -0,0 +1,852 @@
#include "ergodox.h"
// #include "debug.h"
#include "action_layer.h"
#include "version.h"
#include "eeconfig.h"
#include "eeprom.h"
#include "keymap_colemak.h"
extern keymap_config_t keymap_config;
enum ergodox_layers {
_QWERTY,
_COLEMAK,
_QWOC,
_LOWER,
_RAISE,
_PLOVER,
// Intermediate layers for SuperDuper (Combo keys does not work on Infinity yet)
_SUPER,
_DUPER,
_SUPERDUPER,
_MOUSE,
_ADJUST,
_MDIA,
_SYMB,
};
enum ergodox_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
QWOC,
PLOVER,
SUPER,
DUPER,
SUPERDUPER,
MOUSE,
LOWER,
RAISE,
BACKLIT,
EXT_PLV,
SDTOGG, // Toggle SuperDuper
EPRM,
VRSN,
RGB_SLD
};
enum functions {
M_GUI_UNDS, // Simulate GUI_T(KC_UNDS)
M_SFT_PO, // SFT_T(KC_LPRN)
M_SFT_PC, // SFT_T(KC_RPRN)
};
// Timer for custom mod tap
static uint16_t m_gui_unds_timer;
static uint16_t m_sft_po_timer;
static uint16_t m_sft_pc_timer;
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
// Narze : Custom Macros
#define HPR_ESC ALL_T(KC_ESC)
#define SFT_ENT SFT_T(KC_ENT)
#define SFT_PO F(M_SFT_PO)
#define SFT_PC F(M_SFT_PC)
#define GUI_MINS GUI_T(KC_MINS)
#define GUI_UNDS F(M_GUI_UNDS)
// Combo : SuperDuper layer from S+D (R+S in Colemak)
// #define COMBO_COUNT 1
// #define SUPERDUPER_COMBO_COUNT 3
// #define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
// enum process_combo_event {
// CB_SUPERDUPER,
// };
// const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
// [_QWERTY] = {KC_S, KC_D, COMBO_END},
// [_COLEMAK] = {KC_R, KC_S, COMBO_END},
// [_QWOC] = {CM_S, CM_D, COMBO_END},
// };
// combo_t PROGMEM key_combos[COMBO_COUNT] = {
// [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
// };
// volatile bool superduper_enabled = true;
// const uint16_t empty_combo[] = {COMBO_END};
// void set_superduper_key_combos(void);
// void clear_superduper_key_combos(void);
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | Mdia | | Mdia | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | Symb | | Symb | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Hp/Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | Sft/( | Z/Mo | X | C | V | B | | | | N | M | , | . | SD-/ | Sft/) |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Rse/[ | Ctrl | Alt | Gui/_| Lwr | | Rse | GUI/-| Alt | Ctrl | Low/] |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Enter| LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space| Back |------| |------| Back |Enter |
* | | Space| End | | PgDn | Space | |
* `--------------------' `----------------------'
*/
[_QWERTY] = KEYMAP(
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, LT(_SYMB, KC_NO),
HPR_ESC, KC_A, LT(_SUPER, KC_S), LT(_DUPER, KC_D), KC_F, KC_G,
SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER,
KC_ENT, KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
LT(_MDIA, KC_NO), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
LT(_SYMB, KC_NO), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_PC,
RAISE, GUI_MINS,KC_RALT,KC_RCTL, LT(_LOWER, KC_RBRC),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_BSPC, KC_ENT
),
/* Colemak
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | Mdia | | Mdia | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | F | P | G | Symb | | Symb | J | L | U | Y | ; | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Hp/Esc | A | R | S | T | D |------| |------| H | N | E | I | O | ' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | Sft/( | Z/Mo | X | C | V | B | | | | K | M | , | . | SD-/ | Sft/) |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Rse/[ | Ctrl | Alt | Gui/_| Lwr | | Rse | GUI/-| Alt | Ctrl | Low/] |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Enter| LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space| Back |------| |------| Back |Enter |
* | | Space| End | | PgDn | Space | |
* `--------------------' `----------------------'
*/
[_COLEMAK] = KEYMAP(
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO),
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, LT(_SYMB, KC_NO),
HPR_ESC, KC_A, LT(_SUPER,KC_R), LT(_DUPER,KC_S), KC_T, KC_D,
SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER,
KC_ENT, KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
LT(_MDIA, KC_NO), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
LT(_SYMB, KC_NO), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS,
KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
MEH_T(KC_NO),KC_K, KC_M, KC_COMM,KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_PC,
RAISE, GUI_MINS,KC_RALT,KC_RCTL, LT(_LOWER, KC_RBRC),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_BSPC, KC_ENT
),
/* Qwerty on software Colemak : Useful for gaming with qwerty keymaps! */
[_QWOC] = KEYMAP(
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO),
KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, LT(_SYMB, KC_NO),
HPR_ESC, CM_A, LT(_SUPER,CM_S), LT(_DUPER,CM_D), CM_F, CM_G,
SFT_PO, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, ALL_T(KC_NO),
LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER,
KC_ENT, KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
LT(_MDIA, KC_NO), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
LT(_SYMB, KC_NO), CM_Y, CM_U, CM_I, CM_O, CM_P, KC_BSLS,
CM_H, CM_J, CM_K, CM_L, CM_SCLN, KC_QUOT,
MEH_T(KC_NO),CM_N, CM_M, CM_COMM,CM_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_PC,
RAISE, GUI_MINS,KC_RALT,KC_RCTL, LT(_LOWER, KC_RBRC),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_BSPC, KC_ENT
),
/* Lower
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F1 | F2 | F3 | F4 | F5 |------| |------| F6 | _ | + | { | } | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO ~ |ISO | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_LOWER] = KEYMAP(
_______, _______, _______, _______, _______, _______, _______,
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______,
_______, _______, _______, KC_BTN1, KC_BTN2,
_______, _______,
_______,
_______, _______, _______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
_______, KC_F12,S(KC_NUHS),S(KC_NUBS), _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______
),
/* Raise
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F1 | F2 | F3 | F4 | F5 |------| |------| F6 | - | = | [ | ] | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO ~ |ISO | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_RAISE] = KEYMAP(
_______, _______, _______, _______, _______, _______, _______,
_______, KC_1, KC_2, KC_3, KC_4, KC_5, _______,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______,
_______, _______, _______, KC_BTN1, KC_BTN2,
_______, _______,
_______,
_______, _______, _______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
_______, KC_F12,S(KC_NUHS),S(KC_NUBS), _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______
),
/* Plover
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | # | # | # | # | # | # | | | | # | # | # | # | # | # |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | # | # | # | # | # | | | | # | # | # | # | # | # |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Hp/Esc | S | T | P | H | * |------| |------| * | F | P | L | T | D |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Sft/( | S | K | W | R | * | | | | * | R | B | G | S | Z |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Exit | | | A | O | | E | U | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Enter| LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space| Back |------| |------| Back |Enter |
* | | Space| End | | PgDn | Space | |
* `--------------------' `----------------------'
*/
[_PLOVER] = KEYMAP(
// left hand
KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, XXXXXXX,
XXXXXXX, KC_1, KC_1, KC_1, KC_1, KC_1, XXXXXXX,
XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T,
XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX,
EXT_PLV, XXXXXXX, XXXXXXX,KC_C, KC_V,
KC_ENT, KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
XXXXXXX, KC_1, KC_1, KC_1, KC_1, KC_1, XXXXXXX,
XXXXXXX, KC_1, KC_1, KC_1, KC_1, KC_1, XXXXXXX,
KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_N, KC_M,XXXXXXX,XXXXXXX, XXXXXXX,
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_BSPC, KC_ENT
),
/* SuperDuper : https://gist.github.com/narze/861e2167784842d38771
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | T← | T→ | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | A | [SuperDuper]| Bksp | Gui |------| |------| ← | ↓ | ↑ | → | Del | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+--------+------.
* | | | | | | | |
* | Shift| |------| |------| |Shift |
* | | | | | | | |
* `--------------------' `----------------------'
*/
[_SUPERDUPER] = KEYMAP(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, KC_LALT, _______, _______, KC_BSPC, KC_LGUI,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
KC_LSFT,_______,_______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, S(LGUI(KC_LBRC)), S(LGUI(KC_RBRC)), _______, _______,
KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______, KC_LSFT
),
// Intermediate keymaps for SuperDuper (Combo keys does not work on Infinity yet)
[_SUPER] = KEYMAP(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, DUPER, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______,_______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______, _______
),
[_DUPER] = KEYMAP(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, SUPER, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______,_______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______, _______
),
/* Mouse
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | S↑ | M↑ | S↓ | | | | | | | S↑ | S↓ | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | M← | M↓ | M→ | |------| |------| M← | M↓ | M↑ | M→ | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |[Mouse| | | | M3 | | | | M3 | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | M2 | | M2 | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+--------+------.
* | | | | | | | |
* | Left | |------| |------| | Left |
* | Click| | | | | | Click|
* `--------------------' `----------------------'
*/
[_MOUSE] = KEYMAP(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______,
_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______,
_______, _______, _______, _______, _______, KC_BTN3, _______,
_______, _______, _______, _______, KC_BTN2,
_______, _______,
_______,
KC_BTN1,_______,_______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_WH_U, KC_WH_D, _______, _______,
KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______,
_______, KC_BTN3, _______, _______, _______, _______, _______,
KC_BTN2, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______, KC_BTN1
),
/* Adjust (Lower + Raise)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | |Reset | | | | | | | | | | | | | Del |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | |AGnorm|------| |------|AGswap|Qwerty|Colemk|QwOnCo|Plover| |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | |SDTogg| | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+--------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `----------------------'
*/
[_ADJUST] = KEYMAP(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, RESET, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, AG_NORM,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______,_______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_DEL,
AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______,
_______, SDTOGG, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______, _______
),
/* Layers below are not actively used but kept for future reference */
/* Symbol
* ,---------------------------------------------------. ,--------------------------------------------------.
* |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | EPRM | | | | | | | . | 0 | = | |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Animat| | |Toggle|Solid |
* ,------|------|------| |------+------+------.
* |Bright|Bright| | | |Hue- |Hue+ |
* |ness- |ness+ |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[_SYMB] = KEYMAP(
// left hand
VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
_______,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,_______,
_______,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
_______,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,_______,
EPRM,_______,_______,_______,_______,
RGB_MOD,_______,
_______,
RGB_VAD,RGB_VAI,_______,
// right hand
_______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, _______,
_______, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, _______,
_______,KC_DOT, KC_0, KC_EQL, _______,
RGB_TOG, RGB_SLD,
_______,
_______, RGB_HUD, RGB_HUI
),
/* Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[_MDIA] = KEYMAP(
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_MS_U, _______, _______, _______,
_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_BTN1, KC_BTN2,
_______, _______,
_______,
_______, _______, _______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, KC_MPLY,
_______, _______, _______, KC_MPRV, KC_MNXT, _______, _______,
KC_VOLU, KC_VOLD, KC_MUTE, _______, _______,
_______, _______,
_______,
_______, _______, KC_WBAK
)
};
void persistant_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
persistant_default_layer_set(1UL<<_QWERTY);
// key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWERTY];
// eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWERTY);
}
return false;
break;
case COLEMAK:
if (record->event.pressed) {
persistant_default_layer_set(1UL<<_COLEMAK);
// key_combos[CB_SUPERDUPER].keys = superduper_combos[_COLEMAK];
// eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _COLEMAK);
}
return false;
break;
case QWOC:
if (record->event.pressed) {
persistant_default_layer_set(1UL<<_QWOC);
// key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWOC];
// eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWOC);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case SUPER:
if (record->event.pressed) {
layer_on(_SUPER);
update_tri_layer(_SUPER, _DUPER, _SUPERDUPER);
} else {
layer_off(_SUPER);
update_tri_layer(_SUPER, _DUPER, _SUPERDUPER);
}
return false;
break;
case DUPER:
if (record->event.pressed) {
layer_on(_DUPER);
update_tri_layer(_SUPER, _DUPER, _SUPERDUPER);
} else {
layer_off(_DUPER);
update_tri_layer(_SUPER, _DUPER, _SUPERDUPER);
}
return false;
break;
case BACKLIT:
if (record->event.pressed) {
register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
backlight_step();
#endif
} else {
unregister_code(KC_RSFT);
}
return false;
break;
case PLOVER:
if (record->event.pressed) {
layer_off(_RAISE);
layer_off(_LOWER);
layer_off(_ADJUST);
layer_on(_PLOVER);
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
keymap_config.raw = eeconfig_read_keymap();
keymap_config.nkro = 1;
eeconfig_update_keymap(keymap_config.raw);
}
return false;
break;
case EXT_PLV:
if (record->event.pressed) {
layer_off(_PLOVER);
}
return false;
break;
case SDTOGG:
if (record->event.pressed) {
// superduper_enabled = !superduper_enabled;
// if (superduper_enabled) {
// set_superduper_key_combos();
// } else {
// clear_superduper_key_combos();
// }
}
return false;
break;
case EPRM:
if (record->event.pressed) {
eeconfig_init();
}
return false;
break;
case VRSN:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
case RGB_SLD:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_mode(1);
#endif
}
return false;
break;
}
return true;
}
void matrix_init_user(void) {
}
void matrix_setup(void) {
// set_superduper_key_combos();
}
// void set_superduper_key_combos(void) {
// uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
// switch (layer) {
// case _QWERTY:
// case _COLEMAK:
// case _QWOC:
// key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
// break;
// }
// }
// void clear_superduper_key_combos(void) {
// key_combos[CB_SUPERDUPER].keys = empty_combo;
// }
void matrix_scan_user(void) {
// uint8_t layer = biton32(layer_state);
// ergodox_board_led_off();
// ergodox_right_led_1_off();
// ergodox_right_led_2_off();
// ergodox_right_led_3_off();
// switch (layer) {
// // TODO: Make this relevant to the ErgoDox EZ.
// case 1:
// ergodox_right_led_1_on();
// break;
// case 2:
// ergodox_right_led_2_on();
// break;
// default:
// // none
// break;
// }
}
// Combos
// void process_combo_event(uint8_t combo_index, bool pressed) {
// if (pressed) {
// switch(combo_index) {
// case CB_SUPERDUPER:
// layer_on(_SUPERDUPER);
// ergodox_board_led_on();
// break;
// }
// } else {
// layer_off(_SUPERDUPER);
// ergodox_board_led_off();
// unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them
// }
// }
// Macros
const uint16_t PROGMEM fn_actions[] = {
[M_GUI_UNDS] = ACTION_MACRO_TAP(M_GUI_UNDS),
[M_SFT_PO] = ACTION_MACRO_TAP(M_SFT_PO),
[M_SFT_PC] = ACTION_MACRO_TAP(M_SFT_PC),
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
bool tap_not_interrupted = record->tap.count > 0 && !record->tap.interrupted;
switch(id) {
// Hold for LGUI, tap for Underscore
case M_GUI_UNDS:
if (record->event.pressed) {
m_gui_unds_timer = timer_read();
if (!tap_not_interrupted) {
register_mods(MOD_BIT(KC_LGUI));
}
} else {
if (tap_not_interrupted && timer_elapsed(m_gui_unds_timer) < TAPPING_TERM) {
add_weak_mods(MOD_BIT(KC_LSFT));
send_keyboard_report();
register_code(KC_MINS);
unregister_code(KC_MINS);
del_weak_mods(MOD_BIT(KC_LSFT));
send_keyboard_report();
record->tap.count = 0; // ad hoc: cancel tap
} else {
unregister_mods(MOD_BIT(KC_LGUI));
}
}
break;
// Hold for LSHIFT, tap for Parens open
case M_SFT_PO:
if (record->event.pressed) {
m_sft_po_timer = timer_read();
if (!tap_not_interrupted) {
register_mods(MOD_BIT(KC_LSFT));
}
} else {
if (tap_not_interrupted && timer_elapsed(m_sft_po_timer) < TAPPING_TERM) {
record->tap.count = 0;
return MACRO(D(RSFT), T(9), U(RSFT), END);
} else {
unregister_mods(MOD_BIT(KC_LSFT));
}
}
break;
// Hold for RSHIFT, tap for Parens close
case M_SFT_PC:
if (record->event.pressed) {
m_sft_pc_timer = timer_read();
if (!tap_not_interrupted) {
register_mods(MOD_BIT(KC_RSFT));
}
} else {
if (tap_not_interrupted && timer_elapsed(m_sft_pc_timer) < TAPPING_TERM) {
record->tap.count = 0;
return MACRO(D(LSFT), T(0), U(LSFT), END);
} else {
unregister_mods(MOD_BIT(KC_RSFT));
}
}
break;
}
return MACRO_NONE;
};

View File

@@ -0,0 +1,45 @@
# narze's layout
## Notes
- SuperDuper mode for Ergodox is still under development, since combo keys does not work very well on Ergodox firmware.
Now it is using multiple layers as a workaround. Actual implementation using combos are on my Planck layout.
## Key features
- Qwerty + [Colemak](https://colemak.com) layouts, and you can type Qwerty on software-level Colemak as well. Very useful for gaming or when your friend wanna type something but don't use Colemak.
- [(S)uper (D)uper Mode](https://github.com/jasonrudolph/keyboard#super-duper-mode) inspired by [jasonrudolph](https://github.com/jasonrudolph), with [some extensions](https://gist.github.com/narze/861e2167784842d38771) such as backspace & forward delete.
- Mouse keys with Z
## (S)uper (D)uper Mode
Press `S+D` simultaneously and hold, then...
- `H/J/K/L` for Vim-like movement
- `I/O` to move between browser tabs (Not working on Windows yet)
- `A` for `Option (Alt)`
- `F/;` for `Backspace/Forward delete`
- `A` with `H/L` to move to previous/next word
- `A` with `G/;` to delete to previous/next word
- `G` for `Cmd` (Gui/Windows)
- Available for all layouts (but plover) using physical S & D keys position in qwerty
- `Spacebar` for `Shift` (it's easier when already holding A with your pinky)
- Disable with `Raise+Lower+M`
- You can edit or add more useful keys in SUPERDUPER layer
- It can be activated by holding `/` as well, but it's slower since `LT()` uses `TAPPING_TERM` of 200ms but `S+D` uses `COMBO_TERM` of only 20ms (Can be changed within config.h)
## Build instructions
- `cd /path/to/qmk_firmware`
#### Left side
```
docker run -e keymap=narze -e subproject=infinity -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_left.bin
dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_left.bin
```
#### Right side
```
docker run -e keymap=narze -e subproject=infinity -e keyboard=ergodox -e MASTER=right --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_right.bin
dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_right.bin
```
## TODO
- [ ] Make SuperDuper mode fully-compatible in Windows by swapping GUI with Ctrl

View File

@@ -0,0 +1,24 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# Combos not working yet
COMBO_ENABLE = no

View File

@@ -0,0 +1,94 @@
/*
Copyright 2017 Fred Sundvik
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "simple_visualizer.h"
#include "util.h"
// Copied from keymap.c
enum ergodox_layers {
_QWERTY,
_COLEMAK,
_QWOC,
_LOWER,
_RAISE,
_PLOVER,
// Intermediate layers for SuperDuper (Combo keys does not work on Infinity yet)
_SUPER,
_DUPER,
_SUPERDUPER,
_MOUSE,
_ADJUST,
_MDIA,
_SYMB,
};
// This function should be implemented by the keymap visualizer
// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing
// that the simple_visualizer assumes that you are updating
// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is
// stopped. This can be done by either double buffering it or by using constant strings
static void get_visualizer_layer_and_color(visualizer_state_t* state) {
uint8_t saturation = 255;
uint8_t layer = biton32(state->status.layer);
state->target_lcd_color = LCD_COLOR(layer << 2, saturation, 0xFF);
switch(layer) {
case _QWERTY:
state->layer_text = "QWERTY";
break;
case _COLEMAK:
state->layer_text = "COLEMAK";
break;
case _QWOC:
state->layer_text = "QWERTY on COLEMAK";
break;
case _LOWER:
state->layer_text = "LOWER";
break;
case _RAISE:
state->layer_text = "RAISE";
break;
case _PLOVER:
state->layer_text = "PLOVER";
break;
case _SUPERDUPER:
state->layer_text = "SUPERDUPER";
break;
case _SUPER:
state->layer_text = "SUPER";
break;
case _DUPER:
state->layer_text = "DUPER";
break;
case _MOUSE:
state->layer_text = "MOUSE";
break;
case _ADJUST:
state->layer_text = "ADJUST";
break;
case _MDIA:
state->layer_text = "MDIA";
break;
case _SYMB:
state->layer_text = "SYMB";
break;
default:
state->layer_text = "NONE";
break;
}
}

View File

@@ -61,11 +61,46 @@ void ergodox_blink_all_leds(void)
_delay_ms(50);
ergodox_right_led_3_on();
_delay_ms(50);
#ifdef LEFT_LEDS
ergodox_left_led_1_on();
_delay_ms(50);
if (!mcp23018_status) {
mcp23018_status = ergodox_left_leds_update();
}
ergodox_left_led_2_on();
_delay_ms(50);
if (!mcp23018_status) {
mcp23018_status = ergodox_left_leds_update();
}
ergodox_left_led_3_on();
_delay_ms(50);
if (!mcp23018_status) {
mcp23018_status = ergodox_left_leds_update();
}
#endif
ergodox_right_led_1_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_3_off();
#ifdef LEFT_LEDS
_delay_ms(50);
ergodox_left_led_1_off();
if (!mcp23018_status) {
mcp23018_status = ergodox_left_leds_update();
}
_delay_ms(50);
ergodox_left_led_2_off();
if (!mcp23018_status) {
mcp23018_status = ergodox_left_leds_update();
}
_delay_ms(50);
ergodox_left_led_3_off();
if (!mcp23018_status) {
mcp23018_status = ergodox_left_leds_update();
}
#endif
//ergodox_led_all_on();
//_delay_ms(333);
ergodox_led_all_off();
@@ -107,11 +142,49 @@ uint8_t init_mcp23018(void) {
out:
i2c_stop();
#ifdef LEFT_LEDS
if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
#endif // LEFT_LEDS
// SREG=sreg_prev;
return mcp23018_status;
}
#ifdef LEFT_LEDS
uint8_t ergodox_left_leds_update(void) {
if (mcp23018_status) { // if there was an error
return mcp23018_status;
}
#define LEFT_LED_1_SHIFT 7 // in MCP23018 port B
#define LEFT_LED_2_SHIFT 6 // in MCP23018 port B
#define LEFT_LED_3_SHIFT 7 // in MCP23018 port A
// set logical value (doesn't matter on inputs)
// - unused : hi-Z : 1
// - input : hi-Z : 1
// - driving : hi-Z : 1
mcp23018_status = i2c_start(I2C_ADDR_WRITE);
if (mcp23018_status) goto out;
mcp23018_status = i2c_write(OLATA);
if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b11111111
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
);
if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b11111111
& ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
& ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
);
if (mcp23018_status) goto out;
out:
i2c_stop();
return mcp23018_status;
}
#endif
#ifdef ONEHAND_ENABLE
__attribute__ ((weak))
// swap-hands action needs a matrix to define the swap

View File

@@ -46,12 +46,31 @@ inline void ergodox_right_led_2_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6);
inline void ergodox_right_led_3_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
inline void ergodox_right_led_off(uint8_t led) { DDRB &= ~(1<<(led+4)); PORTB &= ~(1<<(led+4)); }
#ifdef LEFT_LEDS
bool ergodox_left_led_1;
bool ergodox_left_led_2;
bool ergodox_left_led_3;
inline void ergodox_left_led_1_on(void) { ergodox_left_led_1 = 1; }
inline void ergodox_left_led_2_on(void) { ergodox_left_led_2 = 1; }
inline void ergodox_left_led_3_on(void) { ergodox_left_led_3 = 1; }
inline void ergodox_left_led_1_off(void) { ergodox_left_led_1 = 0; }
inline void ergodox_left_led_2_off(void) { ergodox_left_led_2 = 0; }
inline void ergodox_left_led_3_off(void) { ergodox_left_led_3 = 0; }
#endif // LEFT_LEDS
inline void ergodox_led_all_on(void)
{
ergodox_board_led_on();
ergodox_right_led_1_on();
ergodox_right_led_2_on();
ergodox_right_led_3_on();
#ifdef LEFT_LEDS
ergodox_left_led_1_on();
ergodox_left_led_2_on();
ergodox_left_led_3_on();
#endif // LEFT_LEDS
}
inline void ergodox_led_all_off(void)
@@ -60,6 +79,11 @@ inline void ergodox_led_all_off(void)
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
#ifdef LEFT_LEDS
ergodox_left_led_1_off();
ergodox_left_led_2_off();
ergodox_left_led_3_off();
#endif // LEFT_LEDS
}
inline void ergodox_right_led_1_set(uint8_t n) { OCR1A = n; }

View File

@@ -0,0 +1,30 @@
/*
Copyright 2017 Jack Humbert <jack.humbgmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ERGODOX_EZ_USER_CONFIG_H
#define ERGODOX_EZ_USRE_CONFIG_H
#include "config_common.h"
#define RGBLIGHT_COLOR_LAYER_0 0x00, 0x00, 0xFF
#define RGBLIGHT_COLOR_LAYER_1 0xFF, 0x00, 0x00
#define RGBLIGHT_COLOR_LAYER_2 0x00, 0xFF, 0x00
#define RGBLIGHT_COLOR_LAYER_3 0xFF, 0xFF, 0x00
#define RGBLIGHT_COLOR_LAYER_4 0x00, 0xFF, 0xFF
#define RGBLIGHT_COLOR_LAYER_5 0xFF, 0x00, 0xFF
#endif

View File

@@ -197,27 +197,53 @@ void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
};
// Runs whenever there is a layer state change.
uint32_t layer_state_set_user(uint32_t state) {
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
uint8_t layer = biton32(state);
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case SYMB:
case 0:
#ifdef RGBLIGHT_COLOR_LAYER_0
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
#endif
break;
case 1:
ergodox_right_led_1_on();
#ifdef RGBLIGHT_COLOR_LAYER_1
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1);
#endif
break;
case MDIA:
case 2:
ergodox_right_led_2_on();
#ifdef RGBLIGHT_COLOR_LAYER_2
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2);
#endif
break;
default:
// none
case 3:
#ifdef RGBLIGHT_COLOR_LAYER_3
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3);
#endif
break;
case 4:
#ifdef RGBLIGHT_COLOR_LAYER_4
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4);
#endif
break;
case 5:
#ifdef RGBLIGHT_COLOR_LAYER_5
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5);
#endif
break;
}
};
return state;
};

View File

@@ -13,6 +13,4 @@
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
#endif // RGBLIGHT_ENABLE
#define FORCE_NKRO
#endif

View File

@@ -48,17 +48,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//define layer change stuff for underglow indicator
bool skip_leds = false;
#define rgblight_set_blue rgblight_sethsv (0xFF, 0xFF, 0xFF);
#define rgblight_set_red rgblight_sethsv(0x00, 0xFF, 0xFF);
#define rgblight_set_green rgblight_sethsv (0x78, 0xFF, 0xFF);
#define rgblight_set_orange rgblight_sethsv (0x1E, 0xFF, 0xFF);
#define rgblight_set_teal rgblight_sethsv (0xC3, 0xFF, 0xFF);
#define rgblight_set_magenta rgblight_sethsv (0x12C, 0xFF, 0xFF);
#define rgblight_set_urine rgblight_sethsv (0x3C, 0xFF, 0xFF);
#define rgblight_set_purple rgblight_sethsv (0x10E, 0xFF, 0xFF);
//This is both for underglow, and Diablo 3 macros
static uint8_t current_layer = 0;
#ifdef RGBLIGHT_ENABLE
#define rgblight_set_blue rgblight_sethsv (0xFF, 0xFF, 0xFF);
#define rgblight_set_red rgblight_sethsv (0x00, 0xFF, 0xFF);
#define rgblight_set_green rgblight_sethsv (0x78, 0xFF, 0xFF);
#define rgblight_set_orange rgblight_sethsv (0x1E, 0xFF, 0xFF);
#define rgblight_set_teal rgblight_sethsv (0xC3, 0xFF, 0xFF);
#define rgblight_set_magenta rgblight_sethsv (0x12C, 0xFF, 0xFF);
#define rgblight_set_yellow rgblight_sethsv (0x3C, 0xFF, 0xFF);
#define rgblight_set_purple rgblight_sethsv (0x10E, 0xFF, 0xFF);
#endif
//define diablo macro timer variables
static uint16_t diablo_timer[4];
@@ -136,11 +135,13 @@ void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
// and set the underglow to red, because red == bad
void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 4) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
rgblight_mode(1);
rgblight_setrgb(0xff,0x00,0x00);
reset_keyboard();
#endif
reset_tap_dance(state);
reset_keyboard();
}
}
@@ -229,7 +230,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LSHIFT, LCTL_T(KC_Z),KC_X, KC_C, KC_V, KC_B, TG(OVERWATCH),
LT(SYMB,KC_GRAVE),KC_QUOTE, KC_LGUI, KC_LBRACKET,KC_RBRACKET,
ALT_T(KC_APPLICATION), KC_LEAD,
ALT_T(KC_APPLICATION), KC_LGUI,
KC_HOME,
KC_SPACE, KC_BSPACE, KC_END,
@@ -237,8 +238,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
TG(DIABLO), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH,
KC_H, KC_J, KC_K, KC_L, KC_SCOLON, GUI_T(KC_QUOTE),
TG(OVERWATCH), KC_N, KC_M, KC_COMMA, KC_DOT, RCTL_T(KC_SLASH),KC_RSHIFT,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_FN1,
KC_LALT, CTL_T(KC_ESCAPE),
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(SYMB),
KC_LEAD, CTL_T(KC_ESCAPE),
KC_PGUP,
KC_PGDOWN, KC_DELETE, KC_ENTER
),
@@ -280,7 +281,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
TG(DIABLO), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS,
KC_H, KC_N, KC_E, KC_I, KC_O, GUI_T(KC_QUOTE),
TG(OVERWATCH),KC_K, KC_M, KC_COMM,KC_DOT, RCTL_T(KC_SLASH), KC_RSHIFT,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_FN1,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(SYMB),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_DELETE, KC_ENT
@@ -323,7 +324,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
TG(DIABLO), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
TG(OVERWATCH),KC_B, KC_M, KC_W, KC_V, RCTL_T(KC_Z), KC_RSHIFT,
KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, KC_FN1,
KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, TT(SYMB),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_DELETE, KC_ENT
@@ -366,7 +367,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
TG(DIABLO), KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_BSLS,
KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOTE,
TG(OVERWATCH),KC_K, KC_L, KC_COMM,KC_DOT, RCTL_T(KC_SLASH), KC_RSHIFT,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_FN1,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(SYMB),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_DELETE, KC_ENT
@@ -398,7 +399,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
VRSN, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_DVORAK,
KC_MAKEQMK, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRAVE,
TD(TD_FLSH), KC_PERC, KC_CIRC, KC_LBRACKET,KC_RBRACKET,KC_TILD, KC_COLEMAK,
KC_NO, KC_AMPR, KC_ASTR, KC_COLN, KC_SCOLON,
KC_TRNS, KC_AMPR, KC_ASTR, KC_COLN, KC_SCOLON,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
@@ -540,16 +541,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB),
// FN1 - Momentary Layer 1 (Symbols)
};
void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
}
void persistent_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
@@ -558,6 +549,9 @@ void persistent_default_layer_set(uint16_t default_layer) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef CONSOLE_ENABLE
xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed);
#endif
switch (keycode) {
// dynamically generate these.
case EPRM:
@@ -574,7 +568,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
break;
case RGB_SLD:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_mode(1);
#endif
}
return false;
break;
@@ -668,8 +664,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return false;
break;
case KC_MAKEQMK:
if (record->event.pressed) {
SEND_STRING("make ergodox_ez:drashna-custom:teensy"SS_TAP(X_ENTER));
if (!record->event.pressed) {
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP ":teensy"SS_TAP(X_ENTER));
}
return false;
break;
@@ -678,10 +674,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
#ifdef TAP_DANCE_ENABLE
// Sends the key press to system, but only if on the Diablo layer
void send_diablo_keystroke (uint8_t diablo_key) {
if (current_layer == DIABLO) {
if (biton32(layer_state) == DIABLO) {
switch (diablo_key) {
case 0:
SEND_STRING("1");
@@ -713,16 +710,33 @@ void run_diablo_macro_check(void) {
}
void matrix_init_user(void) { // Runs boot tasks for keyboard
#endif
void matrix_init_user(void) { // Runs boot tasks for keyboard
#ifdef RGBLIGHT_ENABLE
uint8_t default_layer = eeconfig_read_default_layer();
rgblight_enable();
if (default_layer & (1UL << COLEMAK)) {
rgblight_set_magenta;
}
else if (default_layer & (1UL << DVORAK)) {
rgblight_set_green;
}
else if (default_layer & (1UL << WORKMAN)) {
rgblight_set_purple;
}
else {
rgblight_set_teal;
}
#endif
};
LEADER_EXTERNS();
void matrix_scan_user(void) { // runs frequently to update info
uint8_t modifiders = get_mods();
uint8_t layer = biton32(layer_state);
static bool has_layer_changed = true;
if (!skip_leds) {
ergodox_board_led_off();
@@ -744,70 +758,29 @@ void matrix_scan_user(void) { // runs frequently to update info
}
}
if (layer != current_layer) {
has_layer_changed = true;
current_layer = layer;
}
// Check layer, and apply color if its changed since last check
if (has_layer_changed) {
uint8_t default_layer = 0;
default_layer = eeconfig_read_default_layer();
switch (layer) {
case SYMB:
rgblight_set_blue;
rgblight_mode(2);
break;
case OVERWATCH:
rgblight_set_orange;
rgblight_mode(17);
break;
case DIABLO:
rgblight_set_red;
rgblight_mode(5);
break;
case MOUS:
rgblight_set_urine;
rgblight_mode(1);
break;
case 7:
rgblight_sethsv (255,255,255);
rgblight_mode(1);
break;
default:
if (default_layer & (1UL << COLEMAK)) {
rgblight_set_green;
}
else if (default_layer & (1UL << DVORAK)) {
rgblight_set_magenta;
}
else if (default_layer & (1UL << WORKMAN)) {
rgblight_set_purple;
}
else {
rgblight_set_teal;
}
rgblight_mode(1);
break;
}
has_layer_changed = false;
}
// Run Diablo 3 macro checking code.
#ifdef TAP_DANCE_ENABLE
run_diablo_macro_check();
#ifdef LEADER_KEYS
#endif
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_ONE_KEY(KC_C) {
SEND_STRING("Covecube");
}
SEQ_ONE_KEY(KC_D) {
SEND_STRING("StableBit CloudDrive");
}
SEQ_ONE_KEY(KC_L) {
register_code(KC_LGUI);
register_code(KC_L);
unregister_code(KC_L);
unregister_code(KC_LGUI);
}
SEQ_TWO_KEYS(KC_S, KC_D) {
SEND_STRING("StableBit DrivePool");
}
SEQ_TWO_KEYS(KC_C, KC_D) {
SEND_STRING("StableBit CloudDrive");
}
SEQ_TWO_KEYS(KC_S, KC_C) {
SEND_STRING("StableBit Scanner");
}
@@ -815,6 +788,45 @@ void matrix_scan_user(void) { // runs frequently to update info
SEND_STRING("StableBit Troubleshooter");
}
}
#endif
};
uint32_t layer_state_set_kb(uint32_t state) {
#ifdef RGBLIGHT_ENABLE
uint8_t default_layer = eeconfig_read_default_layer();
switch (biton32(state)) {
case SYMB:
rgblight_set_blue;
rgblight_mode(2);
break;
case OVERWATCH:
rgblight_set_orange;
rgblight_mode(17);
break;
case DIABLO:
rgblight_set_red;
rgblight_mode(5);
break;
case MOUS:
rgblight_set_yellow;
rgblight_mode(1);
break;
default:
if (default_layer & (1UL << COLEMAK)) {
rgblight_set_green;
}
else if (default_layer & (1UL << DVORAK)) {
rgblight_set_magenta;
}
else if (default_layer & (1UL << WORKMAN)) {
rgblight_set_purple;
}
else {
rgblight_set_teal;
}
rgblight_mode(1);
break;
}
#endif
return state;
}

View File

@@ -1,10 +1,13 @@
TAP_DANCE_ENABLE = yes
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
COMMAND_ENABLE = yes # Commands for debug and configuration
RGBLIGHT_ENABLE = yes
MIDI_ENABLE = no
CONSOLE_ENABLE = no
LEADER_KEYS = no
EXTRAFLAGS = -flto
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View File

@@ -17,8 +17,6 @@
#define MOUS 2
#ifdef LAYER_UNDERGLOW_LIGHTING
bool has_layer_changed = true;
#define rgblight_set_teal rgblight_setrgb(0x00, 0xFF, 0xFF)
#define rgblight_set_red rgblight_setrgb(0xFF, 0x00, 0x00)
#define rgblight_set_blue rgblight_setrgb(0x00, 0xFF, 0x00);
@@ -100,20 +98,23 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
void matrix_init_user(void) {
#ifdef LAYER_UNDERGLOW_LIGHTING
rgblight_enable();
rgblight_set_teal;
rgblight_mode(1);
#endif
}
void matrix_scan_user(void) {
uint8_t new_layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
#ifdef LAYER_UNDERGLOW_LIGHTING
static uint8_t old_layer = 0;
uint8_t modifiders = get_mods();
if ( modifiders & MODS_SHIFT_MASK) {
@@ -124,44 +125,10 @@ void matrix_scan_user(void) {
}
if ( modifiders & MODS_ALT_MASK) {
ergodox_right_led_3_on();
}
if (old_layer != new_layer) {
has_layer_changed = true;
old_layer = new_layer;
}
if (has_layer_changed) {
switch (new_layer) {
case 1:
rgblight_set_red;
break;
case 2:
rgblight_set_blue;
break;
case 3:
rgblight_set_green;
break;
case 4:
rgblight_set_yellow;
break;
case 5:
rgblight_setrgb(0xFF, 0xFF, 0x00);
break;
case 6:
rgblight_setrgb(0xFF, 0xFF, 0x00);
break;
case 7:
rgblight_setrgb(0xFF, 0xFF, 0xFF);
break;
default:
rgblight_set_teal;
break;
}
has_layer_changed = false;
}
#else
switch (new_layer) {
}
#else
uint8_t layer = biton32(layer_state);
switch (layer) {
case 1:
ergodox_right_led_1_on();
break;
@@ -193,3 +160,35 @@ void matrix_scan_user(void) {
}
#endif
};
uint32_t layer_state_set_kb(uint32_t state) {
#ifdef LAYER_UNDERGLOW_LIGHTING
switch (biton32(state)) {
case 1:
rgblight_set_red;
break;
case 2:
rgblight_set_blue;
break;
case 3:
rgblight_set_green;
break;
case 4:
rgblight_set_yellow;
break;
case 5:
rgblight_setrgb(0xFF, 0xFF, 0x00);
break;
case 6:
rgblight_setrgb(0xFF, 0xFF, 0x00);
break;
case 7:
rgblight_setrgb(0xFF, 0xFF, 0xFF);
break;
default:
rgblight_set_teal;
break;
}
#endif
return state;
}

View File

@@ -69,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Colemak Layer
*
* ,-----------------------------------------------------. ,-----------------------------------------------------.
* | Find | 1 ! | 2 @ | 3 # | 4 $ | 5 % | Undo | | VOLUP| 6 ^ | 7 & | 8 * | 9 ( | 0 ) | ---- |
* | Find | 1 ! | 2 @ | 3 # | 4 $ | 5 % | Undo | | VOLUP| 6 ^ | 7 & | 8 * | 9 ( | 0 ) | LOCK |
* | | | | | | | | | | | | | | | |
* |-----------+------+------+------+------+------+------| |------+------+------+------+------+------+-----------|
* | ' " ` | Q | W | F | P | G | CCopy| | VOLDN| J | L | U Ü | Y | = + | ~ : ; |
@@ -78,7 +78,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----------+------+------+------+------+------| Paste| | MUTE |------+------+------+------+------+-----------|
* | - , < | Z | X | C | V | B | | | | K | M | / ? | \ | | ^ | _ . > |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | AUX | RAISE | LOWER | LEAD | GUI | | ESC | LOCK | < | v | > |
* | AUX | RAISE | LOWER | LEAD | GUI | | ESC | RUN | < | v | > |
* `-----------------------------------' `-----------------------------------'
* ,-------------. ,-------------.
* | ALT | CTRL | | HOME | END |
@@ -101,11 +101,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_SPC, KC_BSPC, KC_TAB,
// Right Hand
KC_VOLU, KC_6, KC_7, KC_8, KC_9, KC_0, ____,
KC_VOLD, KC_J, KC_L, KC_U, KC_Y, KC_MINS, TD(TD_TDE),
KC_VOLU, KC_6, KC_7, KC_8, KC_9, KC_0, LGUI(KC_L),
KC_VOLD, KC_J, KC_L, KC_U, KC_Y, KC_EQL, TD(TD_TDE),
KC_H, KC_N, KC_E, KC_I, KC_O, TD(TD_RPRN),
KC_MUTE, KC_K, KC_M, KC_SLSH, KC_BSLS, KC_UP, TD(TD_USC),
KC_ESC, LGUI(KC_L), KC_LEFT, KC_DOWN, KC_RGHT,
KC_ESC, LGUI(KC_R), KC_LEFT, KC_DOWN, KC_RGHT,
KC_HOME, KC_END,
KC_PGUP,
KC_PGDOWN, KC_ENT, OSM(MOD_LSFT)),

View File

@@ -202,6 +202,9 @@ uint8_t matrix_scan(void)
}
#endif
#ifdef LEFT_LEDS
mcp23018_status = ergodox_left_leds_update();
#endif // LEFT_LEDS
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
select_row(i);
wait_us(30); // without this wait read unstable value.

View File

@@ -66,6 +66,10 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=512
# If you have Left LEDs (see
# https://geekhack.org/index.php?topic=22780.msg873819#msg873819 for
# details), include the following define:
# OPT_DEFS += -DLEFT_LEDS
# Build Options
# comment out to disable the options.

View File

@@ -0,0 +1,25 @@
# DudeOfAwesome's ErgoDox Infinity Layout
A basic ErgoDox layout with Planck-like tri-layer support.
![ErgoDox Layout](https://i.imgur.com/9zfKPV7.png)
## Features
- Planck-like tri-layer
- Workman layout
- In-progress gaming layer
- Numpad
- LCD colors are linked together, like the default KLL firmware
## Building and flashing
1. Put your board in DFU mode with either the button on the bottom, or with a software key in your current firmware
1. Flash left half:
```bash
$ make ergodox_infinity:dudeofawesome:dfu-util
```
1. Flash right half:
```bash
$ make ergodox_infinity:dudeofawesome:dfu-util MASTER=right
```

View File

@@ -0,0 +1,568 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
enum custom_layers {
_QWERTY,
_DVORAK,
_WORKMAN,
_GAME,
_MOUSE,
_NUM,
_LOWER,
_RAISE,
_ADJUST,
};
enum custom_keycodes {
QWERTY = SAFE_RANGE,
DVORAK,
WORKMAN,
LOWER,
RAISE,
GAME,
MOUSE,
NUM,
EPRM,
VRSN,
RGB_SLD
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic QWERTY layer
*
* ,---------------------------------------------. ,---------------------------------------------.
* | - | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = |
* |--------+-----+-----+-----+-----+------------| |------+-----+-----+-----+-----+-----+--------|
* | Tab | Q | W | E | R | T | [{ | | ]} | Y | U | I | O | P | BSPC |
* |--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
* | ESC | A | S | D | F | G |------| |------| H | J | K | L | ; | '" |
* |--------+-----+-----+-----+-----+-----| L1 | | L1 |-----+-----+-----+-----+-----+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | Enter |
* `--------+-----+-----+-----+-----+------------' `------------+-----+-----+-----+-----+--------'
* | Num |Ctrl | Alt |LGUI |Lower| |Raise|Left |Down | Up |Right |
* `------------------------------' `------------------------------'
* ,------------. ,------------.
* |Play |Mouse | | Num |Mouse|
* ,----|-----|------| |------+-----+-----.
* | | | Alt | | Alt | | |
* |BSPC|LOWER|------| |------|RAISE|Space|
* | | | LGUI | | LGUI | | |
* `-----------------' `------------------'
*/
[_QWERTY] = LAYOUT_ergodox(
// left hand
KC_MINUS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRACKET,
KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_FN1,
TG(_NUM), KC_LCTL, KC_LALT, KC_LGUI, LOWER,
KC_MPLY, TG(_MOUSE),
KC_LALT,
LOWER, KC_BSPACE, KC_LGUI,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL,
KC_RBRACKET, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPACE,
KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE,
KC_FN1, KC_N, KC_M, KC_COMM, KC_DOT, LT(_MOUSE, KC_SLSH), KC_ENTER,
RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
TG(_NUM), TG(_MOUSE),
KC_LALT,
KC_LGUI, KC_SPACE, RAISE
),
/* Keymap 0: Basic Dvorak layer
*
* ,---------------------------------------------. ,--------------------------------------------.
* | - | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = |
* |--------+-----+-----+-----+-----+------------| |------+-----+-----+-----+-----+-----+--------|
* | Tab | ' | , | . | P | Y | [{ | | ]} | F | G | C | R | L | BSPC |
* |--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
* | ESC | A | O | E | U | I |------| |------| D | H | T | N | S | / |
* |--------+-----+-----+-----+-----+-----| L1 | | L1 |-----+-----+-----+-----+-----+--------|
* | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | Enter |
* `--------+-----+-----+-----+-----+------------' `------------+-----+-----+-----+-----+--------'
* | Num |Ctrl | Alt |LGUI |Lower| |Raise|Left |Down | Up |Right |
* `------------------------------' `------------------------------'
* ,------------. ,------------.
* |Play |Mouse | | Num |Mouse|
* ,----|-----|------| |------+-----+-----.
* | | | Alt | | Alt | | |
* |BSPC|LOWER|------| |------|RAISE|Space|
* | | | LGUI | | LGUI | | |
* `-----------------' `------------------'
*/
[_DVORAK] = LAYOUT_ergodox(
// left hand
KC_MINUS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_LBRACKET,
KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSPO, KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, KC_FN1,
TG(_NUM), KC_LCTL, KC_LALT, KC_LGUI, LOWER,
KC_MPLY, TG(_MOUSE),
KC_LALT,
KC_BSPACE, LOWER, KC_LGUI,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL,
KC_RBRACKET, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPACE,
KC_D, KC_H, KC_T, KC_N, KC_S, LT(MOUSE, KC_SLSH),
KC_FN1, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENTER,
RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
TG(_NUM), TG(_MOUSE),
KC_LALT,
KC_LGUI, RAISE, KC_SPACE
),
/* Keymap 0: Basic Workman layer
*
* ,---------------------------------------------. ,--------------------------------------------.
* | - | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = |
* |--------+-----+-----+-----+-----+------------| |------+-----+-----+-----+-----+-----+--------|
* | Tab | Q | D | R | W | B | [{ | | ]} | J | F | U | P | ; | BSPC |
* |--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
* | ESC | A | S | H | T | G |------| |------| Y | N | E | O | I | '" |
* |--------+-----+-----+-----+-----+-----| L1 | | L1 |-----+-----+-----+-----+-----+--------|
* | LShift | Z | X | M | C | V | | | | K | L | , | . | / | Enter |
* `--------+-----+-----+-----+-----+------------' `------------+-----+-----+-----+-----+--------'
* | Num |Ctrl | Alt |LGUI |Lower| |Raise|Left |Down | Up |Right |
* `------------------------------' `------------------------------'
* ,------------. ,------------.
* |Play |Mouse | | Num |Mouse|
* ,----|-----|------| |------+-----+-----.
* | | | Alt | | Alt | | |
* |BSPC|LOWER|------| |------|RAISE|Space|
* | | | LGUI | | LGUI | | |
* `-----------------' `------------------'
*/
[_WORKMAN] = LAYOUT_ergodox(
// left hand
KC_MINUS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_LBRACKET,
KC_ESC, KC_A, KC_S, KC_H, KC_T, KC_G,
KC_LSPO, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_FN1,
TG(_NUM), KC_LCTL, KC_LALT, KC_LGUI, LOWER,
KC_MPLY, TG(_MOUSE),
KC_LALT,
KC_BSPACE, LOWER, KC_LGUI,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL,
KC_RBRACKET, KC_J, KC_F, KC_U, KC_P, KC_SCOLON, KC_BSPACE,
KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOTE,
KC_FN1, KC_K, KC_L, KC_COMM, KC_DOT, LT(_MOUSE, KC_SLSH), KC_ENTER,
RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
NUM, TG(_MOUSE),
KC_LALT,
KC_LGUI, RAISE, KC_SPACE
),
/* Lower
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* | Version | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | ~ | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Del | F1 | F2 | F3 | F4 | F5 |------| |------| F6 | _ | + | { | } | | |
* |---------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------|
* | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO ~ |ISO | | Home | End | |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Animat| | |Toggle|Solid |
* ,------|------|------| |------+------+------.
* |Bright|Bright| | | |Hue- |Hue+ |
* |ness- |ness+ |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_LOWER] = LAYOUT_ergodox(
// left hand
VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______,
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
_______, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
_______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY,
_______, _______,
_______,
_______, _______, _______
),
/* Raise
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* | Version | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | F11 |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Del | F1 | F2 | F3 | F4 | F5 |------| |------| F6 | - | = | [ | ] | \ |
* |---------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------|
* | | F7 | F8 | F9 | F10 | F11 | | | | F12 |ISO # |ISO / |Pg Up |Pg Dn | |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Animat| | |Toggle|Solid |
* ,------|------|------| |------+------+------.
* |Bright|Bright| | | |Hue- |Hue+ |
* |ness- |ness+ |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_RAISE] = LAYOUT_ergodox(
// left hand
VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______,
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
_______, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
_______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY,
_______, _______,
_______,
_______, _______, _______
),
/* Adjust
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* |Version | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | |Reset |Debug | | | | | | | |TRM on|TRMoff| | | Del |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | |AG Nrm|------| |------|AG Swp|QWERTY|Wrkman|Dvorak| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_ADJUST] = LAYOUT_ergodox(
// left hand
VRSN, _______, _______, _______, _______, _______, _______,
_______, RESET, DEBUG, _______, _______, _______, _______,
_______, _______, _______, _______, _______, AG_NORM,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, TERM_ON, TERM_OFF, _______, _______, KC_DEL,
AG_SWAP, QWERTY, WORKMAN, DVORAK, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | Lclk | MsUp | Rclk |Wh Up | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght|Wh Dn |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | |Brwser|Brwser|
* | Lclk | Rclk |------| |------|Back |Fwd |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MOUSE
[_MOUSE] = LAYOUT_ergodox(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_D, _______,
_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U,
_______, _______, KC_WH_L, KC_BTN3, KC_WH_R, _______, TO(_GAME),
_______, _______, _______, _______, _______,
_______, _______,
KC_WH_D,
KC_BTN1, KC_BTN2, KC_WH_U,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, KC_MPLY,
TO(_GAME), _______, _______, KC_MPRV, KC_MNXT, _______, _______,
KC_VOLU, KC_VOLD, KC_MUTE, _______, _______,
_______, _______,
_______,
_______, KC_WBAK, KC_WFWD
),
/* Keymap 2: GAME
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | Lclk | MsUp | Rclk | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | |Brwser|Brwser|
* | Lclk | Rclk |------| |------|Back |Fwd |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_GAME] = LAYOUT_ergodox(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
KC_SPACE, KC_LGUI, KC_LALT,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
TG(_MOUSE), TG(_NUM),
_______,
_______, _______, _______
),
/* Keymap 2: NUMPAD
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | . | 0 | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[_NUM] = LAYOUT_ergodox(
// left hand
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
_______, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, _______,
_______, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV,
_______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_ASTERISK, _______,
_______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, _______,
_______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, _______,
KC_KP_DOT, KC_KP_0, KC_KP_0, KC_KP_EQUAL, _______,
_______, _______,
_______,
_______, _______, _______
),
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
case 1:
if (record->event.pressed) { // For resetting EEPROM
eeconfig_init();
}
break;
}
return MACRO_NONE;
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
print("mode just switched to qwerty and this is a huge string\n");
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case WORKMAN:
if (record->event.pressed) {
set_single_persistent_default_layer(_WORKMAN);
}
return false;
break;
case DVORAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_DVORAK);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
if (IS_LAYER_ON(_ADJUST)) {
layer_off(_LOWER);
layer_off(_RAISE);
}
} else {
layer_off(_LOWER);
if (IS_LAYER_ON(_ADJUST)) {
layer_off(_ADJUST);
layer_on(_RAISE);
}
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
if (IS_LAYER_ON(_ADJUST)) {
layer_off(_RAISE);
layer_off(_LOWER);
}
} else {
layer_off(_RAISE);
if (IS_LAYER_ON(_ADJUST)) {
layer_off(_ADJUST);
layer_on(_LOWER);
}
}
return false;
break;
case EPRM:
if (record->event.pressed) {
eeconfig_init();
}
return false;
break;
case VRSN:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
case RGB_SLD:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_mode(1);
#endif
}
return false;
break;
}
return true;
}
/**
* Runs just one time when the keyboard initializes.
*/
void matrix_init_user(void) {
};
/**
* Runs constantly in the background, in a loop.
*/
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case _LOWER:
ergodox_right_led_1_on();
break;
case _RAISE:
ergodox_right_led_2_on();
break;
case _ADJUST:
ergodox_right_led_3_on();
break;
}
};

View File

@@ -0,0 +1,345 @@
/*
Copyright 2016 Fred Sundvik <fsundvik@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Currently we are assuming that both the backlight and LCD are enabled
* But it's entirely possible to write a custom visualizer that use only
* one of them
*/
#ifndef LCD_BACKLIGHT_ENABLE
#error This visualizer needs that LCD backlight is enabled
#endif
#ifndef LCD_ENABLE
#error This visualizer needs that LCD is enabled
#endif
#include "visualizer.h"
#include "visualizer_keyframes.h"
#include "lcd_keyframes.h"
#include "lcd_backlight_keyframes.h"
#include "system/serial_link.h"
#include "default_animations.h"
static const uint32_t logo_background_color = LCD_COLOR(0, 0, 255);
static const uint32_t initial_color = LCD_COLOR(84, 255, 255);
static const uint32_t led_emulation_colors[4] = {
LCD_COLOR(0, 0, 255),
LCD_COLOR(141, 255, 255),
LCD_COLOR(18, 255, 255),
LCD_COLOR(194, 255, 255),
};
static uint32_t next_led_target_color = 0;
typedef enum {
LCD_STATE_INITIAL,
LCD_STATE_LAYER_BITMAP,
LCD_STATE_BITMAP_AND_LEDS,
} lcd_state_t;
static lcd_state_t lcd_state = LCD_STATE_INITIAL;
typedef struct {
uint8_t led_on;
uint8_t led1;
uint8_t led2;
uint8_t led3;
} visualizer_user_data_t;
/**
* Don't access from visualization function, use the visualizer state instead
*/
static visualizer_user_data_t user_data_keyboard = {
.led_on = 0,
.led1 = LED_BRIGHTNESS_HI,
.led2 = LED_BRIGHTNESS_HI,
.led3 = LED_BRIGHTNESS_HI,
};
_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE,
"Please increase the VISUALIZER_USER_DATA_SIZE");
// Feel free to modify the animations below, or even add new ones if needed
// The color animation animates the LCD color when you change layers
static keyframe_animation_t one_led_color = {
.num_frames = 1,
.loop = false,
.frame_lengths = {gfxMillisecondsToTicks(0)},
.frame_functions = {lcd_backlight_keyframe_set_color},
};
bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) {
uint32_t temp = next_led_target_color;
next_led_target_color = state->target_lcd_color;
state->target_lcd_color = temp;
return false;
}
// The color animation animates the LCD color when you change layers
static keyframe_animation_t two_led_colors = {
.num_frames = 2,
.loop = true,
.frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)},
.frame_functions = {lcd_backlight_keyframe_set_color, swap_led_target_color},
};
/**
* The LCD animation alternates between the layer name display and a
* bitmap that displays all active layers
*/
static keyframe_animation_t lcd_bitmap_animation = {
.num_frames = 1,
.loop = false,
.frame_lengths = {gfxMillisecondsToTicks(0)},
.frame_functions = {lcd_keyframe_display_layer_bitmap},
};
static keyframe_animation_t lcd_bitmap_leds_animation = {
.num_frames = 2,
.loop = true,
.frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)},
.frame_functions = {lcd_keyframe_display_layer_bitmap, lcd_keyframe_display_led_states},
};
void initialize_user_visualizer(visualizer_state_t* state) {
/**
* The brightness will be dynamically adjustable in the future
* But for now, change it here.
*/
lcd_backlight_brightness(180);
state->current_lcd_color = initial_color;
state->target_lcd_color = logo_background_color;
lcd_state = LCD_STATE_INITIAL;
start_keyframe_animation(&default_startup_animation);
}
static inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) {
return user_data->led_on & (1u << num);
}
static uint8_t get_led_index_master(visualizer_user_data_t* user_data) {
for (int i=0; i < 4; i++) {
if (is_led_on(user_data, i)) {
return i + 1;
}
}
return 0;
}
static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) {
uint8_t master_index = get_led_index_master(user_data);
if (master_index!=0) {
for (int i=master_index; i < 4; i++) {
if (is_led_on(user_data, i)) {
return i + 1;
}
}
}
return 0;
}
static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) {
if (
is_led_on(user_data, 0) &&
is_led_on(user_data, 1) &&
is_led_on(user_data, 2)
) {
return 3;
}
return 0;
}
static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) {
switch (index) {
case 1:
return user_data->led1;
case 2:
return user_data->led2;
case 3:
return user_data->led3;
}
return 0;
}
static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data;
visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data;
uint8_t new_index;
uint8_t old_index;
if (true || is_serial_link_master()) {
new_index = get_led_index_master(user_data_new);
old_index = get_led_index_master(user_data_old);
} else {
new_index = get_led_index_slave(user_data_new);
old_index = get_led_index_slave(user_data_old);
}
uint8_t new_secondary_index = get_secondary_led_index(user_data_new);
uint8_t old_secondary_index = get_secondary_led_index(user_data_old);
uint8_t new_brightness = get_brightness(user_data_new, new_index);
uint8_t old_brightness = get_brightness(user_data_old, old_index);
uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index);
uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index);
if (
lcd_state == LCD_STATE_INITIAL ||
new_index != old_index ||
new_secondary_index != old_secondary_index ||
new_brightness != old_brightness ||
new_secondary_brightness != old_secondary_brightness
) {
if (new_secondary_index != 0) {
state->target_lcd_color = change_lcd_color_intensity(
led_emulation_colors[new_index], new_brightness);
next_led_target_color = change_lcd_color_intensity(
led_emulation_colors[new_secondary_index], new_secondary_brightness);
stop_keyframe_animation(&one_led_color);
start_keyframe_animation(&two_led_colors);
} else {
state->target_lcd_color = change_lcd_color_intensity(
led_emulation_colors[new_index], new_brightness);
stop_keyframe_animation(&two_led_colors);
start_keyframe_animation(&one_led_color);
}
}
}
static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
if (state->status.leds) {
if (
lcd_state != LCD_STATE_BITMAP_AND_LEDS ||
state->status.leds != prev_status->leds ||
state->status.layer != prev_status->layer ||
state->status.default_layer != prev_status->default_layer
) {
// NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case
stop_keyframe_animation(&lcd_bitmap_animation);
lcd_state = LCD_STATE_BITMAP_AND_LEDS;
/**
* For information:
* The logic in this function makes sure that this doesn't happen, but if you call start on an
* animation that is already playing it will be restarted.
*/
start_keyframe_animation(&lcd_bitmap_leds_animation);
}
} else {
if (
lcd_state != LCD_STATE_LAYER_BITMAP ||
state->status.layer != prev_status->layer ||
state->status.default_layer != prev_status->default_layer
) {
stop_keyframe_animation(&lcd_bitmap_leds_animation);
lcd_state = LCD_STATE_LAYER_BITMAP;
start_keyframe_animation(&lcd_bitmap_animation);
}
}
}
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
/**
* Check the status here to start and stop animations
* You might have to save some state, like the current animation here so that you can start the right
* This function is called every time the status changes
*
* NOTE that this is called from the visualizer thread, so don't access anything else outside the status
* This is also important because the slave won't have access to the active layer for example outside the
* status.
*/
update_emulated_leds(state, prev_status);
update_lcd_text(state, prev_status);
}
void user_visualizer_suspend(visualizer_state_t* state) {
state->layer_text = "Suspending...";
uint8_t hue = LCD_HUE(state->current_lcd_color);
uint8_t sat = LCD_SAT(state->current_lcd_color);
state->target_lcd_color = LCD_COLOR(hue, sat, 0);
start_keyframe_animation(&default_suspend_animation);
}
void user_visualizer_resume(visualizer_state_t* state) {
state->current_lcd_color = initial_color;
state->target_lcd_color = logo_background_color;
lcd_state = LCD_STATE_INITIAL;
start_keyframe_animation(&default_startup_animation);
}
void ergodox_board_led_on(void){
// No board led support
}
void ergodox_right_led_1_on(void){
user_data_keyboard.led_on |= (1u << 0);
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_2_on(void){
user_data_keyboard.led_on |= (1u << 1);
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_3_on(void){
user_data_keyboard.led_on |= (1u << 2);
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_board_led_off(void){
// No board led support
}
void ergodox_right_led_1_off(void){
user_data_keyboard.led_on &= ~(1u << 0);
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_2_off(void){
user_data_keyboard.led_on &= ~(1u << 1);
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_3_off(void){
user_data_keyboard.led_on &= ~(1u << 2);
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_1_set(uint8_t n) {
user_data_keyboard.led1 = n;
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_2_set(uint8_t n) {
user_data_keyboard.led2 = n;
visualizer_set_user_data(&user_data_keyboard);
}
void ergodox_right_led_3_set(uint8_t n) {
user_data_keyboard.led3 = n;
visualizer_set_user_data(&user_data_keyboard);
}

View File

@@ -0,0 +1,275 @@
// Nordic layout for Ergodox infinity
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#include "keymap_nordic.h"
#include "keymap_german.h"
// Layer names
#define BASE 0 // default layer
#define FUNCL 1 // function layer
#define SYMB 2 // symbol layer
#define MDIA 3 // media keys
#define _______ KC_TRNS
enum custom_keycodes {
PLACEHOLDER = SAFE_RANGE, // can always be here
EPRM,
VRSN,
RGB_SLD
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
*
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | §½ | | PRSC | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | Å |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Caps | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä |
* |--------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | - | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Ctrl | ¨^ | <|> | Alt | LGui| | Ctrl | Alt | ´` | + | RGui |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LEFT |RIGHT | | DOWN | UP |
* ,------+------+------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Del |------| |------| Enter | Bkspc|
* | | | End | | PgDn | | |
* `--------------------' `----------------------'
*/
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1),
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(2),
KC_LCTRL, KC_RBRC, KC_NONUS_BSLASH, KC_LALT, KC_LGUI,
KC_LEFT, KC_RIGHT,
KC_HOME,
KC_SPC,KC_DELT,KC_END,
// right hand
KC_PSCREEN, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
MO(2), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_RCTRL, KC_RALT, KC_BSLS, KC_EQL, KC_RGUI,
KC_DOWN, KC_UP,
KC_PGUP,
KC_PGDN, KC_ENT, KC_BSPC
),
/* Keymap 1: Basic layer with functions
*
*
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | Å |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Caps | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä |
* |--------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | - | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Ctrl | ¨^ | <|> | Alt | LGui| | Ctrl | Alt | ´` | + | RGui |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LEFT |RIGHT | | DOWN | UP |
* ,------+------+------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Del |------| |------| Enter | Bkspc|
* | | | End | | PgDn | | |
* `--------------------' `----------------------'
*/
[FUNCL] = LAYOUT_ergodox( // layer 1 : functions
// left hand
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______,_______,_______,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, _______
),
/* Keymap 2: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Animat| BLTOG| |Toggle|Solid |
* ,------|------|------| |------+------+------.
* |Bright|Bright| BL+ | | |Hue- |Hue+ |
* |ness- |ness+ |------| |------| | |
* | | | BL- | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,DE_EXLM,DE_AT, DE_LCBR,DE_RCBR,DE_PIPE,KC_TRNS,
KC_TRNS,DE_HASH,DE_DLR, DE_LPRN,DE_RPRN,DE_GRV,
KC_TRNS,DE_PERC,DE_CIRC,DE_LBRC,DE_RBRC,DE_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
RGB_MOD,BL_TOGG,
BL_INC,
RGB_VAD,RGB_VAI,BL_DEC,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, DE_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, DE_PLUS, KC_TRNS,
KC_TRNS, DE_AMPR, KC_1, KC_2, KC_3, DE_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, DE_EQL, KC_TRNS,
RGB_TOG, RGB_SLD,
KC_TRNS,
KC_TRNS, RGB_HUD, RGB_HUI
),
/* Keymap 3: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | RESET | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | Lclk | MsUp | Rclk | | | | | |VolDwn| Mute |VolUp | | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------| |------| | Prev | Stop | Play | Next | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |WhRght|WhDown| WhUp |WhLeft|WhClk | | | |BwSrch|BwBack|BwHome|BwRefr|BwFwd | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | |MsAcl0|MsAcl1|MsAcl2| | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | |Brwser|Brwser|
* | Lclk | Rclk |------| |------|Back |Forwd |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
RESET, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS,
KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5,
KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS,
KC_TRNS, KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_BTN1, KC_BTN2, KC_TRNS,
// right hand
KC_TRNS, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11,
KC_TRNS, KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_F12,
KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,
KC_TRNS, KC_WSCH, KC_WBAK, KC_WHOM, KC_WREF, KC_WFWD, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_WBAK, KC_WFWD
),
};
const uint16_t PROGMEM fn_actions[] = {
[2] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 2 (Symbols)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
case 1:
if (record->event.pressed) { // For resetting EEPROM
eeconfig_init();
}
break;
}
return MACRO_NONE;
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// dynamically generate these.
case EPRM:
if (record->event.pressed) {
eeconfig_init();
}
return false;
break;
case VRSN:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
case RGB_SLD:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_mode(1);
#endif
}
return false;
break;
}
return true;
}
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View File

@@ -0,0 +1,9 @@
# Nordic Ergodox Infinity layout
QWERTY Nordic layout for ergodox infinity.
Features:
- Basic ISO Nordic qwerty layout.
- Backlight control.
- Still work in progress.

View File

@@ -19,7 +19,7 @@ for the left and right halves seperately. To flash them:
- Press the program button (back of keyboard, above thumb pad).
- Install the firmware with `sudo make ergodox_infinity-keymapname-dfu-util MASTER=right`
- Install the firmware with `sudo make ergodox_infinity:keymapname:dfu-util MASTER=right`
More information on the Infinity firmware is available in the [TMK/chibios for
Input Club Infinity Ergodox](https://github.com/fredizzimo/infinity_ergodox/blob/master/README.md)

View File

@@ -86,4 +86,4 @@ LED_DRIVER = is31fl3731c
LED_WIDTH = 7
LED_HEIGHT = 7
LAYOUTS = ergodox ergodox_80
LAYOUTS = ergodox

View File

@@ -1,3 +1,6 @@
#define TAPPING_TERM 150 //reduce time required to register a held key
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

View File

@@ -7,12 +7,14 @@
enum QFR_layers {
_COLEMAK,
_QWERTY,
_LOWER,
_MOUSE
};
enum QFR_keycodes {
COLEMAK = SAFE_RANGE,
QWERTY,
LOWER,
MOUSE
};
@@ -40,8 +42,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL,KC_LGUI, KC_LALT, SPC_LW, MSE, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT
),
[_QWERTY] = KEYMAP_TKL(\
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \
KC_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \
KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \
KC_LCTL,KC_LGUI,KC_LALT, SPC_LW, MSE, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[_LOWER] = KEYMAP_TKL(\
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______, \
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK,_______, \
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LBRC, KC_RBRC, KC_UNDS, KC_PLUS, KC_BSPC, _______,_______,_______, \
KC_TAB, KC_PGUP, KC_HOME, KC_UP, KC_END, XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN4, KC_BTN5, XXXXXXX, KC_LCBR, KC_RCBR, KC_PIPE, _______,_______,_______, \
KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, _______, _______, \
@@ -58,3 +69,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, KC_ACL2, MSE, _______, _______, _______, _______,_______,_______ \
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
//print("mode just switched to qwerty and this is a huge string\n");
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case COLEMAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_COLEMAK);
}
return false;
break;
}
return true;
}

View File

@@ -1,7 +1,15 @@
# TKL keymap for frosty_flake
# TKL keymap for frosty\_flake
```
make frosty_flake:QFR_JM
dfu-programmer atmega32u2 erase
dfu-programmer atmega32u2 flash frosty_flake_QFR_JM.hex
dfu-programmer atmega32u2 start
```
##Layers
```
,----. ,-------------------. ,-------------------. ,-------------------. ,--------------.
|ESC | | F1 | F2 | F3 | F4 | | F5 | F6 | F7 | F8 | | F9 |F10 |F11 |F12 | |PrSc|ScLk|PsBk|
'----' '-------------------' '-------------------' '-------------------' '--------------'
@@ -17,20 +25,21 @@
|Ctrl|LGUI|LAlt| Space/Lower |MSE |RGUI|Menu|Ctrl| |Left|Down|Rght|
'-------------------------------------------------------------------------' '--------------'
```
### Base Layer - Colemak
* The base layout is Colemak.
* I've implemented COLEMAK = SAFE_RANGE when enumerating the custom_keycodes, but I don't actually know what this does...
The base layout is Colemak by default, but this can be changed to QWERTY via the *LOWER* layer.
* I've implemented COLEMAK = SAFE\_RANGE when enumerating the custom\_keycodes, but I don't actually know what this does...
* Space cadet is implemented in the shift keys (hold for shift, tap for respective parentheses)
* Space cadet is implemented in the shift keys (hold for shift, tap for respective parentheses)
#### Layer Shifting
* The spacebar is a **TAP_KEY** macro - Hold for momentary *LOWER* layer, Tap for Space.
* The Right hand ALT key is a **TAP_TOGGLE** macro for the *MOUSE* layer (RAlt is accessible through LOWER, if you want...)
#### Layer Shifting
* The spacebar is a **TAP_KEY** macro - Hold for momentary *LOWER* layer, Tap for Space.
* The Right hand ALT key is a **TAP_TOGGLE** macro for the *MOUSE* layer (RAlt is accessible through LOWER, if you want...)
### LOWER
```
,----. ,-------------------. ,-------------------. ,-------------------. ,--------------.
|ESC | | F1 | F2 | F3 | F4 | | F5 | F6 | F7 | F8 | | F9 |F10 |F11 |F12 | |PrSc|ScLk|PsBk|
|ESC | | F1 | F2 | F3 | F4 | | F5 | F6 | F7 | F8 | | F9 |F10 |F11 |F12 | |QWTY|CLMK|PsBk|
'----' '-------------------' '-------------------' '-------------------' '--------------'
,-------------------------------------------------------------------------. ,--------------.
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | _ | + | Bspc | | Ins|Home|PgUp|
@@ -41,17 +50,19 @@
|-------------------------------------------------------------------------| ,----.
| LSPO | Z | X | C | V | | | | , | . | / | RSPC | | Up |
|-------------------------------------------------------------------------| ,--------------.
|Ctrl|LGUI|LAlt| |MSE |RGUI|Menu|Ctrl| |Left|Down|Rght|
|Ctrl|LGUI|LAlt| |RAlt|RGUI|Menu|Ctrl| |Left|Down|Rght|
'-------------------------------------------------------------------------' '--------------'
* The *LOWER* layer contains a navigation cluster on the left hand. This layer is momentary when the spacebar or LOWER (RAlt) key is held and toggled on/off when the LOWER key is tapped.
```
The *LOWER* layer contains a navigation cluster on the left hand. This layer is momentary when the spacebar or LOWER (RAlt) key is held and toggled on/off when the LOWER key is tapped.
* The Navigation cluster is offset to the right compared to the traditional **WASD** nav cluster. With this implementation, you don't need to move your hand from the home position when navigating. Page Up & Down keys are found on the far left of the cluster.
* The Navigation cluster is offset to the right compared to the traditional **WASD** nav cluster. With this implementation, you don't need to move your hand from the home position when navigating. Page Up & Down keys are found on the far left of the cluster.
* All unused (blank on the above keymap) keys are locked out using the XXXXXXX filler (KC_NO), all modifiers (edge |_| keys \[except 0, \. & Fn\] on the above keymap) and the ZXCV cluster are transparent (_______) to the Base layer.
* All unused (blank on the above keymap) keys are locked out using the XXXXXXX filler (KC\_NO), all modifiers (edge |\_| keys \[except 0, \. & Fn\] on the above keymap) and the ZXCV cluster are transparent (\_\_\_\_\_\_\_) to the Base layer.
* The base layer can be switched to QWERTY or COLEMAK by pressing the Pause Break or Scroll Lock keys respectively
### MOUSE
```
,----. ,-------------------. ,-------------------. ,-------------------. ,--------------.
|ESC | | F1 | F2 | F3 | F4 | | F5 | F6 | F7 | F8 | | F9 |F10 |F11 |F12 | |PrSc|ScLk|PsBk|
'----' '-------------------' '-------------------' '-------------------' '--------------'
@@ -66,8 +77,10 @@
|-------------------------------------------------------------------------| ,--------------.
|Ctrl|LGUI|LAlt| Accel ++ |MSE |RGUI|Menu|Ctrl| |Left|Down|Rght|
'-------------------------------------------------------------------------' '--------------'
```
The *MOUSE* layer contains keys replicating functions found on the mouse.
* The navigation cluster (Up, Down, Left, Right) is a replication of the Navigation cluster on the *LOWER* layer. The scroll keys are analagous to the Page Up & Downkeys.
* The primary click (right & left) buttons are on the right home row (index & middle fingers)
* Secondary click buttons are above the standard keys (M3/Wheel click, M4, M5) but I do not use this function.
* The *MOUSE* layer contains keys replicating functions found on the mouse.
* The navigation cluster (Up, Down, Left, Right) is a replication of the Navigation cluster on the *LOWER* layer. The scroll keys are analagous to the Page Up & Down keys.
* The primary click (right & left) buttons are on the right home row (index & middle fingers)
* Secondary click buttons are above the standard keys (M3/Wheel click, M4, M5) but I do not use this function.

17
keyboards/gh60/info.json Normal file
View File

@@ -0,0 +1,17 @@
{
"keyboard_name": "GH60",
"identifier": "FEED:6060:0001",
"layout": {
"LAYOUT_60_ansi": {
"layout": [{"x":0, "y":0, "label":"~"}, {"x":1, "y":0, "label":"!"}, {"x":2, "y":0, "label":"@"}, {"x":3, "y":0, "label":"#"}, {"x":4, "y":0, "label":"$"}, {"x":5, "y":0, "label":"%"}, {"x":6, "y":0, "label":"^"}, {"x":7, "y":0, "label":"&"}, {"x":8, "y":0, "label":"*"}, {"x":9, "y":0, "label":"("}, {"x":10, "y":0, "label":")"}, {"x":11, "y":0, "label":"_"}, {"x":12, "y":0, "label":"+"}, {"x":14, "y":0, "label":"Backspace", "w":2}, {"x":0.5, "y":1, "label":"Tab", "w":1.5}, {"x":1.5, "y":1, "label":"Q"}, {"x":2.5, "y":1, "label":"W"}, {"x":3.5, "y":1, "label":"E"}, {"x":4.5, "y":1, "label":"R"}, {"x":5.5, "y":1, "label":"T"}, {"x":6.5, "y":1, "label":"Y"}, {"x":7.5, "y":1, "label":"U"}, {"x":8.5, "y":1, "label":"I"}, {"x":9.5, "y":1, "label":"O"}, {"x":10.5, "y":1, "label":"P"}, {"x":11.5, "y":1, "label":"{"}, {"x":12.5, "y":1, "label":"}"}, {"x":14, "y":1, "label":"|", "w":1.5}, {"x":0.75, "y":2, "label":"Caps Lock", "w":1.75}, {"x":1.75, "y":2, "label":"A"}, {"x":2.75, "y":2, "label":"S"}, {"x":3.75, "y":2, "label":"D"}, {"x":4.75, "y":2, "label":"F"}, {"x":5.75, "y":2, "label":"G"}, {"x":6.75, "y":2, "label":"H"}, {"x":7.75, "y":2, "label":"J"}, {"x":8.75, "y":2, "label":"K"}, {"x":9.75, "y":2, "label":"L"}, {"x":10.75, "y":2, "label":":"}, {"x":11.75, "y":2, "label":"\""}, {"x":14, "y":2, "label":"Enter", "w":2.25}, {"x":1.25, "y":3, "label":"Shift", "w":2.25}, {"x":2.25, "y":3, "label":"Z"}, {"x":3.25, "y":3, "label":"X"}, {"x":4.25, "y":3, "label":"C"}, {"x":5.25, "y":3, "label":"V"}, {"x":6.25, "y":3, "label":"B"}, {"x":7.25, "y":3, "label":"N"}, {"x":8.25, "y":3, "label":"M"}, {"x":9.25, "y":3, "label":"<"}, {"x":10.25, "y":3, "label":">"}, {"x":11.25, "y":3, "label":"?"}, {"x":14, "y":3, "label":"Shift", "w":2.75}, {"x":0.25, "y":4, "label":"Ctrl", "w":1.25}, {"x":1.5, "y":4, "label":"Win", "w":1.25}, {"x":2.75, "y":4, "label":"Alt", "w":1.25}, {"x":9, "y":4, "w":6.25}, {"x":10.25, "y":4, "label":"Alt", "w":1.25}, {"x":11.5, "y":4, "label":"Win", "w":1.25}, {"x":12.75, "y":4, "label":"Menu", "w":1.25}, {"x":14, "y":4, "label":"Ctrl", "w":1.25}]
}
},
"maintainer": "qmk",
"keyboard_folder": "gh60",
"width": 15,
"bootloader": "atmel-dfu",
"processor": "atmega32u4",
"height": 5,
"url": "http://qmk.fm/keyboards/gh60",
"manufacturer": "geekhack"
}

View File

@@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KEYMAP(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_EURO, TP_REQ, TP_ACC, KC_TRNS, MCO_UE, KC_TRNS, MCO_OE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
KC_TRNS, MCO_AE, MCO_SS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_SW,KC_TRNS, KC_TRNS, KC_TRNS,\
KC_TRNS, MCO_AE, MCO_SS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_SW,KC_TRNS, KC_GRV, KC_TRNS,\
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_HUD, KC_TRNS, KC_TRNS, KC_TRNS,\
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};

View File

@@ -57,7 +57,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define TAPPING_TOGGLE 1
//define maximum duration of hold required to register a tap vs hold default is 200
#define TAPPING_TERM 150 //reduce time required so fast typing doesn't disrupt
#define TAPPING_TERM 150 //reduce time required to register a held key
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5

View File

@@ -14,6 +14,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define TAPPING_TERM 150 //reduce time required to register a held key
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

View File

@@ -72,14 +72,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----+------+------+------+------+-------------+------+------+------+------+------|
* | LSPO| Z | X | C | V | B | K | M | , | . | / | RSPC |
* |-----+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl| LGUI | LAlt | Lower| SpaceLW | RSEnter | Fn | Mouse| Menu | Ctrl |
* | Ctrl| LGUI | Lower| LAlt | SpaceLW | RSEnter | Fn | Mouse| Menu | Ctrl |
* `----------------------------------------------------------------------------------'
*/
[_COLEMAK] = TERMINUS_MINI(
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL , \
KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \
KC_LCTL, KC_LGUI, KC_LALT, LWR, SPC_LW, ENT_RS, FNC, MSE, KC_APP, KC_RCTL \
KC_LCTL, KC_LGUI, LWR, KC_LALT, SPC_LW, ENT_RS, FNC, MSE, KC_APP, KC_RCTL \
),
/* Lower
@@ -90,7 +90,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | LSPO | Z | X | C | V | = | 1 | 2 | 3 | Enter| | RSPC |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | LGUI | Alt | Lower| Space/Lower | 0 | . | Fn | Menu | Ctrl |
* | Ctrl | LGUI | Lower| LAlt | Space/Lower | 0 | . | Fn | Menu | Ctrl |
* `-----------------------------------------------------------------------------------'
Want to add tap-dance function to 0 key: Tap=0, doubleTap=Ent
*/
@@ -110,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | LSPO | | | { | [ | ` | \ | ] | } | . | ? | RSPC |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | LGUI | Alt | | Space/Lower | Raise/Enter | Fn | Mouse| Menu | Ctrl |
* | Ctrl | LGUI | | LAlt | Space/Lower | Raise/Enter | Fn | Mouse| Menu | Ctrl |
* `-----------------------------------------------------------------------------------'
*/
@@ -118,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MINS, KC_EQL, _______, \
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \
_______, XXXXXXX, XXXXXXX, KC_LCBR, KC_LBRC, KC_GRV, KC_BSLS, KC_RBRC, KC_RCBR, KC_DOT, KC_SLSH, _______, \
_______, _______, _______, _______, SPC_LW, ENT_RS, FNC, MSE, _______, _______ \
_______, _______, XXXXXXX, _______, SPC_LW, ENT_RS, FNC, MSE, _______, _______ \
),
/*Function
@@ -129,7 +129,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | LSOB | | | | | | | F9 | F10 | F11 | F12 |ScrLk |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | LGUI | Alt | | Space/Lower | Enter/Raise | Fn | | |PsBrk |
* | Ctrl | LGUI | | Alt | Space/Lower | Enter/Raise | Fn | | |PsBrk |
* `-----------------------------------------------------------------------------------'
*/

View File

@@ -6,117 +6,114 @@ This keymap is modified from the Planck default layout. Credit for the layout na
The terminus_mini is a handwired 4x12 ortholinear keyboard with two 2U thumb bar keys. The microcontroller is a Teensy 2.0
The TERMINUS_MINI layout (../../../terminus_mini/terminus_mini.h) is handwired and the 2U keys are handled using KC_NO to detail that two columns do not have a 4th column.
> .----------------------------------------. .-----------------------------------------. \
> | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Del | \
> |-----+------+------+------+------+------| |------+------+------+------+------+------| \
> | BS | A | R | S | T | D | | H | N | E | I | O | ' | \
> |-----+------+------+------+------+------| |------+------+------+------+------+------| \
> | LSPO| Z | X | C | V | B | | K | M | , | \. | / | RSPC | \
> |-----+------+------+------+------+------| |------+------+------+------+------+------| \
> | Ctrl| LGUI | LAlt | Lower| Space/Lower | | Enter/Raise | Fn | Mouse| Menu | Ctrl | \
> '----------------------------------------' '-----------------------------------------' \
\
> [_COLEMAK] = KEYMAP( \
> KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL , \
> KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
> KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \
> KC_LCTL, KC_LGUI, KC_LALT, LWR, SPC_LW, SPC_LW, ENT_RS, ENT_RS, FNC, MSE, KC_APP, KC_RCTL \
> ),
##Layers
The TERMINUS_MINI layout (../../../terminus\_mini/terminus\_mini.h) is handwired and the 2U keys are handled using KC\_NO to detail that two columns do not have a 4th column.
```
.----------------------------------------. .-----------------------------------------.
| Tab | Q | W | F | P | G | | J | L | U | Y | ; | Del |
|-----+------+------+------+------+------| |------+------+------+------+------+------|
| BS | A | R | S | T | D | | H | N | E | I | O | ' |
|-----+------+------+------+------+------| |------+------+------+------+------+------|
| LSPO| Z | X | C | V | B | | K | M | , | \. | / | RSPC |
|-----+------+------+------+------+------| |------+------+------+------+------+------|
| Ctrl| LGUI | LAlt | Lower| Space/Lower | | Enter/Raise | Fn | Mouse| Menu | Ctrl |
'----------------------------------------' '-----------------------------------------'
```
### Base Layer - Colemak
* The base layout is Colemak. Since the CapsLock key is replaced with BackSpace, this layout has the delete key in the traditional backspace location.
* QWERTY and Dvorak layers have been removed from the keymap that was initially developed from the default Planck keymap.
* I've implemented COLEMAK = SAFE_RANGE when enumerating the custom_keycodes, but I don't actually know what this does...
The base layout is Colemak. Since the CapsLock key is replaced with BackSpace, this layout has the delete key in the traditional backspace location.
* Space cadet is implemented in the shift keys (hold for shift, tap for respective parentheses)
* I never find myself using the right-modifiers on a standard keyboard, so I've only implemented LGUI and LALT. I have intentions of improving my use of the ctrl key in correct hand alternation, so CTRL is implemented in both outside corners of the home row.
* QWERTY and Dvorak layers have been removed from the keymap that was initially developed from the default Planck keymap.
* I've implemented COLEMAK = SAFE\_RANGE when enumerating the custom\_keycodes, but I don't actually know what this does...
* Space cadet is implemented in the shift keys (hold for shift, tap for respective parentheses)
* I never find myself using the right-modifiers on a standard keyboard, so I've only implemented LGUI and LALT. I have intentions of improving my use of the ctrl key in correct hand alternation, so CTRL is implemented in both outside corners of the home row.
#### Layer Shifting
* The 4th key on the bottom row of the left hand PCB is a **TAP_TOGGLE** macro for the *LOWER* layer
* The left 2U key is a **TAP_KEY** macro - Hold for momentary *LOWER* layer, Tap for Space.
* The right 2U key is a **TAP_KEY** macro - Hold for momentary *RAISE* layer, Tap for Enter
* The 2nd key on the bottom row of the right hand PCB is a **LAYER_MOMENTARY** for the *FUNCTION* layer
* The 3rd key on the bottom row of the right hand PCB is a **TAP_TOGGLE** macro for the *MOUSE* layer
#### Layer Shifting
* The 4th key on the bottom row of the left hand PCB is a **TAP_TOGGLE** macro for the *LOWER* layer
* The left 2U key is a **TAP_KEY** macro - Hold for momentary *LOWER* layer, Tap for Space.
* The right 2U key is a **TAP_KEY** macro - Hold for momentary *RAISE* layer, Tap for Enter
* The 2nd key on the bottom row of the right hand PCB is a **LAYER_MOMENTARY** for the *FUNCTION* layer
* The 3rd key on the bottom row of the right hand PCB is a **TAP_TOGGLE** macro for the *MOUSE* layer
### LOWER - Numpad & Navigation keys
,-----------------------------------------. .-----------------------------------------. \
| Tab | PgUp | Home | Up | End | | | 7 | 8 | 9 | \+ | | Del | \
|------+------+------+------+------+------| |------+------+------+------+------+------| \
| BS | PgDn | Left | Down |Right | | | 4 | 5 | 6 | Enter| | ' | \
|------+------+------+------+------+------| |------+------+------+------+------+------| \
| LSPO | Z | X | C | V | | | 1 | 2 | 3 | Enter| | RSPC | \
|------+------+------+------+-------------| |-------------+------+------+------+------| \
| Ctrl | LGUI | Alt | LOWER| Space/Lower | | 0 | \. | Fn | Menu | Ctrl | \
'-----------------------------------------' '-----------------------------------------' \
* The *LOWER* layer contains a navigation cluster on the left hand and a numpad on the right. This layer is momentary when the left thumb-bar or LOWER key is held and toggled on/off when the LOWER key is tapped.
```
,-----------------------------------------. .-----------------------------------------.
| Tab | PgUp | Home | Up | End | | | 7 | 8 | 9 | \+ | | Del |
|------+------+------+------+------+------| |------+------+------+------+------+------|
| BS | PgDn | Left | Down |Right | | | 4 | 5 | 6 | Enter| | ' |
|------+------+------+------+------+------| |------+------+------+------+------+------|
| LSPO | Z | X | C | V | | | 1 | 2 | 3 | Enter| | RSPC |
|------+------+------+------+-------------| |-------------+------+------+------+------|
| Ctrl | LGUI | Alt | LOWER| Space/Lower | | 0 | \. | Fn | Menu | Ctrl |
'-----------------------------------------' '-----------------------------------------'
```
The *LOWER* layer contains a navigation cluster on the left hand and a numpad on the right. This layer is momentary when the left thumb-bar or LOWER key is held and toggled on/off when the LOWER key is tapped.
* The Navigation cluster is offset to the right compared to the traditional **WASD** nav cluster. With this implementation, you don't need to move your hand from the home position when navigating. Page Up & Down keys are found on the far left of the cluster.
* The Navigation cluster is offset to the right compared to the traditional WASD nav cluster. With this implementation, you don't need to move your hand from the home position when navigating. Page Up & Down keys are found on the far left of the cluster.
* All unused (blank on the above keymap) keys are locked out using the XXXXXXX filler (KC\_NO), all modifiers (edge |\_| keys \[except 0, \. & Fn\] on the above keymap) and the ZXCV cluster are transparent (\_\_\_\_\_\_\_) to the Base layer.
* All unused (blank on the above keymap) keys are locked out using the XXXXXXX filler (KC_NO), all modifiers (edge |_| keys \[except 0, \. & Fn\] on the above keymap) and the ZXCV cluster are transparent (_______) to the Base layer.
[] TO DO!! - It would be nice to have a **TAP\_DANCE\_DOUBLE** implementation whereby a double tap of the right 2U key sends KC_PENT
- [] TO DO!! - It would be nice to have a **TAP_DANCE_DOUBLE** implementation whereby a double tap of the right 2U key sends KC_PENT
* Couldn't get this to work in Rev1, produced an error in the Make process.
* When this is done, I can remove the clunky double Enter on the 4th column of the right hand PCB.
* Couldn't get this to work in Rev1, produced an error in the Make process.
* When this is done, I can remove the clunky double Enter on the 4th column of the right hand PCB.
### RAISE - Symbol Layer
```
,-----------------------------------. .-----------------------------------.
| Tab | | | | | | | | | | | | \ |
|-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----|
| BS | ! | @ | # | $ | % | | ^ | & | * | - | + | ' |
|-----+-----+-----+-----+-----------| |-----+-----+-----+-----+-----+-----|
| LSPO| | | { | [ | ` | | | | ] | } | . | ? |RSPC |
|-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----|
| Ctrl|LGUI | |Lower|Space/Lower| |Enter/Raise| Fn |Mouse| Menu| Ctrl|
'-----------------------------------' '-----------------------------------'
```
The *RAISE* layer contains the symbols. This layer is momentary when the right thumb bar is held.
> ,-----------------------------------------. .-----------------------------------------. \
> | Esc | | | | | | | | | | | | Del | \
> |------+------+------+------+------+------| |------+------+------+------+------+------| \
> | BS | \! | @ | \# | $ | % | | ^ | & | \* | \- | \+ | ' | \
> |------+------+------+------+------+------| |------+------+------+------+------+------| \
> | LSBO | | | \{ | \[ | \` | | | | \] | \} | \. | ? | RSBC | \
> |------+------+------+------+------+------| |------+------+------+------+------+------| \
> | Ctrl | LGUI | Alt | | Space/Lower | | Enter/Raise | Fn | Mouse| Menu | Ctrl | \
> '-----------------------------------------' '-----------------------------------------' \
* The *RAISE* layer contains the symbols. This layer is momentary when the right thumb bar is held.
* Standard symbols can be found on the home row, in the traditional number row order as they occur on a standard keyboard.
* Shifted symbols can be found on the second-from bottom row, abovee the bars - these include brackets, braces, grave and pipe keys.
* At this stage, you need to shift to get to the Tilde key. I'd like to remove the shift requirement as I've done with the Pipe, but we'll see.
* The Terminus_Mini implements the symbols on the top row, with numbers implemented on the home row. Implementing a third set of number keys (Base, *LOWER*, *RAISE*) in this keymap is probably overkill, but the current *RAISE* layout replicates the standard number row, so I don't see reason to change it.
* The bottom row of this layer is a replication of that of the Base layer, except that the **TAP_TOGGLE** *LOWER* key is blocked with **XXXXXXX**.
* Standard symbols can be found on the home row, in the traditional number row order as they occur on a standard keyboard.
* Shifted symbols can be found on the second-from bottom row, abovee the bars - these include brackets, braces, grave and pipe keys.
* At this stage, you need to shift to get to the Tilde key. I'd like to remove the shift requirement as I've done with the Pipe, but we'll see.
* The Terminus_Mini implements the symbols on the top row, with numbers implemented on the home row. Implementing a third set of number keys (Base, *LOWER*, * RAISE*) in this keymap is probably overkill, but the current *RAISE* layout replicates the standard number row, so I don't see reason to change it.
* The bottom row of this layer is a replication of that of the Base layer, except that the **TAP_TOGGLE** *LOWER* key is blocked with XXXXXXX.
### FUNCTION - Function & Media keys
```
,-----------------------------------------. .-----------------------------------------.
| Esc | Mute | Vol- | Vol+ | | RESET| | POWER| | | | | Ins |
|------+------+------+------+------+------| |------+------+------+------+------+------|
| Caps | Stop | |<< | >/|| | >>| | | | | | | | |PrtSc |
|------+------+------+------+------+------| |------+------+------+------+------+------|
| LSOB | | | | | | | | | | | |ScrLk |
|------+------+------+------+------+------| |------+------+------+------+------+------|
| Ctrl | LGUI | Alt | | Space/Lower | | Enter/Raise | Fn | Mouse| |PsBrk |
'-----------------------------------------' '-----------------------------------------'
```
The *FUNCTION* layer contains media keys as well as the F-row. This layer is momentary and requires Fn to be held.
> ,-----------------------------------------. .-----------------------------------------. \
> | Esc | Mute | Vol- | Vol+ | | RESET| | POWER| | | | | Ins | \
> |------+------+------+------+------+------| |------+------+------+------+------+------| \
> | Caps | Stop | |<< | >/|| | >>| | | | | | | | |PrtSc | \
> |------+------+------+------+------+------| |------+------+------+------+------+------| \
> | LSOB | | | | | | | | | | | |ScrLk | \
> |------+------+------+------+------+------| |------+------+------+------+------+------| \
> | Ctrl | LGUI | Alt | | Space/Lower | | Enter/Raise | Fn | Mouse| |PsBrk | \
> '-----------------------------------------' '-----------------------------------------' \
* The *FUNCTION* layer contains media keys as well as the F-row. This layer is momentary and requires Fn to be held.
* The media cluster is based on the nav cluster in the *LOWER* layer, with RW, PP & FF in the Left, Down & Right positions.
* Mute, and Vol +/- are next to each other in ascending (L->R) volume order, Stop is below Mute.
* Insert, Print Screen, Scroll Lock & Pause Break are all implemented on the far right column.
I don't really use these keys so their position is not optimised.
* Caps lock is implemented on this layer, in the traditional position, in place of BackSpace on the Base layer.
* The RESET key will reset the Teensy for flashing and the Power key will initiate a shutdown of the PC. I've placed these in the far-reach index positions so that they are least likely to be pressed on accident. The power key is particularly dangerous, so I've placed it conciously on the right hand so that it becomes very awkward to activate with one hand (Fn needs to be held with the middle finger at the same time)
* The media cluster is based on the nav cluster in the *LOWER* layer, with RW, PP & FF in the Left, Down & Right positions.
* Mute, and Vol +/- are next to each other in ascending (L->R) volume order, Stop is below Mute.
* Insert, Print Screen, Scroll Lock & Pause Break are all implemented on the far right column. I don't really use these keys so their position is not optimised.
* Caps lock is implemented on this layer, in the traditional position, in place of BackSpace on the Base layer.
* The RESET key will reset the Teensy for flashing and the Power key will initiate a shutdown of the PC. I've placed these in the far-reach index positions so that they are least likely to be pressed on accident. The power key is particularly dangerous, so I've placed it conciously on the right hand so that it becomes very awkward to activate with one hand (Fn needs to be held with the middle finger at the same time)
### MOUSE - Mouse keys: The functionality of this layer is not as optimal as using a true mouse, generally slower but will work in a pinch.
> ,----------------------------------------. .----------------------------------------.
> | Tab | WhlU | WhlL | MsUp | WhlR | | | | M3 | M4 | M5 | | | \
> |------+------+------+------+------+-----| |-----+------+------+------+------+------| \
> | | WhlD | MsL | MsDn | MsR | | | |LClick|RClick| | | | \
> |------+------+------+------+------+-----| |-----+------+------+------+------+------| \
> | LSPO | | | | | | | | | | | | RSCB | \
> |------+------+------+------+------+-----| |-----+------+------+------+------+------| \
> | Ctrl | | | |Sensitivity | | Sensitivity| |MOUSE | | Ctrl | \
> '----------------------------------------' '----------------------------------------' \
```
,----------------------------------------. .----------------------------------------.
| Tab | WhlU | WhlL | MsUp | WhlR | | | | M3 | M4 | M5 | | |
|------+------+------+------+------+-----| |-----+------+------+------+------+------|
| | WhlD | MsL | MsDn | MsR | | | |LClick|RClick| | | |
|------+------+------+------+------+-----| |-----+------+------+------+------+------|
| LSPO | | | | | | | | | | | | RSCB |
|------+------+------+------+------+-----| |-----+------+------+------+------+------|
| Ctrl | | | |Sensitivity | | Sensitivity| |MOUSE | | Ctrl |
'----------------------------------------' '----------------------------------------'
```
The *MOUSE* layer contains keys replicating functions found on the mouse.
* The *MOUSE* layer contains keys replicating functions found on the mouse.
* The navigation cluster (Up, Down, Left, Right) is a replication of the Navigation cluster on the *LOWER* layer. The scroll keys are nalagous to the Page Up & Down keys.
*) The primary click (right & left) buttons are on the right home row (index & middle fingers)
* Secondary click buttons are above the standard keys (M3/Wheel click, M4, M5) but I do not use this function.
* The navigation cluster (Up, Down, Left, Right) is a replication of the Navigation cluster on the *LOWER* layer. The scroll keys are nalagous to the Page Up & Down
keys.
*) The primary click (right & left) buttons are on the right home row (index & middle fingers)
* Secondary click buttons are above the standard keys (M3/Wheel click, M4, M5) but I do not use this function.

View File

@@ -53,6 +53,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
#define CATERINA_BOOTLOADER
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5

View File

@@ -23,7 +23,7 @@
#define TAPPING_TERM 200
#endif // TAP_DANCE_ENABLE
#define CATERINA_BOOTLOADER
#ifdef RGBLIGHT_ENABLE

Some files were not shown because too many files have changed in this diff Show More