296 Commits

Author SHA1 Message Date
Josh Klar
0d168a06f4 attempt to merge sofubi/static-type-checking, albeit incompletely 2021-09-27 15:22:23 -07:00
Josh Klar
b8fd60e866 Merge pull request #249 from atsuyuki/master
Fix LT() doesn't work
2021-09-27 05:13:58 +00:00
atsuyuki
8167e0bc72 Fix LT() doesn't work
Fixed a problem where layer switching was not working in LT().
2021-09-27 13:47:07 +09:00
Josh Klar
e5d7333e2e Merge pull request #238 from kbjunky/master
added ADNS9800 and mouse keys/mouse buttons/mouse wheel support
2021-09-25 22:21:16 +00:00
Josh Klar
0a2f62a90b Merge pull request #247 from xs5871/fix-tapdance
fix tapdancing
2021-09-25 22:14:48 +00:00
Josh Klar
8650a6ea7c Merge pull request #246 from honboubao/hold-tap
Improve hold tap (MT, LT, TT) behaviour
2021-09-25 22:13:23 +00:00
Christian Tu
199ec1d914 fix last merge 2021-09-25 11:20:45 +02:00
Christian Tu
abaafbd8c5 Merge remote-tracking branch 'upstream/master' into hold-tap 2021-09-25 11:13:41 +02:00
Christian Tu
99577357f6 move HoldTap to its own file 2021-09-25 11:07:33 +02:00
Christian Tu
209acc94b2 TT toggles layer state on key hold 2021-09-25 10:54:45 +02:00
Christian Tu
4e938ef6b6 use const values instead of magic strings 2021-09-25 10:48:43 +02:00
xs5871
8a15378733 fix tapdancing 2021-09-24 13:33:03 +00:00
kbjunky
1a5e7fa54b adns9800_firmware.py removed
Cleaned up firmware file
Additional info in docs about missing firmware file and how to proceed without it.
2021-09-21 15:09:56 +08:00
Josh Klar
9c46eaeb9c Merge pull request #240 from honboubao/ble-name
add ble_name option to KMKKeyboard.go method
2021-09-20 23:31:11 +00:00
Josh Klar
7b1d3f17c4 Merge pull request #242 from honboubao/key-memory
reduce Key objects memory footprint
2021-09-20 23:29:38 +00:00
Josh Klar
8199854b5e Merge pull request #232 from KMKfw/topic-supervisor-ticks
Convert to supervisor ticks
2021-09-20 23:28:12 +00:00
Josh Klar
3bc038d0d8 Merge pull request #243 from honboubao/release-previously-pressed-key
always release the same key as was pressed
2021-09-20 23:25:54 +00:00
Christian Tu
0a61cbd4af change ModTap to allow for activating mod on hold, rolling key presses and fix stuck mod 2021-09-19 16:21:42 +02:00
Christian Tu
5cd34bcfea _on_matrix_changed to set key state variable 2021-09-19 04:24:37 +02:00
Kyle Brown
a894d8d140 fix sleep 2021-09-17 10:55:29 -07:00
Christian Tu
113e8eb867 fix doc typos and switched description for keycodes NUBS and NUHS 2021-09-17 08:54:22 -07:00
Kyle Brown
0e528435a3 resolved issues 2021-09-17 08:40:20 -07:00
Christian Tu
f36a18513b remember pressed keys and release the same keys when the physical switch is opened, even if the layer has changed between key down and key up and a different key is now active for that matrix position 2021-09-17 16:16:59 +02:00
Christian Tu
3ad2a00dc9 initialize event handler lists in Key objects only when needed to reduce memory footprint 2021-09-17 16:14:51 +02:00
Christian Tu
3c9c527a96 add ble_name option to KMKKeyboard.go method 2021-09-17 16:14:11 +02:00
kbjunky
731f1b1030 Moved firmware to an external file 2021-09-17 15:31:40 +08:00
Josh Klar
27cf8e7d4d Merge pull request #239 from athul/master
chore: Minor Fixes to Encoder Docs
2021-09-16 20:18:27 +00:00
kbjunky
1ba8ea3728 Fixed formatting, unused import 2021-09-16 19:54:37 +08:00
Athul Cyriac Ajay
e821acfca1 chore: Minor Fixes to Encoder Docs
- Updated code to add an import and close a list element
- Add Link to Keyboard main.py
- Minor Additions to Docs and Typo fixes
2021-09-16 17:18:31 +05:30
kbjunky
3d6e4fde41 added ADNS9800 and mouse keys/mouse buttons/mouse wheel support
ADNS9800 - module for interfacing with ADNS9800 optical sensor
mouse_keys - module for using mouse buttons, mouse wheel as well as moving mouse cursor with keyboard keys
2021-09-15 20:14:12 +08:00
Kyle Brown
584eee64c6 Convert to supervisor ticks 2021-09-14 07:56:38 -07:00
Josh Klar
ea9625106c chore: remove long-broken and unused-ish Deploy stage from CI 2021-09-13 21:37:37 -07:00
Josh Klar
b287b2112c Merge pull request #234 from Gigahawk/clearer_diode_orientations
Add QMK equivalent attributes of DiodeOrientation
2021-09-14 03:47:30 +00:00
Jasper Chan
7601a6f21f Add QMK equivalent attributes of DiodeOrientation 2021-09-13 20:34:49 -07:00
Josh Klar
d3b315d059 Merge pull request #233 from Gigahawk/fix_send_string
Fix send_string (#206)
2021-09-14 03:09:47 +00:00
Jasper Chan
88e3fe45d4 Fix send_string (#206) 2021-09-13 19:54:08 -07:00
Josh Klar
09e26ae3a3 Merge pull request #231 from KMKfw/topic-fix-slash
add / to key names
2021-09-13 19:59:09 +00:00
Kyle Brown
e77a0af23c add / to key names 2021-09-12 11:16:53 -07:00
AndersonTorres
02a9a088a0 Small fixups 2021-08-30 11:16:55 -07:00
AndersonTorres
aa55153a8e ptBR translations: docs/ptBR/power.md 2021-08-30 11:16:55 -07:00
AndersonTorres
7991dc4609 ptBR translations: docs/ptBR/media_keys.md 2021-08-30 11:16:55 -07:00
AndersonTorres
dbe6e105e2 ptBR translations: docs/ptBR/led.md 2021-08-30 11:16:55 -07:00
AndersonTorres
c9184477fb ptBR translations: docs/ptBR/ble_hid.md 2021-08-30 11:16:55 -07:00
AndersonTorres
25015e54ca ptBR translations: docs/ptBR/flashing.md 2021-08-30 11:16:55 -07:00
AndersonTorres
8ee368cfe4 ptBR translations: docs/ptBR/international.md 2021-08-30 11:16:55 -07:00
AndersonTorres
2e75a89581 ptBR translations: docs/ptBR/modtap.md 2021-08-30 11:16:55 -07:00
AndersonTorres
137df5a46c ptBR translations: docs/ptBR/encoder.md 2021-08-30 11:16:55 -07:00
AndersonTorres
9a2918d85c ptBR translations: docs/ptBR/split_keyboards.md 2021-08-30 11:16:55 -07:00
AndersonTorres
bd31af0e14 ptBR translations: docs/ptBR/layers.md 2021-08-30 11:16:55 -07:00
AndersonTorres
c62b2e94f7 ptBR translations: docs/ptBR/tapdance.md 2021-08-30 11:16:55 -07:00
AndersonTorres
c023f368ba ptBR translations: docs/ptBR/sequences.md 2021-08-30 11:16:55 -07:00
AndersonTorres
8d16cac06d ptBR translations: docs/ptBR/config_and_keymap.md 2021-08-30 11:16:55 -07:00
AndersonTorres
b11fce321f ptBR translations: docs/ptBR/keys.md 2021-08-30 11:16:55 -07:00
AndersonTorres
d21aa772a7 ptBR translations: docs/ptBR/rgb.md 2021-08-30 11:16:55 -07:00
AndersonTorres
9ad8233104 ptBR translations: docs/ptBR/modules.md 2021-08-30 11:16:55 -07:00
AndersonTorres
2b59ed7aec ptBR translations: docs/ptBR/handwiring.md 2021-08-30 11:16:55 -07:00
AndersonTorres
2c6ec8c5da ptBR translations: docs/ptBR/extensions.md 2021-08-30 11:16:55 -07:00
AndersonTorres
ceb9f69a38 ptBR translations: docs/ptBR/porting_to_kmk.md 2021-08-30 11:16:55 -07:00
AndersonTorres
46206dabbf ptBR translations: docs/ptBR/keycodes.md 2021-08-30 11:16:55 -07:00
AndersonTorres
73b8542665 ptBR translations: docs/ptBR/debugging.md 2021-08-30 11:16:55 -07:00
AndersonTorres
fd097c3924 ptBR translations: docs/ptBR/support.md 2021-08-30 11:16:55 -07:00
sofubi
b202dc77d1 Reformat type hints to use comment style syntax
Update Pipfile to add typing module and pyright
Update pyproject.toml for pyright and mypy configs
2021-08-27 00:33:28 -04:00
Athul Cyriac Ajay
586d1deb4e chore: Fix URL and added a space for cleaner look 2021-08-23 23:06:04 -07:00
AndersonTorres
796b7733f5 ptBR translation: docs/ptBR/kmkpython_vs_circuitpython.md 2021-08-19 15:44:53 -07:00
AndersonTorres
9eb86d2069 ptBR translation: docs/ptBR/Officially_Supported_Microcontrollers.md 2021-08-19 15:44:53 -07:00
AndersonTorres
a08ed5dc25 ptBR translation: docs/ptBR/Getting_Started.md 2021-08-19 15:44:53 -07:00
sofubi
9fc431e0a7 Final first pass of keys.py 2021-08-18 21:47:17 -04:00
sofubi
36ea0eec4e Works towars typing keys.py 2021-08-18 20:39:18 -04:00
sofubi
908da846fe Fix make test errors 2021-08-16 10:33:05 +00:00
Josh Klar
7e477e1aa8 Merge pull request #225 from KMKfw/badges
Added badges
2021-08-16 05:48:22 +00:00
sofubi
a622239b4a Fix isort and formatting 2021-08-16 00:18:35 +00:00
sofubi
8cb2a8b485 Type annotate kmk_keyboard.py
Update refs from KeyAttrDict to Key in encoder.py
Update types.py for validity
Complete typing of key_validators.py
2021-08-16 00:15:09 +00:00
sofubi
75f9d10cc7 Add types to validators, time, types
Update pyproject.toml to ignore boards, user_keymaps for mypy
Update pyproject.toml to reduce loud mypy reporting
2021-08-15 21:23:02 +00:00
sofubi
2c69d0e197 Start work on types
Bring in typings folder for adafruit_ble and micropython
2021-08-13 23:10:43 -04:00
Kyle Brown
3be9f9b9ad Formatting 2021-08-13 19:48:38 -07:00
Kyle Brown
e0786e6118 Added badges 2021-08-13 18:11:51 -07:00
sofubi
95dcc57e76 Finish type annotations for modules folder
Update pyproject.toml
2021-08-13 16:00:57 -04:00
razel
9340579031 Translated Getting_Started.md to Japanese. 2021-08-13 07:15:48 -07:00
sofubi
317d14fdac Add typing to encoder.py 2021-08-12 12:15:38 -04:00
sofubi
41a8048775 Adds mypy and circuitpython-typing to Pipefile
Updates Pipfile.lock
Updates pyproject.toml with some initial pyright configuration
2021-08-12 12:13:29 -04:00
FHA
d43c712301 Requested updates before push into main
1. Space before "If you're wondering"
2. Replaced "with certain boards ... pico" by "with most boards"
2021-07-29 11:53:38 -07:00
FHA
c75b52f94b Update keycodes.md
Precision on KC.APPLICATION position on the keyboard
2021-07-29 11:53:38 -07:00
FHA
3525a5f1a5 Update keycodes.md
typo  : interNATIOnal
2021-07-29 11:53:38 -07:00
FHA
10a1447adc Update keycodes.md
Added international (ISO) keys as defined in the code
2021-07-29 11:53:38 -07:00
FHA
24a4a4da11 Proofread & typos 2021-07-29 11:53:38 -07:00
FHA
9aaebbcf54 typos 2021-07-29 11:53:38 -07:00
FHA
081590f85d Update Getting_Started.md
Added direct references to various existing doc pages
2021-07-29 11:53:38 -07:00
FHA
2db4682264 Update Getting_Started.md
Name of the main file updated (code.py or main.py)
2021-07-29 11:53:38 -07:00
FHA
f256c49727 Rename kmk_vs_circuitpython.md to kmkpython_vs_circuitpython.md 2021-07-29 11:53:38 -07:00
FHA
0247de4988 Update Getting_Started.md 2021-07-29 11:53:38 -07:00
FHA
4139c97b22 clarify the diff between KMK and KMKPython 2021-07-29 11:53:38 -07:00
FHA
917afe5f57 Create kmk_vs_circuitpython.md
Move KMK vs CircuitPython from main guide to dedicated page
2021-07-29 11:53:38 -07:00
FHA
9e731bce1e Update Getting_Started.md
various precisions
2021-07-29 11:53:38 -07:00
FHA
3f10abc6fd Update Getting_Started.md
Review structure. Provide TLDR example as a quickstart
2021-07-29 11:53:38 -07:00
Kyle Brown
4eba21a2fd typo 2021-07-19 21:37:51 -07:00
pullenrc
15918db7ac Encoder module! (#211)
* added atreus62 board

* Uploaded module for encoder support

* Update README.md


Co-authored-by: Ryan Pullen <rpullen@martinuav.com>
2021-07-19 08:30:28 -07:00
Josh Klar
eb5756f530 Merge pull request #214 from KMKfw/josh/topic-corne-2040-plus-plus
Fix many broken keys
2021-07-12 18:19:02 +00:00
Kyle Brown
cd3e10ba13 unbreak kdb corne 2021-07-09 11:21:00 -07:00
Josh Klar
083e4a701a fix(keys): fix shifted keys bug, make lazy key defs more readable 2021-07-09 11:21:00 -07:00
Josh Klar
ab6aa1838c chore: whatever it just took to get my PM2040 to boot 2021-07-09 11:21:00 -07:00
Kyle Brown
270be1fa28 initial support for RP2040 Pro Micro corne 2021-07-09 11:21:00 -07:00
enbyautumn
76e7ee4027 Rename Offiially_Supported_Microcontrollers.md to Officially_Supported_Microcontrollers.md 2021-07-09 09:50:41 -07:00
Kyle Brown
7310bdd780 add shorthand for KC_NO 2021-07-07 12:53:17 -07:00
Kyle Brown
a77fee7f04 Add shifted keynames to register unshifted versions 2021-07-07 12:53:17 -07:00
Josh Klar
e208dd64f3 docs: update/refresh README
Resolves #212
2021-07-06 12:53:34 -07:00
Josh Klar
7a30cc8cce Merge pull request #207 from KMKfw/topic-merge-keyboard-and-state-rebased
The Declaration of Independence (from the original, tricky implementation of KMK)
2021-06-25 11:46:45 -07:00
Kyle Brown
1a348f1539 docs and typos 2021-06-25 10:53:58 -07:00
Josh Klar
f79e508566 fix(lint): lint all the things; be more flexible in boards dir 2021-06-20 13:59:59 -07:00
Josh Klar
7400f43cf8 chore: track klardotsh iris nn keymap 2021-06-20 13:55:18 -07:00
Josh Klar
ece6441230 fix(layouts): re-enable thumb cluster on nicenano->iris_r2 2021-06-20 13:55:18 -07:00
Josh Klar
eb41d704b0 fix(split): do not attempt to send HID from slave sides of split boards, resolves infinite hang after single UART send 2021-06-20 13:55:18 -07:00
Josh Klar
aeee945728 fix(keys): force gc collection in keys setup to reduce memory fragmentation, probably at cost of performance 2021-06-20 13:55:18 -07:00
Josh Klar
6f8eb425b1 fix: allow userspace setting of Split.debug_enabled 2021-06-20 13:55:18 -07:00
Gigahawk
6d5b99d78d Dynamically create core key definitions as required (#200)
* Dynamically allocate keys as required

* Restore comments

* Run linter

* Move key definitions into a dict

* Revert "Move key definitions into a dict"

This reverts commit 49ac7c2e40.
2021-06-20 13:55:18 -07:00
Josh Klar
66788c29ca fix(split): now able to send a single keydown, but nothing else, from secondary parts of split boards 2021-06-20 13:55:18 -07:00
Kyle Brown
33408dc228 Lily58 works. Wired splits still don't 2021-06-20 13:55:18 -07:00
Kyle Brown
581d8e269b update kmkpython and hack fix bug 2021-06-20 13:55:18 -07:00
Josh Klar
9b5e35a5a8 feat(kmkpy): make dist -> uf2 files for each supported NRF board, with KMK bundled 2021-06-20 13:55:18 -07:00
Josh Klar
ee7094e799 fix(irisr2): get out of SOFT_SERIAL_PIN's way 2021-06-20 13:55:18 -07:00
Kyle Brown
e72d2b8c34 feat(extensions): most of the extensions implementation, by kdb424 2021-06-20 13:55:16 -07:00
Josh Klar
9821f7bcc3 Initial attempt to merge internal_state with kmk_keyboard. Seems to work on Plank so far 2021-06-20 13:53:39 -07:00
Josh Klar
ea327f8f76 Merge pull request #208 from KMKfw/josh/fix-the-damn-ci
The CI Error Rate Is Too Damn High (and this meme is ancient)
2021-06-20 13:50:36 -07:00
Josh Klar
54f4644b5c fix(lint): fix all outstanding linter errors 2021-06-20 13:14:53 -07:00
Josh Klar
3797797b43 fix(ci): bump flake8 to get fix for PyCQA/pyflakes#367; per-file-ignore ext is now redundant; linter back online in CI 2021-06-20 13:14:41 -07:00
Josh Klar
6bfd5682f9 Merge pull request #199 from DonutCables/donutdev
Update docs/rgb.md for config clarity
2021-05-16 14:54:24 -07:00
DonutCables
f1bce8fdbd Update docs/rgb.md for config clarity 2021-05-16 00:49:24 -04:00
Josh Klar
01daa7a07e fix: resolve #197, remove broken Matrix links and instead duplicate README blurb 2021-05-02 20:17:03 -07:00
Josh Klar
bf551a6de0 Merge pull request #195 from KMKfw/dependabot/pip/pygments-2.7.4
Bump pygments from 2.4.2 to 2.7.4
2021-03-29 12:26:52 -07:00
dependabot[bot]
2d74fe7cb3 Bump pygments from 2.4.2 to 2.7.4
Bumps [pygments](https://github.com/pygments/pygments) from 2.4.2 to 2.7.4.
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.4.2...2.7.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-29 18:16:04 +00:00
Josh Klar
b8cb4bda98 Merge pull request #183 from dzervas/fix_deploy_action
Fix deploy action
2020-11-10 22:55:52 -08:00
Dimitris Zervas
8bb7c1f555 Remove s3cfg and use secrets as env vars 2020-10-17 00:29:10 +03:00
Dimitris Zervas
4afac426f0 Add the s3cfg secret 2020-10-17 00:05:28 +03:00
Dimitris Zervas
4c06d8b626 Invalid syntax in deploy.yml 2020-10-16 23:56:04 +03:00
Kyle Brown
015e0cdfd7 linter fix 2020-10-15 15:42:12 -07:00
Josh Klar
1b730cacf3 Merge pull request #180 from KMKfw/topic-rgb-animation
update RGB for more modern cpy versions
2020-10-14 22:07:30 -07:00
Josh Klar
dc598ad439 Merge pull request #167 from dzervas/ble_multimple_conns
BLE Multiple Connections
2020-10-14 22:04:29 -07:00
Josh Klar
ec16270006 Merge pull request #181 from KMKfw/josh/fix-everyones-linting
fix: everyone's linting; loosen one linter rule on user keymaps
2020-10-14 21:59:32 -07:00
Josh Klar
1016dc552c fix: everyone's linting; loosen one linter rule on user keymaps 2020-10-14 21:54:18 -07:00
Josh Klar
5f4785f0ad Merge pull request #164 from dzervas/master
Move CI to Github Actions
2020-10-14 21:17:21 -07:00
Kyle Brown
6ed5d04af5 Corrected a replace issue in the docs 2020-10-13 11:07:08 -07:00
Kyle Brown
80d95816e4 Switch to initiator/target 2020-10-13 11:07:08 -07:00
Kyle Brown
1a4e81a2e5 Remove GC. Not needed on newer Cpy versions 2020-10-13 10:58:18 -07:00
Kyle Brown
6e10babfbe update RGB for more modern cpy versions 2020-10-09 22:43:37 -07:00
Kyle Brown
026308bbeb layout change 2020-10-09 22:17:20 -07:00
Kyle Brown
945fcca7b0 kdb424 corne keymap added 2020-10-01 13:29:34 -07:00
Dimitris Zervas
f3067099b2 Update the docs for the new connection selection keys 2020-10-01 23:02:05 +03:00
Dimitris Zervas
a6d36d57a7 Add multimple connection support 2020-10-01 23:02:05 +03:00
Dimitris Zervas
7bd2bdb35f Fix lab68 keymap 2020-10-01 23:02:05 +03:00
Dimitris Zervas
69f7c3c8c2 Remove some code from BLE 2020-10-01 23:02:05 +03:00
Dimitris Zervas
7f1514e8de Remove .circleci 2020-10-01 23:01:08 +03:00
Dimitris Zervas
173ae842ca Create deploy.yml 2020-10-01 23:01:08 +03:00
Dimitris Zervas
c4d057685b Create test.yml 2020-10-01 23:01:08 +03:00
Kyle Brown
29373e9a37 delay imports 2020-10-01 12:53:05 -07:00
Kyle Brown
e225d8b1d6 Allows continuation of firmware if bluetooth can't be imported 2020-10-01 12:53:05 -07:00
Kyle Brown
fba97fc364 UART does in fact work 2020-10-01 12:41:18 -07:00
Kyle Brown
73b7464ec1 initial corne support on the nicenano 2020-10-01 12:41:18 -07:00
Kyle Brown
b65a94972c layout update 2020-09-30 12:31:26 -07:00
Dimitris Zervas
d79a2c943c Update the docs for the new clear bond key 2020-09-29 19:35:49 -07:00
Dimitris Zervas
2cf64d8ce7 [ble] Add support to clear all current bondings 2020-09-29 19:35:49 -07:00
Dimitris Zervas
e5700eeb5f [ble] Add support to change ble name from KMKKeyboard.go 2020-09-29 09:35:00 -07:00
Kyle Brown
18eeb4eadc remove prints 2020-09-13 18:44:18 -07:00
Kyle Brown
6844654d39 Clearly a copy paste error 2020-09-13 18:44:18 -07:00
Dimitris Zervas
4d46653526 Fix formatting and make lab68 bluetooth 2020-09-13 18:20:58 -07:00
Dimitris Zervas
b082f26d9e Fix typos in lab68 and add compatibility for MCP to matrix 2020-09-13 18:20:58 -07:00
Dimitris Zervas
ac9f4927c9 Add lab68 keymap 2020-09-13 18:20:58 -07:00
Josh Klar
81c6b0ca5d Merge pull request #159 from KMKfw/rgb-small-cleanup
small docs add for rgb
2020-07-13 15:04:28 -07:00
Kyle Brown
d47665df50 small docs add for rgb 2020-07-12 19:07:17 -07:00
Josh Klar
ee83a32e87 Merge pull request #154 from ekx/topic-ble
Basic BLE functionality
2020-07-07 20:40:22 -07:00
Josh Klar
5096bb7e30 chore: formatting 2020-07-07 20:35:11 -07:00
Benjamin Dengler
2197dab6fa Moved BLE functionality to its own module 2020-07-07 20:35:11 -07:00
Benjamin Dengler
1bd84e49aa Added basic BLE implementation using Adafruit libs 2020-07-07 20:35:11 -07:00
Josh Klar
9fc4159c9a Merge pull request #155 from KMKfw/topic-layout-update
layout update
2020-07-07 20:00:32 -07:00
Kyle Brown
2244c95db6 layout update 2020-06-30 15:04:33 -07:00
Josh Klar
b1c180ce78 docs: KMK Matrix moved to klar.sh homeserver 2020-03-29 21:48:23 -07:00
Josh Klar
afd924c8c4 Merge pull request #153 from KMKfw/topic-layout-change
layout changes
2020-02-10 13:07:15 -08:00
Kyle Brown
7c81e01505 layout changes 2020-01-11 14:20:29 -08:00
Josh Klar
bec742bbf5 Merge pull request #147 from KMKfw/klardotsh-patch-1
Goodbye, CLA!
2019-10-13 21:12:39 -07:00
Josh Klar
5ef37864de Goodbye, CLA!
It's not particularly useful - we haven't run into any weirdness around contributions and it's a hurdle to contributing that shouldn't need to be there.
2019-10-08 11:14:03 -07:00
Josh Klar
80004bb65f Merge pull request #142 from elvis-epx/altmatrix
Apply matrix_scanner attribute instead of fixed class
2019-08-20 15:50:09 -07:00
Elvis Pfützenreuter
ed452084fe Apply matrix_scanner attribute instead of fixed class 2019-08-06 19:17:01 -03:00
Josh Klar
0ed40d3cef Merge pull request #140 from KMKfw/topic-keys19-round2
cKeys Prep: Round 2 - Cleanup SO MUCH STUFF
2019-07-26 11:25:40 -07:00
Josh Klar
666c0a4f08 Rename KeyboardConfig to KMKKeyboard - prepping for later merge with InternalState 2019-07-25 01:30:55 -07:00
Josh Klar
b03ae32e7d straggling docs update 2019-07-25 01:20:14 -07:00
Josh Klar
5da4555669 Fix isort ordering 2019-07-25 01:06:09 -07:00
Josh Klar
6baaf5e5d4 Continue to shuffle and burn stuff
- Remove the concept of "mcus". With only one target platform
(CircuitPython), it no longer makes a bunch of sense and has been kept
around for "what if" reasons, complicating our import chains and eating
up RAM for pointless subclasses. If you're a `board`, you derive from
`KeyboardConfig`. If you're a handwire, the user will derive from
`KeyboardConfig`. The end. As part of this, `kmk.hid` was refactored
heavily to emphasize that CircuitPython is our only supported HID stack,
with stubs for future HID implementations (`USB_HID` becomes
`AbstractHID`, probably only usable for testing purposes,
`CircuitPython_USB_HID` becomes `USBHID`, and `BLEHID` is added with an
immediate `NotImplementedError` on instantiation)

- `KeyboardConfig` can now take a HID type at runtime. The NRF52840
boards will happily run in either configuration once CircuitPython
support is in place, and a completely separate `mcu` subclass for each
mode made no sense. This also potentially allows runtime *swaps* of HID
driver down the line, but no code has been added to this effect. The
default, and only functional value, for this is `HIDModes.USB`

- Most consts have been moved to more logical homes - often, the main
or, often only, component that uses them. `DiodeOrientation` moved to
`kmk.matrix`, and anything HID-related moved to `kmk.hid`
2019-07-25 00:58:23 -07:00
Josh Klar
eb566b0f71 Remove two classes that havent been used in almost a year 2019-07-25 00:35:08 -07:00
Josh Klar
8c57844a22 Remove a ton of leftover MicroPython code and abstractions, including all of kmk.pins 2019-07-25 00:32:20 -07:00
Josh Klar
86c8e006e0 Remove ancient, no-way-this-is-working-right-now test leftovers 2019-07-25 00:10:49 -07:00
Josh Klar
17ba405bcc Don't try to lint dist/compiled files 2019-07-25 00:05:29 -07:00
Josh Klar
45cadc7e5a CircuitPython-provided modules should be considered stdlib-equiv by isort terms. Apply this new rule. 2019-07-25 00:04:06 -07:00
Josh Klar
11a4604f88 Move our preload hacks out of keyboard_config into their own module. Isolate the ugliness 2019-07-25 00:03:35 -07:00
Josh Klar
38e8102532 Remove kmk.util by moving reboot/bootloader to their only use location 2019-07-24 23:45:50 -07:00
Josh Klar
02401e2ec0 Move kmk.util.get_wide_ordinal to kmk.handlers.sequences 2019-07-24 23:44:26 -07:00
Josh Klar
1eaf0e2c79 flatten_dict is no longer used, remove it 2019-07-24 23:43:39 -07:00
Josh Klar
ef1c69aa2c Fix linting; move kmk.util.intify_coordinate to kmk.matrix.intify_coordinate (trying to deprecate/remove util) 2019-07-24 23:43:00 -07:00
Josh Klar
4bdf926360 boot.py is still required - ensure it ends up in our dists and is documented 2019-07-24 23:28:13 -07:00
Josh Klar
6b73a5ec56 Update keymap/keyboardconfig docs 2019-07-24 23:19:45 -07:00
Josh Klar
5a43bc291d Merge pull request #139 from KMKfw/topic-try-black
Enforce the Black autoformatter and code style
2019-07-24 23:19:28 -07:00
Josh Klar
64267bdc5b fix a totally unrelated bug 2019-07-24 23:15:57 -07:00
Josh Klar
aaeaa74a0c Run black against source tree 2019-07-24 23:03:13 -07:00
Josh Klar
5c0c13e8d0 Prepare for Black autoformatting: dependencies, string staging, single-quote string override 2019-07-24 23:03:13 -07:00
Josh Klar
8100b91dbc Merge pull request #138 from KMKfw/topic-prep-for-ckeys2019
Prep for ckeys2019: Round One
2019-07-24 21:57:32 -07:00
Josh Klar
614883ef80 More docs updates 2019-07-24 21:25:10 -07:00
Josh Klar
7197f7a3a4 fill out features list 2019-07-24 21:25:10 -07:00
Josh Klar
5771a89433 for now just always point at master 2019-07-24 21:25:10 -07:00
Josh Klar
55b07f330c more docs, actually allow public access to release zips 2019-07-24 21:25:10 -07:00
Josh Klar
39220beddb tag releases within the dists as well (for debugging, mostly) 2019-07-24 21:25:10 -07:00
Josh Klar
39e3a65955 Full deployment workflow: push finished assets to DigitalOcean Spaces (cdn.kmkfw.io) 2019-07-24 21:25:10 -07:00
Josh Klar
cd7d8a2e4c Ability to build release zips in CI 2019-07-24 21:25:10 -07:00
Josh Klar
8f5511327e Makefile can compile KMK to MPY files 2019-07-24 21:25:10 -07:00
Josh Klar
ffe3fa3c64 Get MPY cross compiler into the Docker image 2019-07-24 21:25:10 -07:00
Josh Klar
a51d11f6e6 A wild W504 linter error appeared! Fix those. 2019-07-24 21:25:10 -07:00
Josh Klar
5c8bd45615 fix dockerfile 2019-07-24 21:25:10 -07:00
Josh Klar
d0d1608350 fixup for keyboard_config 2019-07-24 21:25:10 -07:00
Josh Klar
ea62d08d2c Let's try alpine for Circle images 2019-07-24 21:25:10 -07:00
Josh Klar
1e9625ae0e Rename "Firmware" to "KeyboardConfig" for clarity in main.py and to illustrate separation of KeyboardConfig/InternalState 2019-07-24 21:25:10 -07:00
Josh Klar
e8c3b5ac70 The CircuitPython "MCU" (misnomer now?) is generic anyway - name it as such 2019-07-24 21:25:10 -07:00
Josh Klar
b3e9a14e71 README accuracy 2019-07-24 21:25:10 -07:00
Josh Klar
3b6286b480 We no longer support STM32 anyway, remove these leftover udev rules 2019-07-24 21:25:10 -07:00
Josh Klar
3a1ce093ee Update local Python dev deps 2019-07-24 21:25:10 -07:00
Josh Klar
6f3273a6f8 README stub - needs finishing
refs #126
2019-07-24 21:25:10 -07:00
Kyle Brown
fc51f84045 Make this clearer 2019-07-17 22:11:31 -07:00
Kyle Brown
241cf69979 Small touch ups to correct errors, and update to modern information 2019-07-17 16:17:52 -07:00
Josh Klar
ef09454d2e chore: fix ryan board to pass linting 2019-07-17 16:05:40 -07:00
Josh Klar
d15aa65cc6 Kyle built a Gherkin handwire on Feather nrf52840! Unclean but works 2019-07-17 16:05:40 -07:00
rk463345
056efa8ca5 Added rk463345 keymap 2019-07-17 16:05:40 -07:00
Kyle Brown
004f40e7d2 Unbreak the fix 2019-07-17 16:05:40 -07:00
Kyle Brown
b6af43ef90 rgb animations perf 2019-07-17 16:05:40 -07:00
Josh Klar
c11984135a looks like this is not needed, so save some bootup time 2019-07-17 16:05:40 -07:00
Josh Klar
76087749fb Download more RAM (reword this in a rebase plz) 2019-07-17 16:05:40 -07:00
Kyle Brown
d07560513f Fixed crash on debug when no Rgb was used, and unloaded LED and RGB when not used to save ram 2019-07-17 16:05:40 -07:00
Josh Klar
d34e8ce9d2 Re-add LED support
This reverts commit 5b069a0104.
2019-07-17 16:05:40 -07:00
Josh Klar
f6a39acd26 Merge pull request #133 from KMKfw/topic-misc-perf
Slight perf improvements, heavily improved logging/debugging output
2019-07-12 17:01:26 -07:00
Josh Klar
350c2438ad Disable GC on every cycle, too much lag 2019-07-12 16:54:38 -07:00
Josh Klar
17094a2988 Clean some code up; force GC on every cycle 2019-07-12 16:38:50 -07:00
Josh Klar
2947f81489 Remove pointless reversed_active_layers/active_layers difference 2019-07-12 15:31:27 -07:00
Josh Klar
1fe80fec92 Clean up and standardize print() debug stuff 2019-07-12 15:16:33 -07:00
Josh Klar
edcb681169 Merge pull request #132 from KMKfw/revert-115-topic-led
Revert "Monocolor LED backlight added"
2019-07-07 15:41:53 -07:00
Josh Klar
5b069a0104 Revert "Monocolor LED backlight added" 2019-07-07 15:35:15 -07:00
Josh Klar
7bff667a2b Merge pull request #115 from KMKfw/topic-led
Monocolor LED backlight added
2019-06-26 04:07:43 -07:00
Kyle Brown
c16e2c51aa addressing PR feedback 2019-06-24 17:09:52 -07:00
Kyle Brown
5532ffdcbf Ready for merging 2019-06-21 17:28:30 -07:00
Kyle Brown
39b0b1e7f2 final commit before rebase 2019-06-21 16:51:01 -07:00
Kyle Brown
5158094549 Small changes 2019-06-21 16:49:00 -07:00
Kyle Brown
3f8c6e7648 Added support for user animations with docs 2019-06-21 16:49:00 -07:00
Kyle Brown
9d8682c866 Config changes and uses consts to save ram 2019-06-21 16:49:00 -07:00
Kyle Brown
86b8c4ffb0 New animation 2019-06-21 16:49:00 -07:00
Kyle Brown
bb198709f2 fix incorrect merge 2019-06-21 16:48:59 -07:00
Kyle Brown
fa28b3afba Luddite "fixes" for personal layout. Exposes a KMK limitation 2019-06-21 16:47:44 -07:00
Kyle Brown
efb642c374 Fix some issues if you don't define some things 2019-06-21 16:47:44 -07:00
Kyle Brown
1a06e0ed72 Renamed some things and added luddite layout for kdb424 and default 2019-06-21 16:47:44 -07:00
Kyle Brown
7ebf8d623f Fix toggle 2019-06-21 16:47:44 -07:00
Kyle Brown
ec1a62e52d Added static standby mode for performance. 2019-06-21 16:47:44 -07:00
Kyle Brown
0a06e733d2 Solved. Added uart buffer on the master to free up the uart bus buffer 2019-06-21 16:47:43 -07:00
Kyle Brown
e2413a3c25 Still dirty, but moved the problem to a better place. Still unrealistic to hit 2019-06-21 16:47:00 -07:00
Kyle Brown
a882ef2c38 Quick patch unrealistic face roll keyboard corruption 2019-06-21 16:47:00 -07:00
Kyle Brown
373ca8355e Added MANY boards to supported list, and organized supported boards 2019-06-21 16:47:00 -07:00
Kyle Brown
54d63037bf Added board definition for nyquist and add RGB and LED pins for nyquest and iris 2019-06-21 16:46:59 -07:00
Kyle Brown
f7a1d54752 Added LED support, cleaned up RGB docs 2019-06-21 16:45:04 -07:00
Kyle Brown
7ebfaa3bf7 cleaned up docs even more. I believe this fills all requirements for merge. 2019-06-21 16:44:03 -07:00
Kyle Brown
f65ea1e841 Added 2 more keys, stripped unused cruft, and added more docs. 2019-06-21 16:44:03 -07:00
Kyle Brown
5c8c2e97fd Resolved many things 2019-06-21 16:44:02 -07:00
Kyle Brown
3ae7432de0 Massive docs update 2019-06-21 16:42:53 -07:00
Kyle Brown
9fbad17ed4 code cleanup to pass lint and some for flake8 2019-06-21 16:42:12 -07:00
Kyle Brown
1751cce299 code cleanup to pass lint and some for flake8 2019-06-21 16:41:58 -07:00
Kyle Brown
ad3430eeb6 Needs docs, but code is ready for review probably 2019-06-21 16:38:41 -07:00
Kyle Brown
5334e7e0be Massive hsv math fix and configs can be passed now for most things 2019-06-21 16:38:41 -07:00
Kyle Brown
2ad1fe8a9c Massively improved, still not complete. Much easier to use now 2019-06-21 16:38:41 -07:00
Kyle Brown
31983a0873 Breathing now finally working, a key to enable it, not sane defaults, and a toggle button 2019-06-21 16:38:39 -07:00
Kyle Brown
0ba5911f8f More animations, now based on time and intervals. Massively WIP 2019-06-21 16:37:53 -07:00
Kyle Brown
7a58ac041f HSV functions added 2019-06-21 16:37:53 -07:00
Kyle Brown
4b033857b1 Initial RGB with test animation running automatically 2019-06-21 16:37:51 -07:00
Josh Klar
e332804dc9 Merge pull request #131 from elvis-epx/kcapp
Add KC_APP ("Win menu") key
2019-05-30 20:38:38 -07:00
Elvis Pfutzenreuter
dabed0061d Add KC_APP ("Win menu") key 2019-05-31 00:36:42 -03:00
Josh Klar
fa0421c5b9 Merge pull request #129 from elvis-epx/epx87
Make matrix scanner class configurable
2019-05-20 15:55:06 -07:00
Josh Klar
c3ffb7b1ac Merge branch 'master' into epx87 2019-05-20 15:54:10 -07:00
Josh Klar
9bb82d009c Merge pull request #128 from KMKfw/topic-flattened-matrix
Resolves #121: Use flattened keymaps, which can visually represent the logical layout, rather than the physical wiring
2019-05-20 15:53:05 -07:00
Elvis Pfützenreuter
41dc58e428 Make matrix scanner class configurable 2019-05-17 20:30:42 -03:00
Josh Klar
0b364cf7f1 Resolves #121: Use flattened keymaps, which can visually represent the logical layout, rather than the physical wiring 2019-05-12 17:47:16 -07:00
Josh Klar
d70c2ccc17 Merge pull request #127 from KMKfw/topic-cpy4-rc2-compat
Compatibility with CircuitPython 4.0.0-rc2
2019-05-12 16:08:51 -07:00
Josh Klar
7fcd36f2fb Refs #104: Keyboard can work without REPL connected on >=4.0.0-alpha3 (tested only against single-piece boards so far) 2019-05-12 14:14:59 -07:00
Josh Klar
cf5ee5d4b2 Resolves an OverflowError in matrix scans (board-breaking) 2019-05-12 13:19:44 -07:00
Josh Klar
7297bc4521 update gitignore 2019-05-12 13:19:24 -07:00
Josh Klar
85ba57f9b0 Merge pull request #120 from KMKfw/topic-backspace-delete
Adds delete/backspace key. Resolves #93
2019-05-10 13:05:12 -07:00
Josh Klar
9dce78370e Merge branch 'master' into topic-backspace-delete 2019-05-10 13:03:52 -07:00
Josh Klar
f073b7568b Merge pull request #125 from elvis-epx/master
Fix bug in TO layer key handling and add new API
2019-05-10 13:02:12 -07:00
Elvis Pfützenreuter
f9b56d82f7 Add cancel_timeout method
This method is useful when the keymap needs to use
state.set_timeout() and this timeout needs to be
cancellable.

Also, the set_timeout() now returns a timer handle.
2019-04-26 19:50:41 -03:00
Elvis Pfützenreuter
9c4a136989 Use return value of pre-press/pre-release callbacks
When the return value evaluates to False, the key press or key
release is ignored. This allows for implementation of elaborate
keyboard behaviors.
2019-04-26 19:50:41 -03:00
Elvis Pfützenreuter
b494857f21 Fix bug in TO layer key handling 2019-04-25 22:40:29 -03:00
Kyle Brown
0016ac8aa3 Merge branch 'master' into topic-backspace-delete 2019-03-21 17:25:16 -07:00
Kyle Brown
8bb55c84cd Literally hurting performance now. Needs removed 2019-03-21 17:24:50 -07:00
Kyle Brown
7e06b143e1 Merge branch 'master' into topic-backspace-delete 2019-03-12 00:25:05 -07:00
Kyle Brown
298f9489c2 Duh, chaining.... 2019-03-12 00:24:48 -07:00
Kyle Brown
a2cfa92f2f Missed some obvious things 2019-03-12 00:24:48 -07:00
Kyle Brown
e792524b63 Added mod tap with docs 2019-03-12 00:24:48 -07:00
Kyle Brown
fc8ddba6cb Adds delete/backspace key. Resolves #93 2019-03-09 15:12:23 -08:00
198 changed files with 11322 additions and 3106 deletions

View File

@@ -1,28 +0,0 @@
version: 2
jobs:
test:
docker:
- image: 'kmkfw/base'
environment:
KMK_TEST: 1
PIPENV_VENV_IN_PROJECT: 1
steps:
- checkout
- restore_cache:
keys:
- v2-kmk-venv-{{ checksum "Pipfile.lock" }}
- run: make test
workflows:
version: 2
build-deploy:
jobs:
- test:
filters:
branches:
only: /.*/
tags:
only: /.*/

16
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
# This is a basic workflow to help you get started with Actions
name: Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.9' # Version range or exact version of a Python version to use, using SemVer's version range syntax
- run: python -m pip install --upgrade pipenv wheel
- run: make test

12
.gitignore vendored
View File

@@ -102,6 +102,7 @@ venv.bak/
# mypy
.mypy_cache/
.compiled/
.ampy
.submodules
@@ -115,3 +116,14 @@ venv.bak/
# Personal dev scripts
.scripts
# Mountpoints
mnt/
mnt2/
# build artifacts
kmk/release_info.py
kmk/release_info.mpy
*.mpy
.vscode
.dist

81
.s3cfg Normal file
View File

@@ -0,0 +1,81 @@
[default]
access_key =
access_token =
add_encoding_exts =
add_headers =
bucket_location = US
ca_certs_file =
cache_file =
check_ssl_certificate = True
check_ssl_hostname = True
cloudfront_host = cloudfront.amazonaws.com
content_disposition =
content_type =
default_mime_type = binary/octet-stream
delay_updates = False
delete_after = False
delete_after_fetch = False
delete_removed = False
dry_run = False
enable_multipart = True
encoding = UTF-8
encrypt = False
expiry_date =
expiry_days =
expiry_prefix =
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase =
guess_mime_type = True
host_base = sfo2.digitaloceanspaces.com
host_bucket = %(bucket)s.sfo2.digitaloceanspaces.com
human_readable_sizes = False
invalidate_default_index_on_cf = False
invalidate_default_index_root_on_cf = True
invalidate_on_cf = False
kms_key =
limit = -1
limitrate = 0
list_md5 = False
log_target_prefix =
long_listing = False
max_delete = -1
mime_type =
multipart_chunk_size_mb = 15
multipart_max_chunks = 10000
preserve_attrs = True
progress_meter = True
proxy_host =
proxy_port = 0
put_continue = False
recursive = False
recv_chunk = 65536
reduced_redundancy = False
requester_pays = False
restore_days = 1
restore_priority = Standard
secret_key =
send_chunk = 65536
server_side_encryption = False
signature_v2 = False
signurl_use_https = False
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 300
stats = False
stop_on_error = False
storage_class =
throttle_max = 100
upload_id =
urlencoding_mode = normal
use_http_expect = False
use_https = True
use_mime_magic = True
verbosity = WARNING
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
website_error =
website_index = index.html

39
Dockerfile Normal file
View File

@@ -0,0 +1,39 @@
FROM python:3.9-slim-buster
ARG KMKPY_REF
ARG KMKPY_URL
ENV KMKPY_REF ${KMKPY_REF}
ENV KMKPY_URL ${KMKPY_URL}
RUN mkdir -p /app /dist
WORKDIR /app
RUN apt-get update && apt-get install -y build-essential curl gettext git git-lfs rsync wget zip lbzip2
RUN pip install pipenv
# Pull CircuitPython-designated ARM GCC to avoid mismatches/weird
# inconsistencies with upstream
RUN curl -L -o /tmp/gcc-arm.tar.bz2 https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2 && \
tar -C /usr --strip-components=1 -xaf /tmp/gcc-arm.tar.bz2 && \
rm -rf /tmp/gcc-arm.tar.bz2
# Get a local copy of KMKPython and its dependencies. We don't provide MPY
# builds for kmkpython anymore, so we can get away with being opinionated
# here.
RUN git init /opt/kmkpython && \
git -C /opt/kmkpython remote add origin ${KMKPY_URL} && \
git -C /opt/kmkpython fetch --depth 1 origin ${KMKPY_REF} && \
git -C /opt/kmkpython checkout FETCH_HEAD && \
git -C /opt/kmkpython submodule update --init --recursive
# Build the MPY compiler
RUN make -C /opt/kmkpython/mpy-cross
ENV PATH=/opt/kmkpython/mpy-cross:${PATH}
RUN mkdir -p /opt/kmkpython/frozen/kmk/kmk
COPY ./build_kmkpython_release.sh /app/
COPY ./kmk /opt/kmkpython/frozen/kmk/kmk
CMD /app/build_kmkpython_release.sh

View File

@@ -1,21 +0,0 @@
# vim: ft=dockerfile
# Not using python:3.7 here because team-gcc-arm-embedded/ppa does not support
# Ubuntu Cosmic or Debian Stretch, and Alpine, bizarrely, does not seem to
# package GCC cross compilers
FROM ubuntu:bionic
# Set up PPAs we'll need for Python and for GCC ARM
RUN apt-get update && apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN add-apt-repository ppa:team-gcc-arm-embedded/ppa
# Install Python
RUN apt-get update && apt-get install -y python3.7 python3.7-dev build-essential pkg-config libffi-dev curl
RUN curl https://bootstrap.pypa.io/get-pip.py | python3.7
# Downgrade pip to work around https://github.com/pypa/pipenv/issues/2924
RUN python3.7 -m pip install pip==18.0
RUN python3.7 -m pip install pipenv==2018.7.1
# Install KMK CI and/or build-time dependencies
RUN apt-get install -y gcc-arm-embedded gettext ssh wget unzip rsync git locales libusb-dev

View File

@@ -1,54 +1,87 @@
.SILENT:
.PHONY: \
clean-dist \
devdeps \
dist \
dockerbase \
lint
.DEFAULT: all
DIST_DESCRIBE_CMD = git describe --always --abbrev=0 --dirty --broken
DOCKER_BASE_TAG ?= latest
DOCKER_TAG ?= latest
AMPY_PORT ?= /dev/ttyUSB0
AMPY_BAUD ?= 115200
AMPY_DELAY ?= 1.5
ARDUINO ?= /usr/share/arduino
PIPENV ?= $(shell which pipenv)
PIPENV ?= $(shell which pipenv 2>/dev/null)
all: copy-kmk copy-bootpy copy-keymap
MPY_CROSS ?= $(shell which mpy-cross 2>/dev/null)
MPY_FLAGS ?= '-O2'
MPY_SOURCES = 'kmk/'
MPY_TARGET_DIR ?= .compiled
PY_KMK_TREE = $(shell find $(MPY_SOURCES) -name "*.py")
DIST_DESCRIBE = $(shell $(DIST_DESCRIBE_CMD))
.docker_base: Dockerfile_base
@echo "===> Building Docker base image kmkfw/base:${DOCKER_BASE_TAG}"
@docker build -f Dockerfile_base -t kmkfw/base:${DOCKER_BASE_TAG} .
@touch .docker_base
TIMESTAMP := $(shell date +%s)
docker-base: .docker_base
all: copy-kmk copy-bootpy copy-keymap copy-board
docker-base-deploy: docker-base
@echo "===> Pushing Docker base image kmkfw/base:${DOCKER_BASE_TAG} to Docker Hub"
@docker push kmkfw/base:${DOCKER_BASE_TAG}
compile: $(MPY_TARGET_DIR)/.mpy.compiled
$(MPY_TARGET_DIR)/.mpy.compiled: $(PY_KMK_TREE)
ifeq ($(MPY_CROSS),)
@echo "===> Could not find mpy-cross in PATH, exiting"
@false
endif
@echo "===> Compiling all py files to mpy with flags $(MPY_FLAGS)"
@mkdir -p $(MPY_TARGET_DIR)
@echo "KMK_RELEASE = '$(DIST_DESCRIBE)'" > $(MPY_SOURCES)/release_info.py
@find $(MPY_SOURCES) -name "*.py" -exec sh -c 'mkdir -p $(MPY_TARGET_DIR)/$$(dirname {}) && mpy-cross $(MPY_FLAGS) {} -o $(MPY_TARGET_DIR)/$$(dirname {})/$$(basename -s .py {}).mpy' \;
@rm -rf $(MPY_SOURCES)/release_info.py
@touch $(MPY_TARGET_DIR)/.mpy.compiled
.devdeps: Pipfile.lock
@echo "===> Installing dependencies with pipenv"
@$(PIPENV) install --dev --ignore-pipfile
@$(PIPENV) sync --dev
@touch .devdeps
devdeps: .devdeps
dist: clean-dist dockerbase
@mkdir -p .dist
@docker run --rm -it -v $$(pwd)/.dist:/dist kmkpy:$(TIMESTAMP)
dockerbase:
docker build . \
-t kmkpy:$(TIMESTAMP) \
--build-arg KMKPY_URL=$$(cut -f1 < kmkpython_ref.tsv) \
--build-arg KMKPY_REF=$$(cut -f2 < kmkpython_ref.tsv)
lint: devdeps
@$(PIPENV) run flake8
fix-formatting: devdeps
@$(PIPENV) run black .
fix-isort: devdeps
@find kmk/ tests/ user_keymaps/ -name "*.py" | xargs $(PIPENV) run isort
@find kmk/ user_keymaps/ boards/ -name "*.py" | xargs $(PIPENV) run isort
clean: clean-build-log
clean: clean-dist
@echo "===> Cleaning build artifacts"
@rm -rf .devdeps build
@rm -rf .devdeps build dist $(MPY_TARGET_DIR)
clean-build-log:
@echo "===> Clearing previous .build.log"
@rm -rf .build.log
clean-dist:
@echo "===> Cleaning KMKPython dists"
@rm -rf .dist
# This is mostly a leftover from the days we vendored stuff from
# micropython-lib via submodules. Leaving this here mostly in case someone goes
# exploring through the history of KMK's repo and manages to screw up their
# repo state (those were glitchy times...)
powerwash: clean
@echo "===> Removing vendor/ to force a re-pull"
@rm -rf vendor
@@ -78,6 +111,12 @@ copy-kmk:
echo "**** MOUNTPOINT must be defined (wherever your CIRCUITPY drive is mounted) ****" && exit 1
endif
copy-board: $(MOUNTPOINT)/kb.py
$(MOUNTPOINT)/kb.py: $(BOARD)
@echo "===> Copying your board to kb.py"
@rsync -rh $(BOARD) $@
@sync
ifdef MOUNTPOINT
$(MOUNTPOINT)/kmk/boot.py: boot.py
@echo "===> Copying required boot.py"
@@ -105,4 +144,9 @@ copy-keymap: $(MOUNTPOINT)/main.py
else
copy-keymap:
echo "**** MOUNTPOINT must be defined (wherever your CIRCUITPY drive is mounted) ****" && exit 1
ifdef BOARD
copy-board: $(MOUNTPOINT)/kb.py
endif # BOARD
endif # MOUNTPOINT

26
Pipfile
View File

@@ -4,19 +4,23 @@ verify_ssl = true
name = "pypi"
[packages]
pydux = "*"
[dev-packages]
adafruit-ampy = "*"
"flake8" = "*"
"flake8-comprehensions" = "*"
ipython = "*"
ipdb = "*"
"flake8" = ">=3.9.0"
"flake8-commas" = "*"
isort = "*"
"flake8-comprehensions" = "*"
"flake8-isort" = "*"
"python-magic" = "*"
adafruit-ampy = "*"
ipdb = "*"
ipython = "*"
isort = "*"
neovim = "*"
"flake8-per-file-ignores" = "*"
[requires]
python_version = "3.7"
s3cmd = "*"
black = "==21.6b0"
flake8-quotes = "*"
flake8-black = "*"
circuitpython-stubs = "==7.0.0a6.dev195"
pyright = "*"
typing = "*"
mypy = "*"

555
Pipfile.lock generated
View File

@@ -1,12 +1,10 @@
{
"_meta": {
"hash": {
"sha256": "96625b372d35c7f5ed0fd3289ba61afd0bcc034ddad31feb958a107e2751fb0a"
"sha256": "cee0eeba8c8dad66dccffe0935656829132f7ca928569e3aa957f278e6e92da6"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.7"
},
"requires": {},
"sources": [
{
"name": "pypi",
@@ -15,52 +13,76 @@
}
]
},
"default": {
"pydux": {
"hashes": [
"sha256:5cb9217be9d8c7ff79b028f6f02597bbb055b107ce8eecbe5f631f3fc76d793f",
"sha256:bed123b5255d566f792b9ceebad87e3f9c1d2d85abed4b9a9475ffc831035879"
],
"index": "pypi",
"version": "==0.2.2"
}
},
"default": {},
"develop": {
"adafruit-ampy": {
"hashes": [
"sha256:1055827874010f48c7dbd3cde4b1d7c6f6732661fad193b188a398e88961fc62"
"sha256:4a74812226e53c17d01eb828633424bc4f4fe76b9499a7b35eba6fc2532635b7",
"sha256:f4cba36f564096f2aafd173f7fbabb845365cc3bb3f41c37541edf98b58d3976"
],
"index": "pypi",
"version": "==1.0.5"
"version": "==1.1.0"
},
"appdirs": {
"hashes": [
"sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41",
"sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"
],
"version": "==1.4.4"
},
"backcall": {
"hashes": [
"sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4",
"sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"
"sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e",
"sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"
],
"version": "==0.1.0"
"version": "==0.2.0"
},
"black": {
"hashes": [
"sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04",
"sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"
],
"index": "pypi",
"version": "==21.6b0"
},
"circuitpython-stubs": {
"hashes": [
"sha256:5963ef6b41b03e97049d48142cb23778f3e4ca841620296d7e13b00025522569"
],
"index": "pypi",
"version": "==7.0.0a6.dev195"
},
"click": {
"hashes": [
"sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d",
"sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b"
"sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a",
"sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"
],
"version": "==6.7"
"markers": "python_version >= '3.6'",
"version": "==8.0.1"
},
"decorator": {
"hashes": [
"sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82",
"sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c"
"sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323",
"sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"
],
"version": "==4.3.0"
"markers": "python_version >= '3.5'",
"version": "==5.0.9"
},
"flake8": {
"hashes": [
"sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0",
"sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37"
"sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b",
"sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"
],
"index": "pypi",
"version": "==3.5.0"
"version": "==3.9.2"
},
"flake8-black": {
"hashes": [
"sha256:c199844bc1b559d91195ebe8620216f21ed67f2cc1ff6884294c91a0d2492684",
"sha256:cc080ba5b3773b69ba102b6617a00cc4ecbad8914109690cfda4d565ea435d96"
],
"index": "pypi",
"version": "==0.2.3"
},
"flake8-commas": {
"hashes": [
@@ -72,66 +94,97 @@
},
"flake8-comprehensions": {
"hashes": [
"sha256:b83891fec0e680b07aa1fd92e53eb6993be29a0f3673a09badbe8da307c445e0",
"sha256:e4ccf1627f75f192eb7fde640f5edb81c98d04b1390df9d4145ffd7710bb1ef2"
"sha256:4888de89248b7f7535159189ff693c77f8354f6d37a02619fa28c9921a913aa0",
"sha256:e9a010b99aa90c05790d45281ad9953df44a4a08a1a8f6cd41f98b4fc6a268a0"
],
"index": "pypi",
"version": "==1.4.1"
"version": "==3.6.1"
},
"flake8-isort": {
"hashes": [
"sha256:298d7904ac3a46274edf4ce66fd7e272c2a60c34c3cc999dea000608d64e5e6e",
"sha256:5992850626ce96547b1f1c7e8a7f0ef49ab2be44eca2177934566437b636fa3c"
"sha256:2b91300f4f1926b396c2c90185844eb1a3d5ec39ea6138832d119da0a208f4d9",
"sha256:729cd6ef9ba3659512dee337687c05d79c78e1215fdf921ed67e5fe46cce2f3c"
],
"index": "pypi",
"version": "==2.5"
"version": "==4.0.0"
},
"flake8-per-file-ignores": {
"flake8-quotes": {
"hashes": [
"sha256:3c4b1d770fa509aaad997ca147bd3533b730c3f6c48290b69a4265072c465522",
"sha256:4ee4f24cbea5e18e1fefdfccb043e819caf483d16d08e39cb6df5d18b0407275"
"sha256:f1dd87830ed77ff2ce47fc0ee0fd87ae20e8f045355354ffbf4dcaa18d528217"
],
"index": "pypi",
"version": "==0.6"
"version": "==3.3.0"
},
"greenlet": {
"hashes": [
"sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0",
"sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28",
"sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8",
"sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304",
"sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0",
"sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214",
"sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043",
"sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6",
"sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625",
"sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc",
"sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638",
"sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163",
"sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4",
"sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490",
"sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248",
"sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939",
"sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87",
"sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720",
"sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656"
"sha256:04e1849c88aa56584d4a0a6e36af5ec7cc37993fdc1fda72b56aa1394a92ded3",
"sha256:05e72db813c28906cdc59bd0da7c325d9b82aa0b0543014059c34c8c4ad20e16",
"sha256:07e6d88242e09b399682b39f8dfa1e7e6eca66b305de1ff74ed9eb1a7d8e539c",
"sha256:090126004c8ab9cd0787e2acf63d79e80ab41a18f57d6448225bbfcba475034f",
"sha256:1796f2c283faab2b71c67e9b9aefb3f201fdfbee5cb55001f5ffce9125f63a45",
"sha256:2f89d74b4f423e756a018832cd7a0a571e0a31b9ca59323b77ce5f15a437629b",
"sha256:34e6675167a238bede724ee60fe0550709e95adaff6a36bcc97006c365290384",
"sha256:3e594015a2349ec6dcceda9aca29da8dc89e85b56825b7d1f138a3f6bb79dd4c",
"sha256:3f8fc59bc5d64fa41f58b0029794f474223693fd00016b29f4e176b3ee2cfd9f",
"sha256:3fc6a447735749d651d8919da49aab03c434a300e9f0af1c886d560405840fd1",
"sha256:40abb7fec4f6294225d2b5464bb6d9552050ded14a7516588d6f010e7e366dcc",
"sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68",
"sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142",
"sha256:4870b018ca685ff573edd56b93f00a122f279640732bb52ce3a62b73ee5c4a92",
"sha256:4adaf53ace289ced90797d92d767d37e7cdc29f13bd3830c3f0a561277a4ae83",
"sha256:4eae94de9924bbb4d24960185363e614b1b62ff797c23dc3c8a7c75bbb8d187e",
"sha256:5317701c7ce167205c0569c10abc4bd01c7f4cf93f642c39f2ce975fa9b78a3c",
"sha256:5c3b735ccf8fc8048664ee415f8af5a3a018cc92010a0d7195395059b4b39b7d",
"sha256:5cde7ee190196cbdc078511f4df0be367af85636b84d8be32230f4871b960687",
"sha256:655ab836324a473d4cd8cf231a2d6f283ed71ed77037679da554e38e606a7117",
"sha256:6ce9d0784c3c79f3e5c5c9c9517bbb6c7e8aa12372a5ea95197b8a99402aa0e6",
"sha256:6e0696525500bc8aa12eae654095d2260db4dc95d5c35af2b486eae1bf914ccd",
"sha256:75ff270fd05125dce3303e9216ccddc541a9e072d4fc764a9276d44dee87242b",
"sha256:8039f5fe8030c43cd1732d9a234fdcbf4916fcc32e21745ca62e75023e4d4649",
"sha256:84488516639c3c5e5c0e52f311fff94ebc45b56788c2a3bfe9cf8e75670f4de3",
"sha256:84782c80a433d87530ae3f4b9ed58d4a57317d9918dfcc6a59115fa2d8731f2c",
"sha256:8ddb38fb6ad96c2ef7468ff73ba5c6876b63b664eebb2c919c224261ae5e8378",
"sha256:98b491976ed656be9445b79bc57ed21decf08a01aaaf5fdabf07c98c108111f6",
"sha256:990e0f5e64bcbc6bdbd03774ecb72496224d13b664aa03afd1f9b171a3269272",
"sha256:9b02e6039eafd75e029d8c58b7b1f3e450ca563ef1fe21c7e3e40b9936c8d03e",
"sha256:a11b6199a0b9dc868990456a2667167d0ba096c5224f6258e452bfbe5a9742c5",
"sha256:a414f8e14aa7bacfe1578f17c11d977e637d25383b6210587c29210af995ef04",
"sha256:a91ee268f059583176c2c8b012a9fce7e49ca6b333a12bbc2dd01fc1a9783885",
"sha256:ac991947ca6533ada4ce7095f0e28fe25d5b2f3266ad5b983ed4201e61596acf",
"sha256:b050dbb96216db273b56f0e5960959c2b4cb679fe1e58a0c3906fa0a60c00662",
"sha256:b97a807437b81f90f85022a9dcfd527deea38368a3979ccb49d93c9198b2c722",
"sha256:bad269e442f1b7ffa3fa8820b3c3aa66f02a9f9455b5ba2db5a6f9eea96f56de",
"sha256:bf3725d79b1ceb19e83fb1aed44095518c0fcff88fba06a76c0891cfd1f36837",
"sha256:c0f22774cd8294078bdf7392ac73cf00bfa1e5e0ed644bd064fdabc5f2a2f481",
"sha256:c1862f9f1031b1dee3ff00f1027fcd098ffc82120f43041fe67804b464bbd8a7",
"sha256:c8d4ed48eed7414ccb2aaaecbc733ed2a84c299714eae3f0f48db085342d5629",
"sha256:cf31e894dabb077a35bbe6963285d4515a387ff657bd25b0530c7168e48f167f",
"sha256:d15cb6f8706678dc47fb4e4f8b339937b04eda48a0af1cca95f180db552e7663",
"sha256:dfcb5a4056e161307d103bc013478892cfd919f1262c2bb8703220adcb986362",
"sha256:e02780da03f84a671bb4205c5968c120f18df081236d7b5462b380fd4f0b497b",
"sha256:e2002a59453858c7f3404690ae80f10c924a39f45f6095f18a985a1234c37334",
"sha256:e22a82d2b416d9227a500c6860cf13e74060cf10e7daf6695cbf4e6a94e0eee4",
"sha256:e41f72f225192d5d4df81dad2974a8943b0f2d664a2a5cfccdf5a01506f5523c",
"sha256:f253dad38605486a4590f9368ecbace95865fea0f2b66615d121ac91fd1a1563",
"sha256:fddfb31aa2ac550b938d952bca8a87f1db0f8dc930ffa14ce05b5c08d27e7fd1"
],
"version": "==0.4.15"
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==1.1.1"
},
"ipdb": {
"hashes": [
"sha256:7081c65ed7bfe7737f83fa4213ca8afd9617b42ff6b3f1daf9a3419839a2a00a"
"sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"
],
"index": "pypi",
"version": "==0.11"
"version": "==0.13.9"
},
"ipython": {
"hashes": [
"sha256:007dcd929c14631f83daff35df0147ea51d1af420da303fd078343878bd5fb62",
"sha256:b0f2ef9eada4a68ef63ee10b6dde4f35c840035c50fd24265f8052c98947d5a4"
"sha256:0cff04bb042800129348701f7bd68a430a844e8fb193979c08f6c99f28bb735e",
"sha256:892743b65c21ed72b806a3a602cca408520b3200b89d1924f4b3d2cdb3692362"
],
"index": "pypi",
"version": "==6.5.0"
"version": "==7.26.0"
},
"ipython-genutils": {
"hashes": [
@@ -142,19 +195,27 @@
},
"isort": {
"hashes": [
"sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af",
"sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8",
"sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497"
"sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899",
"sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"
],
"index": "pypi",
"version": "==4.3.4"
"version": "==5.9.3"
},
"jedi": {
"hashes": [
"sha256:b409ed0f6913a701ed474a614a3bb46e6953639033e31f769ca7581da5bd1ec1",
"sha256:c254b135fb39ad76e78d4d8f92765ebc9bf92cbc76f49e97ade1d5f5121e1f6f"
"sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93",
"sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"
],
"version": "==0.12.1"
"markers": "python_version >= '3.6'",
"version": "==0.18.0"
},
"matplotlib-inline": {
"hashes": [
"sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811",
"sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"
],
"markers": "python_version >= '3.5'",
"version": "==0.1.2"
},
"mccabe": {
"hashes": [
@@ -165,150 +226,308 @@
},
"msgpack": {
"hashes": [
"sha256:0b3b1773d2693c70598585a34ca2715873ba899565f0a7c9a1545baef7e7fbdc",
"sha256:0bae5d1538c5c6a75642f75a1781f3ac2275d744a92af1a453c150da3446138b",
"sha256:0ee8c8c85aa651be3aa0cd005b5931769eaa658c948ce79428766f1bd46ae2c3",
"sha256:1369f9edba9500c7a6489b70fdfac773e925342f4531f1e3d4c20ac3173b1ae0",
"sha256:22d9c929d1d539f37da3d1b0e16270fa9d46107beab8c0d4d2bddffffe895cee",
"sha256:2ff43e3247a1e11d544017bb26f580a68306cec7a6257d8818893c1fda665f42",
"sha256:31a98047355d34d047fcdb55b09cb19f633cf214c705a765bd745456c142130c",
"sha256:8767eb0032732c3a0da92cbec5ac186ef89a3258c6edca09161472ca0206c45f",
"sha256:8acc8910218555044e23826980b950e96685dc48124a290c86f6f41a296ea172",
"sha256:ab189a6365be1860a5ecf8159c248f12d33f79ea799ae9695fa6a29896dcf1d4",
"sha256:cfd6535feb0f1cf1c7cdb25773e965cc9f92928244a8c3ef6f8f8a8e1f7ae5c4",
"sha256:e274cd4480d8c76ec467a85a9c6635bbf2258f0649040560382ab58cabb44bcf",
"sha256:f86642d60dca13e93260187d56c2bef2487aa4d574a669e8ceefcf9f4c26fd00",
"sha256:f8a57cbda46a94ed0db55b73e6ab0c15e78b4ede8690fa491a0e55128d552bb0",
"sha256:fcea97a352416afcbccd7af9625159d80704a25c519c251c734527329bb20d0e"
"sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9",
"sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841",
"sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439",
"sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694",
"sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a",
"sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f",
"sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e",
"sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1",
"sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c",
"sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b",
"sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759",
"sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326",
"sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc",
"sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192",
"sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83",
"sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06",
"sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e",
"sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9",
"sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33",
"sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54",
"sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f",
"sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887",
"sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009",
"sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2",
"sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c",
"sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87",
"sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984",
"sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"
],
"version": "==0.5.6"
"version": "==1.0.2"
},
"mypy": {
"hashes": [
"sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9",
"sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a",
"sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9",
"sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e",
"sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2",
"sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212",
"sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b",
"sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885",
"sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150",
"sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703",
"sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072",
"sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457",
"sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e",
"sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0",
"sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb",
"sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97",
"sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8",
"sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811",
"sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6",
"sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de",
"sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504",
"sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921",
"sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"
],
"index": "pypi",
"version": "==0.910"
},
"mypy-extensions": {
"hashes": [
"sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
"sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
],
"version": "==0.4.3"
},
"neovim": {
"hashes": [
"sha256:6ce58a742e0427491c0e1c8108556ee72ba33844209bd9e226b8da9538299276"
"sha256:a6a0e7a5b4433bf4e6ddcbc5c5ff44170be7d84259d002b8e8d8fb4ee78af60f"
],
"index": "pypi",
"version": "==0.2.6"
},
"parso": {
"hashes": [
"sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2",
"sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24"
],
"version": "==0.3.1"
},
"pathmatch": {
"nodeenv": {
"hashes": [
"sha256:b35db907d0532c66132e5bc8aaa20dbfae916441987c8f0abd53ac538376d9a7"
],
"version": "==0.2.1"
},
"pexpect": {
"hashes": [
"sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba",
"sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b"
],
"markers": "sys_platform != 'win32'",
"version": "==4.6.0"
},
"pickleshare": {
"hashes": [
"sha256:84a9257227dfdd6fe1b4be1319096c20eb85ff1e82c7932f36efccfe1b09737b",
"sha256:c9a2541f25aeabc070f12f452e1f2a8eae2abd51e1cd19e8430402bdf4c1d8b5"
],
"version": "==0.7.4"
},
"prompt-toolkit": {
"hashes": [
"sha256:1df952620eccb399c53ebb359cc7d9a8d3a9538cb34c5a1344bdbeb29fbcc381",
"sha256:3f473ae040ddaa52b52f97f6b4a493cfa9f5920c255a12dc56a7d34397a398a4",
"sha256:858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"
],
"version": "==1.0.15"
},
"ptyprocess": {
"hashes": [
"sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0",
"sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"
],
"version": "==0.6.0"
},
"pycodestyle": {
"hashes": [
"sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766",
"sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9"
],
"version": "==2.3.1"
},
"pyflakes": {
"hashes": [
"sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f",
"sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805"
"sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b",
"sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"
],
"version": "==1.6.0"
},
"parso": {
"hashes": [
"sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398",
"sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"
],
"markers": "python_version >= '3.6'",
"version": "==0.8.2"
},
"pathspec": {
"hashes": [
"sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
"sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
],
"version": "==0.9.0"
},
"pexpect": {
"hashes": [
"sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
"sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
],
"markers": "sys_platform != 'win32'",
"version": "==4.8.0"
},
"pickleshare": {
"hashes": [
"sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
"sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
],
"version": "==0.7.5"
},
"prompt-toolkit": {
"hashes": [
"sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c",
"sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"
],
"markers": "python_full_version >= '3.6.2'",
"version": "==3.0.20"
},
"ptyprocess": {
"hashes": [
"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
],
"version": "==0.7.0"
},
"pycodestyle": {
"hashes": [
"sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068",
"sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.7.0"
},
"pyflakes": {
"hashes": [
"sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3",
"sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.3.1"
},
"pygments": {
"hashes": [
"sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d",
"sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"
"sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
"sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
],
"version": "==2.2.0"
"markers": "python_version >= '3.5'",
"version": "==2.10.0"
},
"pynvim": {
"hashes": [
"sha256:3a795378bde5e8092fbeb3a1a99be9c613d2685542f1db0e5c6fd467eed56dff"
],
"version": "==0.4.3"
},
"pyright": {
"hashes": [
"sha256:dd8e18c54321340be44a708b6037c0b967486c32b3f492741fffdc205cb82f15",
"sha256:e2668730cddf580e696d4a11946e740e2f5647df1eb45f7c55b7029376eac5a1"
],
"index": "pypi",
"version": "==0.0.9"
},
"pyserial": {
"hashes": [
"sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627",
"sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8"
"sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb",
"sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"
],
"version": "==3.4"
"version": "==3.5"
},
"python-dateutil": {
"hashes": [
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.8.2"
},
"python-dotenv": {
"hashes": [
"sha256:122290a38ece9fe4f162dc7c95cae3357b983505830a154d3c98ef7f6c6cea77",
"sha256:4a205787bc829233de2a823aa328e44fd9996fedb954989a21f1fc67c13d7a77"
"sha256:aae25dc1ebe97c420f50b81fb0e5c949659af713f31fdb63c749ca68748f34b1",
"sha256:f521bc2ac9a8e03c736f62911605c5d83970021e3fa95b37d769e2bbbe9b6172"
],
"version": "==0.9.1"
"markers": "python_version >= '3.5'",
"version": "==0.19.0"
},
"simplegeneric": {
"python-magic": {
"hashes": [
"sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"
"sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626",
"sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf"
],
"version": "==0.8.1"
"index": "pypi",
"version": "==0.4.24"
},
"regex": {
"hashes": [
"sha256:0696eb934dee723e3292056a2c046ddb1e4dd3887685783a9f4af638e85dee76",
"sha256:105122fa63da98d8456d5026bc6ac5a1399fd82fa6bad22c6ea641b1572c9142",
"sha256:116c277774f84266044e889501fe79cfd293a8b4336b7a5e89b9f20f1e5a9f21",
"sha256:12eaf0bbe568bd62e6cade7937e0bf01a2a4cef49a82f4fd204401e78409e158",
"sha256:1401cfa4320691cbd91191ec678735c727dee674d0997b0902a5a38ad482faf5",
"sha256:19acdb8831a4e3b03b23369db43178d8fee1f17b99c83af6cd907886f76bd9d4",
"sha256:208851a2f8dd31e468f0b5aa6c94433975bd67a107a4e7da3bdda947c9f85e25",
"sha256:24d68499a27b2d93831fde4a9b84ea5b19e0ab141425fbc9ab1e5b4dad179df7",
"sha256:2778c6cb379d804e429cc8e627392909e60db5152b42c695c37ae5757aae50ae",
"sha256:2a0a5e323cf86760784ce2b91d8ab5ea09d0865d6ef4da0151e03d15d097b24e",
"sha256:2d9cbe0c755ab8b6f583169c0783f7278fc6b195e423b09c5a8da6f858025e96",
"sha256:2de1429e4eeab799c168a4f6e6eecdf30fcaa389bba4039cc8a065d6b7aad647",
"sha256:32753eda8d413ce4f208cfe01dd61171a78068a6f5d5f38ccd751e00585cdf1d",
"sha256:3ee8ad16a35c45a5bab098e39020ecb6fec3b0e700a9d88983d35cbabcee79c8",
"sha256:4f03fc0a25122cdcbf39136510d4ea7627f732206892db522adf510bc03b8c67",
"sha256:4f3e36086d6631ceaf468503f96a3be0d247caef0660c9452fb1b0c055783851",
"sha256:503c1ba0920a46a1844363725215ef44d59fcac2bd2c03ae3c59aa9d08d29bd6",
"sha256:507861cf3d97a86fbe26ea6cc04660ae028b9e4080b8290e28b99547b4e15d89",
"sha256:56ae6e3cf0506ec0c40b466e31f41ee7a7149a2b505ae0ee50edd9043b423d27",
"sha256:6530b7b9505123cdea40a2301225183ca65f389bc6129f0c225b9b41680268d8",
"sha256:6729914dd73483cd1c8aaace3ac082436fc98b0072743ac136eaea0b3811d42f",
"sha256:7406dd2e44c7cfb4680c0a45a03264381802c67890cf506c147288f04c67177d",
"sha256:7684016b73938ca12d160d2907d141f06b7597bd17d854e32bb7588be01afa1d",
"sha256:7db58ad61f3f6ea393aaf124d774ee0c58806320bc85c06dc9480f5c7219c250",
"sha256:83946ca9278b304728b637bc8d8200ab1663a79de85e47724594917aeed0e892",
"sha256:84057cfae5676f456b03970eb78b7e182fddc80c2daafd83465a3d6ca9ff8dbf",
"sha256:862b6164e9a38b5c495be2c2854e75fd8af12c5be4c61dc9b42d255980d7e907",
"sha256:8ddb4f9ce6bb388ecc97b4b3eb37e786f05d7d5815e8822e0d87a3dbd7100649",
"sha256:92eb03f47427fea452ff6956d11f5d5a3f22a048c90a0f34fa223e6badab6c85",
"sha256:a5f3bc727fea58f21d99c22e6d4fca652dc11dbc2a1e7cfc4838cd53b2e3691f",
"sha256:a6180dbf5945b27e9420e1b58c3cacfc79ad5278bdad3ea35109f5680fbe16d1",
"sha256:b158f673ae6a6523f13704f70aa7e4ce875f91e379bece4362c89db18db189d5",
"sha256:cd45b4542134de63e7b9dd653e0a2d7d47ffed9615e3637c27ca5f6b78ea68bb",
"sha256:d2404336fd16788ea757d4218a2580de60adb052d9888031e765320be8884309",
"sha256:db888d4fb33a2fd54b57ac55d5015e51fa849f0d8592bd799b4e47f83bd04e00",
"sha256:dde0ac721c7c5bfa5f9fc285e811274dec3c392f2c1225f7d07ca98a8187ca84",
"sha256:de0d06ccbc06af5bf93bddec10f4f80275c5d74ea6d28b456931f3955f58bc8c",
"sha256:e02dad60e3e8442eefd28095e99b2ac98f2b8667167493ac6a2f3aadb5d84a17",
"sha256:e960fe211496333b2f7e36badf4c22a919d740386681f79139ee346b403d1ca1",
"sha256:e9700c52749cb3e90c98efd72b730c97b7e4962992fca5fbcaf1363be8e3b849",
"sha256:ee318974a1fdacba1701bc9e552e9015788d6345416364af6fa987424ff8df53"
],
"version": "==2021.8.27"
},
"s3cmd": {
"hashes": [
"sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa",
"sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03"
],
"index": "pypi",
"version": "==2.1.0"
},
"six": {
"hashes": [
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
],
"version": "==1.11.0"
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.16.0"
},
"testfixtures": {
"hashes": [
"sha256:334497d26344e8c0c5d01b4d785a1c83464573151e6a5f7ab250eb7981d452ec",
"sha256:53c06c1feb0bf378d63c54d1d96858978422d5a34793b39f0dcb0e44f8ec26f4"
"sha256:0a6422737f6d89b45cdef1e2df5576f52ad0f507956002ce1020daa9f44211d6",
"sha256:486be7b01eb71326029811878a3317b7e7994324621c0ec633c8e24499d8d5b3"
],
"version": "==6.3.0"
"version": "==6.18.1"
},
"toml": {
"hashes": [
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
],
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==0.10.2"
},
"traitlets": {
"hashes": [
"sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835",
"sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9"
"sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396",
"sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"
],
"version": "==4.3.2"
"markers": "python_version >= '3.7'",
"version": "==5.0.5"
},
"typing": {
"hashes": [
"sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d",
"sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4",
"sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a"
"sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9",
"sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"
],
"version": "==3.6.6"
"index": "pypi",
"version": "==3.7.4.3"
},
"typing-extensions": {
"hashes": [
"sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
"sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
"sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
],
"version": "==3.10.0.0"
},
"wcwidth": {
"hashes": [
"sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
"sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
"sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784",
"sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"
],
"version": "==0.1.7"
"version": "==0.2.5"
}
}
}

157
README.md
View File

@@ -1,101 +1,90 @@
# KMK: Python-based keyboard firmware for humans (and ARM microcontrollers)
# KMK: Clackety Keyboards Powered by Python
![GitHub](
https://img.shields.io/github/license/KMKfw/kmk_firmware
)![GitHub contributors](
https://img.shields.io/github/contributors/KMKfw/kmk_firmware
)![Discord](
https://img.shields.io/discord/493256121075761173?logo=Discord
)![Lines of code](https://img.shields.io/tokei/lines/github/KMKfw/kmk_firmware
)![GitHub issues](https://img.shields.io/github/issues-raw/KMKfw/kmk_firmware
)![GitHub closed issues](https://img.shields.io/github/issues-closed/KMKfw/kmk_firmware)
[![CircleCI](https://circleci.com/gh/KMKfw/kmk_firmware/tree/master.svg?style=svg)](https://circleci.com/gh/KMKfw/kmk_firmware/tree/master)[![CLA assistant](https://cla-assistant.io/readme/badge/KMKfw/kmk_firmware)](https://cla-assistant.io/KMKfw/kmk_firmware)
#### [Join our Matrix community for chat and support!](https://matrix.to/#/+kmk:kmkfw.io)
KMK is a feature-rich and beginner-friendly firmware for computer keyboards
written and configured in
[CircuitPython](https://github.com/adafruit/circuitpython). **KMK is currently
in public beta, however should handle most workflows without major issues**.
[Or, head directly to the #support channel](https://matrix.to/#/#support:kmkfw.io)
<!--
@klardotsh 06 July 2021: commented for now because CDN builds have been broken
for ages and folks are (reasonably) getting confused.
If you can't or won't use the Matrix infrastructure, a (possibly fragile) bridge
to Discord exists
[here](https://discordapp.com/widget?id=493256121075761173&theme=dark).
You can always find the latest releases on our CDN, in [compiled and
optimized](https://cdn.kmkfw.io/kmk-latest.zip) and [raw, hackable text
file](https://cdn.kmkfw.io/kmk-latest.unoptimized.zip) forms. These follow the
`master` branch here on GitHub.
-->
<hr/>
> If you need support with KMK or just want to say hi, find us in
> [#kmkfw:klar.sh on Matrix](https://matrix.to/#/#kmkfw:klar.sh). This channel
> is bridged to Discord
> [here](https://discordapp.com/widget?id=493256121075761173&theme=dark) for
> convenience.
KMK is a firmware for (usually mechanical) keyboards, running on
[CircuitPython](https://github.com/adafruit/circuitpython). It aims to provide a
means to write complex keyboard configurations quickly, without having to learn
much "real" programming, while preserving at least some of the hackability and
DIY spirit of CircuitPython. Learn more about the rationale of KMK in `Why KMK?`
below.
## Features
This project is currently written and maintained by:
- Fully configured through a single, easy to understand Python file that lives
on a "flash-drive"-esque space on your microcontroller - edit on the go
without DFU or other devtooling available!
- Single-piece or [two-piece split
keyboards](https://github.com/KMKfw/kmk_firmware/blob/master/docs/split_keyboards.md)
are supported
- [Chainable
keys](https://github.com/KMKfw/kmk_firmware/blob/master/docs/keys.md) such as
`KC.LWIN(KC.L)` to lock the screen on a Windows PC
- [Built-in unicode macros, including
emojis](https://github.com/KMKfw/kmk_firmware/blob/master/docs/sequences.md)
- [RGB underglow](https://github.com/KMKfw/kmk_firmware/blob/master/docs/rgb.md)
and [LED
backlights](https://github.com/KMKfw/kmk_firmware/blob/master/docs/led.md)
- One key can turn into many more based on [how many times you tap
it](https://github.com/KMKfw/kmk_firmware/blob/master/docs/tapdance.md)
- Bluetooth HID and split keyboards. No more wires.
- [Josh Klar (@klardotsh)](https://github.com/klardotsh)
- [Kyle Brown (@kdb424)](https://github.com/kdb424)
## Getting Started
With community help from:
Our getting started guide can be found
[here](https://github.com/KMKfw/kmk_firmware/blob/master/docs/Getting_Started.md)
- [@siddacious](https://github.com/siddacious)
- [Scott Shawcroft (@tannewt)](https://github.com/tannewt)
## The KMK Team
> Scott is the lead developer of the CircuitPython project itself at Adafruit.
> KMK, however, is not officially sponsored by Adafruit, and is an independent
> project.
KMK is primarily written and maintained by @klardotsh and @kdb424, but
contributions are welcome from all, whether it's in the form of code,
documentation, hardware designs, feature ideas, or anything else that comes to
mind. A list of KMK's contributors can be found [on
GitHub](https://github.com/KMKfw/kmk_firmware/graphs/contributors).
Lastly, we'd like to make a couple of shoutouts to people not directly
affiliated with the project in any way, but who have helped or inspired us along
the way:
> While Adafruit employees and affiliates are occasionally found in the commit
> log and their help has been crucial to KMK's success, KMK is not an official
> Adafruit project, and the Core team is not compensated by Adafruit for its
> development.
- [Jack Humbert (@jackhumbert)](https://jackhumbert.com/), for writing QMK.
Without QMK, I'd have never been exposed to the wonderful world of
programmable keyboards. He's also just an awesometastic human in general, if
you ever catch him on Discord/Reddit/etc. Jack also makes fantastic hardware -
check out [his store](https://olkb.com)!
## Code Style
- [Dan Halbert (@dhalbert)](https://danhalbert.org/), for his amazing and
unjudgemental support of two random dudes on Github asking all sorts of
bizzare (okay... and occasionally dumb) questions on the MicroPython and
CircuitPython Github projects and the Adafruit Discord. Dan, without your help
and pointers (even when those pointers are "Remember you're working with a
microcontroller with a few MHz of processing speed and a few KB of RAM"), this
project would have never gotten off the ground. Thank you, and an extended
thanks to Adafruit.
## Why KMK?
A question we get from time to time is, "why bother with KMK when QMK already
exists?", so here's a short bulleted list of our thoughts on the matter (in no
particular order):
- Python is awesome
- Python is super easy to write
- Python provides fewer footguns than C
- KMK cut all the "tech debt" of supporting AVR controllers, and frankly even
most ARM controllers with under 256KB of flash. This let us make some very
user-friendly (in our biased opinions) design decisions that should make it
simple for users to create even fairly complex keyboards - want a key on your
board that sends a shruggie (`¯\_(ツ)_/¯`)? No problem - it's supported out of
the box. Want a single key that can act as all 26 alphabet characters
depending on the number of times it's tapped? You're insane, but our simple
Tap Dance implementation has you covered (without a single line of matrix
mangling or timer madness)
- KMK supports a few small features QMK doesn't - most are probably not
deal-closers, but they exist no less. Probably the most notable addition here
is `Leader Mode - Enter`. Check out `docs/leader.md` for details on that.
- KMK plans to support some fairly powerful hardware that would enable things
like connecting halves (or thirds, or whatever) of a split keyboard to each
other via Bluetooth. This stuff is still in very early R&D.
## So how do I use it?
Since KMK is still in some state between "alpha" and "beta", flashing KMK to a
board is still a process that requires a few lines of shell scripting. Check out
`docs/flashing.md` for instructions/details, though note that for now, the
instructions mostly assume Unix (Linux/MacOS/BSD) usage. You may want to check
out the Windows Subsystem for Linux if you're on Windows.
KMK uses [Black](https://github.com/psf/black) with a Python 3.6 target and,
[(controversially?)](https://github.com/psf/black/issues/594) single quotes.
Further code styling is enforced with isort and flake8 with several plugins.
`make fix-isort fix-formatting` before a commit is a good idea, and CI will fail
if inbound code does not adhere to these formatting rules. Some exceptions are
found in `setup.cfg` loosening the rules in isolated cases, notably
`user_keymaps` (which is *also* not subject to Black formatting for reasons
documented in `pyproject.toml`).
## License, Copyright, and Legal
Most files in this project are licensed
[GPLv3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)) -
see `LICENSE.md` at the top of this source tree for exceptions and the full
license text.
When contributing for the first time, you'll need to sign a Contributor
Licensing Agreement which is based on the Free Software Foundation's CLA. The
CLA is basically a two-way promise that this code is and remains yours, but will
be distributed as part of a larger GPLv3 project. If you'd like to get it out of
the way early, you can find said CLA [here](
https://cla-assistant.io/kmkfw/kmk_firmware). If you forget, the bots will
remind you when you open the pull request, no worries!
All software in this repository is licensed under the [GNU Public License,
verison 3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)).
All documentation and hardware designs are licensed under the [Creative Commons
Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
license. Contributions to this repository must use these licenses unless
otherwise agreed to by the Core team.

16
boards/atreus62/README.md Normal file
View File

@@ -0,0 +1,16 @@
# Atreus62
![Atreus62](https://assets.bigcartel.com/product_images/189335282/BIlqCtd.jpg?auto=format&fit=max&w=1200)
Atreus62 is a 60% column staggered keyboard pinky stagger
kb.py is designed to work with the Teensy 4.1
Retailers (USA)
[Atreus62](https://shop.profetkeyboards.com/product/atreus62-keyboard)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [Encoder](https://github.com/KMKfw/kmk_firmware/tree/master/docs/encoder.md) Twist control for all the things

28
boards/atreus62/kb.py Normal file
View File

@@ -0,0 +1,28 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
# from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.D24,
board.D25,
board.D26,
board.D27,
board.D28,
board.D29,
board.D30,
board.D31,
board.D32,
board.D33,
board.D34,
board.D35,
)
row_pins = (board.D3, board.D4, board.D5, board.D6, board.D7, board.D8)
diode_orientation = DiodeOrientation.ROWS
# diode_orientation = DiodeOrientation.COLUMNS

220
boards/atreus62/main.py Normal file
View File

@@ -0,0 +1,220 @@
import board
from kb import KMKKeyboard
from kmk.handlers.sequences import send_string, simple_key_sequence
from kmk.keys import KC
from kmk.modules.encoder import EncoderHandler
from kmk.modules.layers import Layers
# local_increment = None
# local_decrement = None
keyboard = KMKKeyboard()
# custom keys used for encoder actions
Zoom_in = KC.LCTRL(KC.EQUAL)
Zoom_out = KC.LCTRL(KC.MINUS)
# standard filler keys
_______ = KC.TRNS
XXXXXXX = KC.NO
# for use in the encoder extension
encoder_map = [
[
(
KC.VOLU,
KC.VOLD,
2,
), # Only 1 encoder is being used, so only one tuple per layer is required
],
[
(Zoom_in, Zoom_out, 1),
],
[
(_______, _______, 1), # no action taken by the encoder on this layer
],
]
layers_ext = Layers()
encoder_ext = EncoderHandler([board.D40], [board.D41], encoder_map)
encoder_ext.encoders[0].is_inverted = True
keyboard.modules = [layers_ext, encoder_ext]
keyboard.tap_time = 250
keyboard.debug_enabled = False
# custom keys
NEW = KC.LCTL(KC.N)
NEW_DIR = KC.LCTL(KC.LSFT(KC.N))
CAD = KC.LCTL(KC.LALT(KC.DEL))
RES = KC.LCTL(KC.LSFT(KC.ESC))
FE = KC.LGUI(KC.E)
LT1_DEL = KC.LT(1, KC.DEL)
LT2_ENT = KC.LT(2, KC.ENT)
SAVE_AS = KC.LCTL(KC.LSFT(KC.S))
PSCR = KC.LGUI(KC.PSCR)
SNIP = simple_key_sequence(
(
KC.LGUI,
KC.MACRO_SLEEP_MS(25),
KC.S,
KC.N,
KC.I,
KC.P,
KC.MACRO_SLEEP_MS(25),
KC.ENT,
)
)
# programming layer keys
UINT = simple_key_sequence(
(
KC.U,
KC.I,
KC.N,
KC.T,
)
)
INT = simple_key_sequence(
(
KC.I,
KC.N,
KC.T,
)
)
DOUBLE = simple_key_sequence(
(
KC.D,
KC.O,
KC.U,
KC.B,
KC.L,
KC.E,
)
)
BOOL = simple_key_sequence(
(
KC.B,
KC.O,
KC.O,
KC.L,
)
)
BYTE = simple_key_sequence(
(
KC.B,
KC.Y,
KC.T,
KC.E,
)
)
SBYTE = simple_key_sequence(
(
KC.S,
KC.B,
KC.Y,
KC.T,
KC.E,
)
)
CHAR = simple_key_sequence(
(
KC.C,
KC.H,
KC.A,
KC.R,
)
)
GETSET = simple_key_sequence(
(
KC.LBRC,
KC.SPC,
KC.G,
KC.E,
KC.T,
KC.SCLN,
KC.SPC,
KC.S,
KC.E,
KC.T,
KC.SCLN,
KC.SPC,
KC.RBRC,
)
)
PUBLIC = simple_key_sequence(
(
KC.P,
KC.U,
KC.B,
KC.L,
KC.I,
KC.C,
)
)
DEBUGWL = simple_key_sequence(
(
KC.LSFT(KC.D),
KC.E,
KC.B,
KC.U,
KC.G,
KC.DOT,
KC.LSFT(KC.W),
KC.R,
KC.I,
KC.T,
KC.E,
KC.LSFT(KC.L),
KC.I,
KC.N,
KC.E,
KC.LSFT(KC.N9),
)
)
PRINT = simple_key_sequence(
(
KC.P,
KC.R,
KC.I,
KC.N,
KC.T,
)
)
# make keymap
keyboard.keymap = [
[ # qwerty
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.MINS,
KC.CAPS, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.PSLS,
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.TRNS, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, FE,
KC.BSPC, KC.DEL, KC.LALT, KC.LSFT, KC.LCTL, KC.BSPC, KC.SPC, KC.ENT, KC.RSFT, KC.RCTL, KC.ENT, KC.RGUI,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MO(1), KC.MO(2), KC.MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
],
[ # navnum
KC.TRNS, SAVE_AS, PSCR, SNIP, KC.LGUI, NEW_DIR, KC.PSLS, KC.RGUI, KC.NO, KC.NO, KC.NO, KC.MINS,
KC.BSLS, KC.NO, KC.HOME, KC.UP, KC.END, NEW, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.BSLS,
KC.F2, KC.NO, KC.LEFT, KC.DOWN, KC.RGHT, KC.HASH, KC.N0, KC.N1, KC.N2, KC.N3, KC.N4, KC.QUOT,
KC.LSFT, KC.NO, KC.NO, KC.NO, KC.TAB, KC.UNDS, KC.MINS, KC.PPLS, KC.MINS, KC.PAST, KC.PSLS, KC.LBRC,
KC.BSPC, KC.NO, KC.NO, KC.NO, KC.NO, KC.TRNS, KC.SPC, KC.EQL, KC.N0, KC.DOT, KC.ENT, KC.RGUI,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.TRNS, KC.TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
],
[ # sym/prog
KC.TRNS, KC.NO, KC.NO, KC.NO, KC.F2, KC.AMPR, PRINT, DEBUGWL, SAVE_AS, KC.NO, KC.NO, KC.NO,
KC.BSLS, KC.NO, KC.NO, KC.LCBR, KC.RCBR, KC.AT, INT, GETSET, KC.UP, KC.NO, KC.NO, KC.NO,
KC.TAB, KC.NO, KC.NO, KC.LPRN, KC.RPRN, KC.DLR, BOOL, KC.LEFT, KC.DOWN, KC.RGHT, KC.NO, KC.NO,
KC.LSFT, KC.NO, KC.NO, KC.LBRC, KC.RBRC, KC.PERC, UINT, DOUBLE, KC.NO, KC.NO, KC.NO, KC.NO,
KC.BSPC, KC.LGUI, KC.LALT, KC.LSFT, KC.LCTL, KC.DEL, KC.TRNS, PUBLIC, KC.RCTL, KC.RALT, KC.ENT, KC.RESET,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.TRNS, KC.TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
],
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,13 @@
# Boardsource 3x4
![Boardsource3x4](https://boardsource.imgix.net/30171267-d988-46cc-ba03-9f6a8ab96487.jpg?raw=true)
This macro pad / small 12 key was inspired by the plaid look
kb.py is designed to work with the nice!nano
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5ecc2008eee64242946c98c1)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.

View File

@@ -0,0 +1,12 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P1_15, board.P0_02, board.P0_29)
col_pins = (board.P0_09, board.P0_10, board.P1_11, board.P1_13)
diode_orientation = DiodeOrientation.COLUMNS
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,30 @@
from kb import KMKKeyboard
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
layers_ext = Layers()
keyboard.modules = [layers_ext]
RAISE = KC.MO(1)
keyboard.keymap = [
[ #Base
KC.N0, KC.N1, KC.N4, KC.N7,
KC.ENT, KC.N2, KC.N5, KC.N8,
RAISE, KC.N3, KC.N6, KC.N9
],
[ #RAISE
_______, _______, _______, _______,
_______, _______, _______, _______,
_______, _______, _______, _______
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,21 @@
# Boardsource 4x12 Ortho
![Boardsource4x12](https://boardsource.imgix.net/164c3388-5057-46c8-8fcd-82c58c7870ce.jpg?raw=true)
![Boardsource4x12LP](https://boardsource.imgix.net/c2108ea4-7d70-4327-b4b4-88c8191b1369.jpg?raw=true)
The 4x12 ortholinear keyboard is an extremely common and beloved layout within the keyboard community. Made popular by Jack's Planck from OLKB, the 4x12 ortholinear layout is possibly the most popular non-stagger layout available.
kb.py is designed to work with the nice!nano
Retailers (USA)
4x12
[Boardsource](https://boardsource.xyz/store/5ecb78d286879c9a0c22dafd )
Low profile 4x12
[Boardsource](https://boardsource.xyz/store/5ecb7dad86879c9a0c22db32)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,25 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P0_08, board.P0_06, board.P0_17, board.P0_20)
col_pins = (
board.P0_31,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
board.P1_06,
board.P1_04,
board.P0_11,
board.P1_00,
)
diode_orientation = DiodeOrientation.COLUMNS
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,43 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
media = MediaKeys()
layers_ext = Layers()
keyboard.extensions = [media]
keyboard.modules = [layers_ext]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
keyboard.keymap = [
[ #QWERTY
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
KC.ESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT ,
KC.PIPE, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
],
[ #LOWER
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, KC.PGUP, KC.PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
],
[ #RAISE
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, _______, _______, KC.HOME, KC.END, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,21 @@
# Boardsource 5x12 Ortho
![Boardsource5x12](https://boardsource.imgix.net/74abb511-792e-42d9-9f6e-8100c521b2e0.jpg?raw=true)
![Boardsource5x12LP](https://boardsource.imgix.net/57ad3f69-3c88-4ae8-9592-6e4d2f45a58e.jpg?raw=true)
5x12 ortholinear -- for when just really don't want to give up your number row. The 5x12 ortholinear keyboard is a common ortholinear layout that many people prefer because it includes a number row. Made popular by Jack's Preonic from OLKB, the 5x12 ortholinear layout is a great option for those who want to try ortholinear but feel they aren't ready to make the jump to a 40%. The 5x12 Ortho is an approachable keyboard with hotswap compatibility.
kb.py is designed to work with the nice!nano
Retailers (USA)
5x12
[Boardsource](https://boardsource.xyz/store/5ecb802c86879c9a0c22db61)
Low Profile 5x12
[Boardsource](https://boardsource.xyz/store/5ecb822386879c9a0c22db84)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,25 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P0_08, board.P0_06, board.P0_17, board.P0_20, board.P0_22)
col_pins = (
board.P0_31,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
board.P1_06,
board.P1_04,
board.P0_11,
board.P1_00,
)
diode_orientation = DiodeOrientation.COLUMNS
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,46 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
media = MediaKeys()
layers_ext = Layers()
keyboard.modules = [layers_ext]
keyboard.extensions = [media]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
keyboard.keymap = [
[ #QWERTY
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.DEL,
KC.ESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
KC.PIPE, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
],
[ #LOWER
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.UP, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC.LEFT, KC.DOWN, KC.RGHT, _______, _______,
KC.CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
],
[ #RAISE
KC.GRV, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
_______, KC.N4, KC.N5, KC.N6, KC.PLUS, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, _______,
KC.ENT, KC.N7, KC.N8, KC.N9, KC.MINS, KC.F11, KC.F12, KC.NUHS, KC.NUBS, KC.MUTE, _______, KC.BSLS,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,19 @@
# Microdox
![microdox](https://boardsource.imgix.net/337ae65a-d061-46a4-b119-9916b043c58f.jpg?raw=true)
The Microdox is is a feature-packed 30% split columnar staggered keyboard. Even though the Microdox is an extremely small keyboard it offers tons of features from larger boards while maintaining a tiny footprint.
kb.py is designed to work with the nice!nano
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5f2e7e4a2902de7151494f92)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,24 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (board.P0_31, board.P0_29, board.P0_02, board.P1_15, board.P1_13)
row_pins = (board.P0_10, board.P0_09, board.P1_04, board.P1_06)
diode_orientation = DiodeOrientation.COLUMNS
data_pin = board.P0_08
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 12
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(10))
coord_mapping.extend(ic(1, x) for x in range(10))
coord_mapping.extend(ic(2, x) for x in range(10))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))

View File

@@ -0,0 +1,54 @@
from kb import KMKKeyboard
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
layers_ext = Layers()
keyboard.modules = [layers_ext, split]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(2)
RAISE = KC.MO(1)
RGB_TOG = KC.RGB_TOG
RGB_HUI = KC.RGB_HUI
RGB_HUD = KC.RGB_HUI
RGB_SAI = KC.RGB_SAI
RGB_SAD = KC.RGB_SAD
RGB_VAI = KC.RGB_VAI
RGB_VAD = KC.RGB_VAD
keyboard.keymap = [
[ #QWERTY
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,\
KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN,\
KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH,\
KC.LCTL, LOWER, KC.SPC, KC.BSPC, RAISE, KC.ENT,
],
[ #RAISE
KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0,\
KC.TAB, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT, XXXXXXX, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC,\
KC.LCTL, KC.GRV, KC.LGUI, KC.LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.BSLS, KC.QUOT,\
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
],
[ #LOWER
KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN,\
KC.ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR,\
KC.CAPS, KC.TILD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.PIPE, KC.DQT,\
XXXXXXX, XXXXXXX, XXXXXXX, KC.ENT, XXXXXXX, KC.DEL
]
]
if __name__ == '__main__':
keyboard.go()

27
boards/crkbd/README.md Normal file
View File

@@ -0,0 +1,27 @@
# Corne Keyboard (CRKBD)
![Crkbd](https://boardsource.imgix.net/a90342e3-caa0-467c-bebd-d17f031d5210.jpg?raw=true)
![Crkbd](https://boardsource.imgix.net/9cbd31b7-3b37-42c6-919e-3be35a2578f6.jpg?raw=true)
A split keyboard with a 3x6 columnar stagger and 3 thumb keys.
kb.py is designed to work with the nice!nano
Hardware Availability: [PCB & Case Source](https://github.com/foostan/crkbd)
Retailers (USA)
Corne
[Boardsource](https://boardsource.xyz/store/5ecc0f81eee64242946c988f)
Corne LP
[Boardsource](https://boardsource.xyz/store/5f2efc462902de7151495057)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

30
boards/crkbd/kb.py Normal file
View File

@@ -0,0 +1,30 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.P0_31,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
)
row_pins = (board.P0_22, board.P0_24, board.P1_00, board.P0_11)
diode_orientation = DiodeOrientation.COLUMNS
data_pin = board.P0_08
rgb_pixel_pin = board.P0_06
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))

29
boards/crkbd/kb_rp2040.py Normal file
View File

@@ -0,0 +1,29 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.A3,
board.A2,
board.A1,
board.A0,
board.SCK,
board.MISO,
)
row_pins = (board.D4, board.D5, board.D6, board.D7)
diode_orientation = DiodeOrientation.COLUMNS
data_pin = board.RX
rgb_pixel_pin = board.D0
i2c = board.I2C
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))

67
boards/crkbd/main.py Normal file
View File

@@ -0,0 +1,67 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
# Adding extensions
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=27, val_limit=100, hue_default=190, sat_default=100, val_default=5)
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
layers_ext = Layers()
keyboard.modules = [layers_ext, split]
keyboard.extensions = [rgb]
#
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.LT(3, KC.SPC)
RGB_TOG = KC.RGB_TOG
RGB_HUI = KC.RGB_HUI
RGB_HUD = KC.RGB_HUI
RGB_SAI = KC.RGB_SAI
RGB_SAD = KC.RGB_SAD
RGB_VAI = KC.RGB_VAI
RGB_VAD = KC.RGB_VAD
keyboard.keymap = [
[ #QWERTY
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #LOWER
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, XXXXXXX, XXXXXXX,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #RAISE
KC.ESC, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.EQL, KC.LCBR, KC.RCBR, KC.PIPE, KC.GRV,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #ADJUST
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,21 @@
# Ergo Travel
![ergo_travel](https://boardsource.imgix.net/fa53de62-fd37-4c75-8c5b-b4bec37927c1.jpg?raw=true)
As the name implies, the Ergo Travel was originally designed as a travel keyboard, but it works just as well on your desk as a main daily use keyboard. The Ergo Travel is a popular choice by many because it offers a few more keys than other keyboards in similar sizes, and that is why we chose to stock it. Additionally, the Ergo Travel has nice customization options in the thumb cluster because you can configure the main thumb key to use a single larger 2u key, or two smaller 1u keys depending on your preference. The clean and simple aesthetic of the Ergo Travel and the few extra keys make it an awesome option for people wanting a 40%-ish split keyboard.
kb.py is designed to work with the nice!nano
Hardware Availability: [PCB & Case Source](https://github.com/jpconstantineau/ErgoTravel/blob/master/OrderingInstructions.md)
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5eed23430883e03ef9a69d6a)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

33
boards/ergo_travel/kb.py Normal file
View File

@@ -0,0 +1,33 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P0_24, board.P1_00, board.P0_11, board.P1_04)
col_pins = (
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
)
diode_orientation = DiodeOrientation.COLUMNS
led_pin = board.P1_06
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 12
data_pin = board.P0_08
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(14))
coord_mapping.extend(ic(1, x) for x in range(14))
coord_mapping.extend(ic(2, x) for x in range(14))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 12))

View File

@@ -0,0 +1,58 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modulessplit import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
media = MediaKeys()
layers_ext = Layers()
keyboard.modules = [layers_ext, split]
keyboard.extensions = (media)
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.MO(3)
CALTDEL = KC.LCTL(KC.LALT(KC.DEL))
TSKMGR = KC.LCTL(KC.LSFT(KC.KC_ESC))
keyboard.keymap = [
[ #QWERTY
KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.MINS, KC.EQL, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.LBRC, KC.RBRC, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.SPC, KC.SPC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,\
KC.LCTL, KC.LGUI, KC.LALT, ADJUST, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.UP, KC.DOWN, KC.RGHT\
],
[ #LOWER
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.HOME, KC.PGUP, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.DEL,\
_______, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.END , KC.PGDN, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.BSLS,\
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.BSPC, KC.BSPC, KC.F12, _______, _______, KC.MUTE, _______, KC.PIPE,\
_______, _______, _______, _______, _______, KC.BSPC, KC.BSPC, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY\
],
[ #RAISE
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, _______, _______, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL, \
_______, KC.N4, KC.N5, KC.N6, KC.PLUS, _______, _______, _______, _______, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, _______, \
KC.ENT, KC.N7, KC.N8, KC.N9, KC.MINS, _______, _______, _______, _______, KC.NUHS, KC.NUBS, KC.MUTE, _______, KC.BSLS, \
_______, KC.COMM, KC.N0, KC.DOT, _______, KC.BSPC, KC.BSPC, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY \
],
[ #ADJUST
TSKMGR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CALTDEL,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,17 @@
# Ghirkin
![Gherkin](https://4.bp.blogspot.com/-sQ18-lNZXOc/WCzlTde-4PI/AAAAAAAB_JQ/qQrehAMG6DMKf3i4oj4mkmLGOfTUvb3KgCLcB/s640/IMG_20161116_122926.jpg)
A keyboard with only 30 keys.
kb.py is designed to work with the nice!nano
Hardware Availability: [Gherkin project on 40% Keyboards](http://www.40percent.club/2016/11/gherkin.html)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
- [LED](https://github.com/KMKfw/kmk_firmware/tree/master/docs/led.md) Light your keys up
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,21 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P1_15, board.P1_13, board.P1_11, board.P0_10, board.P0_09)
col_pins = (
board.P1_04,
board.P0_11,
board.P1_00,
board.P0_24,
board.P0_22,
board.P0_20,
)
diode_orientation = DiodeOrientation.COLUMNS
led_pin = board.P1_06
rgb_num_pixels = 0
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,67 @@
from kb import KMKKeyboard
from kmk.extensions.led import LED
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.modtap import ModTap
keyboard = KMKKeyboard()
modtap = ModTap()
layers_ext = Layers()
led = LED()
keyboard.extensions = [led]
keyboard.modules = [layers_ext, modtap]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
FN1_SPC = KC.LT(1, KC.SPC)
FN2_BSPC = KC.LT(2, KC.BSPC)
FN3_C = KC.LT(3, KC.C)
FN4_V = KC.LT(4, KC.V)
FN5_B = KC.LT(5, KC.B)
CTL_Z = KC.CTL_T(KC.Z)
ALT_X = KC.ALT(KC.X)
ALT_N = KC.ALT(KC.N)
CTL_M = KC.CTL(KC.M)
SFT_ENT = KC.SFT(KC.ENT)
BL_DEC = KC.BL_DEC
BL_INC = KC.BL_INC
keyboard.keymap = [
[
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,
KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.ESC,
CTL_Z, ALT_X, FN3_C, FN4_V, FN2_BSPC, FN1_SPC, FN5_B, ALT_N, CTL_M, SFT_ENT
],
[
KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0,
KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10,
_______, _______, _______, _______, KC.DEL, _______, _______, _______, _______, _______
],
[
KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN,
KC.F11, KC.F12, _______, _______, _______, _______, _______, _______, _______, KC.GRV,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
],
[
_______, _______, _______, _______, _______, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
KC.TAB, _______, _______, _______, _______, KC.COMM, KC.DOT, KC.SLSH, KC.SCLN, KC.QUOT,
_______, _______, _______, _______, _______, _______, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
],
[
_______, _______, _______, _______, _______, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
KC.TAB, _______, _______, _______, _______, KC.LABK, KC.RABK, KC.QUES, KC.COLN, KC.DQUO,
_______, _______, _______, _______, _______, _______, KC.HOME, KC.PGDN, KC.PGUP, KC.END
],
[
KC.CALC, KC.WHOM, KC.MAIL, KC.MYCM, _______, _______, _______, _______, _______, KC.PSCR,
_______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,18 @@
# Luddite
![Luddite](https://1.bp.blogspot.com/-GAAa-sMU_WU/W7uYLJJ8x1I/AAAAAAACS44/31n2z69BSboM4KT48YkNMJRYciC8LUMWgCLcBGAs/s640/a.jpg)
Luddite 60% keyboard with backlight and RGB underglow.
kb.py is designed to work with the nice!nano
kb_converter.py is designed to work with an itsybitsy with converter board found [here](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
Hardware Availability: [Luddite project on 40% Keyboards](http://www.40percent.club/search/label/luddite)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) RGB underglow
- [LED](https://github.com/KMKfw/kmk_firmware/tree/master/docs/led.md) Light your keys up
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,30 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.A0,
board.A1,
board.A2,
board.A3,
board.A4,
board.A5,
board.SCK,
board.MOSI,
)
row_pins = (
board.TX,
board.RX,
board.SDA,
board.SCL,
board.D13,
board.D12,
board.D11,
board.D10,
)
diode_orientation = DiodeOrientation.COLUMNS
rgb_pixel_pin = board.D9
rgb_num_pixels = 12

View File

@@ -0,0 +1,33 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (
board.P0_06,
board.P0_08,
board.P0_17,
board.P0_20,
board.P0_22,
board.P0_24,
board.P1_00,
board.P0_11,
)
col_pins = (
board.P0_31,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
)
diode_orientation = DiodeOrientation.COLUMNS
led_pin = board.P1_06
rgb_pixel_pin = board.P1_04
rgb_num_pixels = 8
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,40 @@
from kb import KMKKeyboard
from kmk.extensions.led import LED
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
_______ = KC.TRNS
XXXXXXX = KC.NO
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
led = LED()
layers_ext = Layers()
keyboard.extensions = [rgb_ext, led]
keyboard.modules = [layers_ext]
BASE = 0
FN1 = 1
keyboard.keymap = [
[
KC.GESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.MINS, KC.EQL, KC.BSPC,
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.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.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
KC.LCTL, KC.LGUI, KC.LALT, KC.SPC, KC.RALT, KC.RGUI, KC.MO(FN1), KC.RCTL,
],
[
KC.GESC, 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.BSPC,
KC.RGB_TOG, _______, KC.UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC.LEFT, KC.DOWN, KC.RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC.LED_INC, KC.LED_DEC, KC.LED_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC.GRV, _______, _______, _______, _______, _______, _______, _______,
],
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,15 @@
# Iris Rev 2
A split keyboard with a 4x6 layout with additional 4 thumb buttons
kb.py is designed to work with the nice!nano
kb_converter.py is designed to work with an itsybitsy with converter board found [here](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

45
boards/keebio/iris/kb.py Normal file
View File

@@ -0,0 +1,45 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P1_00, board.P0_11, board.P1_04, board.P0_08, board.P0_22)
col_pins = (
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
)
diode_orientation = DiodeOrientation.COLUMNS
led_pin = board.P1_06
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 12
i2c = board.I2C
data_pin = board.P0_20
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# Buckle up friends, the bottom row of this keyboard is wild, and making
# our layouts match, visually, what the keyboard looks like, requires some
# surgery on the bottom two rows of coords
# Row index 3 is actually perfectly sane and we _could_ expose it
# just like the above three rows, however, visually speaking, the
# top-right thumb cluster button (when looking at the left-half PCB)
# is more inline with R3, so we'll jam that key (and its mirror) in here
coord_mapping.extend(ic(3, x) for x in range(6))
coord_mapping.append(ic(4, 2))
coord_mapping.append(ic(4, 9))
coord_mapping.extend(ic(3, x) for x in range(6, 12)) # Now, the rest of R3
# And now, to handle R4, which at this point is down to just six keys
coord_mapping.extend(ic(4, x) for x in range(3, 9))

View File

@@ -0,0 +1,45 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
# Pin mappings for converter board found at hardware/README.md
# QMK: MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
# QMK: MATRIX_ROW_PINS { D7, E6, B4, D2, D4 }
col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI)
row_pins = (board.D11, board.D10, board.D9, board.RX, board.D13)
diode_orientation = DiodeOrientation.COLUMNS
split_flip = True
split_offsets = (6, 6, 6, 6, 6)
split_type = 'UART'
data_pin = board.SCL
data_pin2 = board.SDA
rgb_num_pixels = 12
i2c = board.I2C
rgb_pixel_pin = board.TX
led_pin = board.D7
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# Buckle up friends, the bottom row of this keyboard is wild, and making
# our layouts match, visually, what the keyboard looks like, requires some
# surgery on the bottom two rows of coords
# Row index 3 is actually perfectly sane and we _could_ expose it
# just like the above three rows, however, visually speaking, the
# top-right thumb cluster button (when looking at the left-half PCB)
# is more inline with R3, so we'll jam that key (and its mirror) in here
coord_mapping.extend(ic(3, x) for x in range(6))
coord_mapping.append(ic(4, 2))
coord_mapping.append(ic(4, 9))
coord_mapping.extend(ic(3, x) for x in range(6, 12)) # Now, the rest of R3
# And now, to handle R4, which at this point is down to just six keys
coord_mapping.extend(ic(4, x) for x in range(3, 9))

View File

@@ -0,0 +1,95 @@
from kb import KMKKeyboard
from kmk.consts import UnicodeMode
from kmk.extensions.rgb import RGB
from kmk.handlers.sequences import compile_unicode_string_sequences as cuss
from kmk.handlers.sequences import send_string
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
keyboard.debug_enabled = False
keyboard.unicode_mode = UnicodeMode.LINUX
keyboard.tap_time = 750
emoticons = cuss({
# Emojis
'BEER': r'🍺',
'BEER_TOAST': r'🍻',
'FACE_CUTE_SMILE': r'😊',
'FACE_HEART_EYES': r'😍',
'FACE_JOY': r'😂',
'FACE_SWEAT_SMILE': r'😅',
'FACE_THINKING': r'🤔',
'FIRE': r'🔥',
'FLAG_CA': r'🇨🇦',
'FLAG_US': r'🇺🇸',
'HAND_CLAP': r'👏',
'HAND_HORNS': r'🤘',
'HAND_OK': r'👌',
'HAND_THUMB_DOWN': r'👎',
'HAND_THUMB_UP': r'👍',
'HAND_WAVE': r'👋',
'HEART': r'❤️',
'MAPLE_LEAF': r'🍁',
'POOP': r'💩',
'TADA': r'🎉',
'SHRUG_EMOJI': r'🤷',
# Emoticons, but fancier
'ANGRY_TABLE_FLIP': r'(ノಠ痊ಠ)ノ彡┻━┻',
'CELEBRATORY_GLITTER': r'+。:.゚ヽ(´∀。)ノ゚.:。+゚゚+。:.゚ヽ(*´∀)ノ゚.:。+゚',
'SHRUGGIE': r'¯\_(ツ)_/¯',
'TABLE_FLIP': r'(╯°□°)╯︵ ┻━┻',
})
WPM = send_string('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Bibendum arcu vitae elementum curabitur vitae nunc sed. Facilisis sed odio morbi quis.')
_______ = KC.TRNS
xxxxxxx = KC.NO
HELLA_TD = KC.TD(
KC.A,
KC.B,
send_string('macros in a tap dance? I think yes'),
KC.TG(1),
)
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
layers_ext = Layers()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
keyboard.extensions = [rgb_ext]
keyboard.modules = [split, layers_ext]
keyboard.keymap = [
[
KC.GESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.SLSH,
KC.LGUI, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENTER,
KC.LCTL, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.MO(2), KC.MO(1), KC.B, KC.M, KC.W, KC.V, KC.Z, KC.LALT,
KC.LEFT, KC.RGHT, KC.LSFT, KC.SPC, KC.UP, KC.DOWN,
],
[
_______, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.F10, KC.F11, KC.F12, xxxxxxx, xxxxxxx, _______,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.F7, KC.F8, KC.F9, xxxxxxx, xxxxxxx, KC.EQUAL,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.INS, KC.F4, KC.F5, KC.F6, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.NO, _______, KC.F1, KC.F2, KC.F3, xxxxxxx, xxxxxxx, _______,
KC.HOME, KC.END, _______, xxxxxxx, KC.PGUP, KC.PGDN,
],
[
KC.MUTE, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.LBRC, KC.RBRC, KC.DEL,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.BSLS,
KC.RGUI, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.MINS,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, _______, KC.VOLU, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.RALT,
KC.HOME, KC.END, _______, KC.VOLD, KC.PGUP, KC.PGDN,
],
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,15 @@
# Levinson Rev 2
A split keyboard with a 4x6 layout
kb.py is designed to work with the nice!nano
kb_converter.py is designed to work with an itsybitsy with converter board found [here](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,23 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P0_22, board.P1_00, board.P0_11, board.P1_04)
col_pins = (
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
)
diode_orientation = DiodeOrientation.COLUMNS
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 12
led_pin = board.P1_06
data_pin = board.P0_08
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,18 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI)
row_pins = (board.D13, board.D11, board.D10, board.D9)
diode_orientation = DiodeOrientation.COLUMNS
split_type = 'UART'
split_flip = True
split_offsets = [6, 6, 6, 6, 6]
data_pin = board.SCL
data_pin2 = board.SDA
rgb_pixel_pin = board.TX
led_pin = board.D7

View File

@@ -0,0 +1,132 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
layers_ext = Layers()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
keyboard.extensions = [rgb_ext]
keyboard.modules = [layers_ext, split]
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(3)
RAISE = KC.MO(4)
ADJUST = KC.MO(5)
keyboard.keymap = [
# Qwerty
# ,-----------------------------------------------------------------------------------.
# | Tab | Q | W | E | R | T | Y | U | I | O | P | Bak |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Esc | A | S | D | F | G | H | J | K | L | ; | " |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
# `-----------------------------------------------------------------------------------'
[
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
KC.GESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
# Colemak
# ,-----------------------------------------------------------------------------------.
# | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bak |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Esc | A | R | S | T | D | H | N | E | I | O | " |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
# `-----------------------------------------------------------------------------------'
[
KC.TAB, KC.Q, KC.W, KC.F, KC.P, KC.G, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
KC.GESC, KC.A, KC.R, KC.S, KC.T, KC.D, KC.H, KC.N, KC.E, KC.I, KC.O, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.K, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
# Dvorak
# ,-----------------------------------------------------------------------------------.
# | Tab | " | , | . | P | Y | F | G | C | R | L | Bak |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Esc | A | O | E | U | I | D | H | T | N | S | / |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
# `-----------------------------------------------------------------------------------'
[
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC,
KC.GESC, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.SLSH,
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.ENT,
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
# Lower
# ,-----------------------------------------------------------------------------------.
# | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Del | F1 | F2 | F3 | F4 | F5 | F6 | . | + | | \ | | |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | | | | | | | Next | Vol- | Vol+ | Play |
# `-----------------------------------------------------------------------------------'
[
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.DEL,
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY,
],
# Raise
# ,-----------------------------------------------------------------------------------.
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | | | | | | | Next | Vol- | Vol+ | Play |
# `-----------------------------------------------------------------------------------'
[
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY,
],
# Adjust
# ,-----------------------------------------------------------------------------------.
# | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | | | | | | | |Qwerty|Colemk|Dvorak| | |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | | | | | | | | | | | | |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | | | | | | | | | | |
# `-----------------------------------------------------------------------------------'
[
_______, _______, KC.RGB.TOG, KC.RGB.MOD, KC.RGB.HUD, KC.RGB.HUI, KC.RGB.SAD, KC.RGB.SAI, KC.RGB.VAD, KC.RGB.VAI, _______, KC.DEL,
_______, _______, _______, _______, _______, _______, _______, KC.DF(0), KC.DF(1), KC.DF(2), _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
],
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,16 @@
# Nyquist Rev 2
A split keyboard with a 5x6 layout
kb.py is designed to work with the nice!nano
kb_converter.py is designed to work with an itsybitsy with converter board found [here](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@@ -0,0 +1,23 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P0_22, board.P1_00, board.P0_11, board.P1_04, board.P1_06)
col_pins = (
board.P0_08,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
)
diode_orientation = DiodeOrientation.COLUMNS
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 12
data_pin = board.P0_08
led_pin = board.P0_09
i2c = board.I2C
powersave_pin = board.P0_13

View File

@@ -0,0 +1,15 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (board.RX, board.A1, board.A2, board.A3, board.A4, board.A5)
row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7)
diode_orientation = DiodeOrientation.COLUMNS
data_pin = board.SCL
rgb_num_pixels = 12
rgb_pixel_pin = board.TX
data_pin2 = board.SDA

View File

@@ -0,0 +1,151 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
layers_ext = Layers()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
keyboard.modules = [layers_ext, split]
keyboard.extensions = [rgb_ext]
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(3)
RAISE = KC.MO(4)
ADJUST = KC.MO(5)
keyboard.keymap = [
# Qwerty
# ,-----------------------------------------------------------------------------------.
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Esc | A | S | D | F | G | H | J | K | L | ; | " |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
# `-----------------------------------------------------------------------------------'
[
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.DEL,
KC.ESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
# Colemak
# ,-----------------------------------------------------------------------------------.
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Esc | A | R | S | T | D | H | N | E | I | O | " |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
# `-----------------------------------------------------------------------------------'
[
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
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.ESC, KC.A, KC.R, KC.S, KC.T, KC.D, KC.H, KC.N, KC.E, KC.I, KC.O, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.K, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
# Dvorak
# ,-----------------------------------------------------------------------------------.
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Esc | A | O | E | U | I | D | H | T | N | S | / |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
# `-----------------------------------------------------------------------------------'
[
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.DEL,
KC.ESC, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.SLSH,
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.ENT,
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
# Lower
# ,-----------------------------------------------------------------------------------.
# | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Del | F1 | F2 | F3 | F4 | F5 | F6 | . | + | | \ | | |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | | | | | | | Next | Vol- | Vol+ | Play |
# `-----------------------------------------------------------------------------------'
[
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.DEL,
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY,
],
# Raise
# ,-----------------------------------------------------------------------------------.
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | | | | | | | Next | Vol- | Vol+ | Play |
# `-----------------------------------------------------------------------------------'
[
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY,
],
# Adjust
# ,-----------------------------------------------------------------------------------.
# | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | Del |
# |------+------+------+------+------+-------------+------+------+------+------+------|
# | | | | | | | |Qwerty|Colemk|Dvorak| | |
# |------+------+------+------+------+------|------+------+------+------+------+------|
# | | | | | | | | | | | | |
# |------+------+------+------+------+------+------+------+------+------+------+------|
# | | | | | | | | | | | |
# `-----------------------------------------------------------------------------------'
[
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.RGB.TOG, KC.RGB.MOD, KC.RGB.HUD, KC.RGB.HUI, KC.RGB.SAD, KC.RGB.SAI, KC.RGB.VAD, KC.RGB.VAI, _______, KC.DEL,
_______, _______, _______, _______, _______, _______, _______, KC.DF(0), KC.DF(1), KC.DF(2), _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
],
]
if __name__ == '__main__':
keyboard.go()

46
boards/klarank.py Normal file
View File

@@ -0,0 +1,46 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.modules.layers import Layers
# Implements what used to be handled by KMKKeyboard.swap_indicies for this
# board, by flipping various row3 (bottom physical row) keys so their
# coord_mapping matches what the user pressed (even if the wiring
# underneath is sending different coordinates)
_r3_swap_conversions = {3: 9, 4: 10, 5: 11, 9: 3, 10: 4, 11: 5}
def r3_swap(col):
try:
return _r3_swap_conversions[col]
except KeyError:
return col
class KMKKeyboard(_KMKKeyboard):
# physical, visible cols (SCK, MO, MI, RX, TX, D4)
# physical, visible rows (10, 11, 12, 13) (9, 6, 5, SCL)
col_pins = (board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4)
row_pins = (
board.D10,
board.D11,
board.D12,
board.D13,
board.D9,
board.D6,
board.D5,
board.SCL,
)
rollover_cols_every_rows = 4
diode_orientation = DiodeOrientation.COLUMNS
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
coord_mapping.extend(ic(3, r3_swap(x)) for x in range(12))
layers_ext = Layers()
modules = [layers_ext]

20
boards/lily58/README.md Normal file
View File

@@ -0,0 +1,20 @@
# Lily 58 Pro
![Lily58](https://boardsource.imgix.net/af3d8d6d-5fbe-4578-a2ba-d09d7686fb29.jpg?raw=true)
The Lily58 is a 58 key split keyboard design by kata0510, featuring a 6x4 columnar stagger and 4 thumb cluster keys on each hand. The Lily58 is a perfect choice for people who want to be on a split keyboard but still want to have a fairly standard amount of keys.
Hardware Availability: [PCB & Case Source](https://github.com/kata0510/Lily58)
kb.py is designed to work with the nice!nano
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5ec9df84c6b834480de6c3d0)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

32
boards/lily58/kb.py Normal file
View File

@@ -0,0 +1,32 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
board.P0_09,
)
row_pins = (board.P0_24, board.P1_00, board.P0_11, board.P1_04, board.P1_06)
diode_orientation = DiodeOrientation.COLUMNS
uart_pin = board.P0_08
rgb_pixel_pin = board.P0_06
data_pin = board.P0_08
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
coord_mapping.extend(ic(3, x) for x in range(12))
# And now, to handle R4, which at this point is down to just ten keys
coord_mapping.extend(ic(4, x) for x in range(1, 11))

66
boards/lily58/main.py Normal file
View File

@@ -0,0 +1,66 @@
from kb import KMKKeyboard, rgb_pixel_pin
from kmk.extensions.ble_split import BLE_Split
from kmk.extensions.layers import Layers
from kmk.extensions.rgb import RGB
from kmk.keys import KC
keyboard = KMKKeyboard()
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.LT(3, KC.SPC)
RGB_TOG = KC.RGB_TOG
RGB_HUI = KC.RGB_HUI
RGB_HUD = KC.RGB_HUI
RGB_SAI = KC.RGB_SAI
RGB_SAD = KC.RGB_SAD
RGB_VAI = KC.RGB_VAI
RGB_VAD = KC.RGB_VAD
# Adding extensions
rgb = RGB(pixel_pin=rgb_pixel_pin, num_pixels=27, val_limit=100, hue_default=190, sat_default=100, val_default=5)
# TODO Comment one of these on each side
# Left is 0, Right is 1
split_side = 0
split_side = 1
split = BLE_Split(split_side=split_side)
layers_ext = Layers()
extensions = [layers_ext, split, rgb]
keyboard.keymap = [
[ #QWERTY
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #LOWER
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, XXXXXXX, XXXXXXX,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #RAISE
KC.ESC, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.EQL, KC.LCBR, KC.RCBR, KC.PIPE, KC.GRV,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #ADJUST
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,20 @@
# Reviung39
![Reviung39](https://boardsource.imgix.net/d6215164-6100-4b72-b355-1a67b7704463.jpg?raw=true)
Reviung39 is a 39 key keyboard designed by gtips. The Reviung39 sits somewhere between an Atreus and a Corne, you get some nice ergonomic benefits based on its quasi-split design and since a true split keyboard isn't for everyone, this is an awesome middle ground. I find this keyboard extremely comfortable to use.
kb.py is designed to work with the nice!nano
Hardware Availability: [PCB & Case Data](https://github.com/gtips/reviung)
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5ecb734486879c9a0c22dab3)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

27
boards/reviung39/kb.py Normal file
View File

@@ -0,0 +1,27 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (
board.P0_31,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
)
col_pins = (
board.P0_22,
board.P0_24,
board.P1_00,
board.P0_11,
board.P1_04,
board.P1_06,
)
diode_orientation = DiodeOrientation.COLUMNS
i2c = board.I2C
powersave_pin = board.P0_13

48
boards/reviung39/main.py Normal file
View File

@@ -0,0 +1,48 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.modtap import ModTap
keyboard = KMKKeyboard()
# Adding extensions
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels, val_limit=100, hue_default=190, sat_default=100, val_default=5)
modtap = ModTap()
layers_ext = Layers()
keyboard.modules = [layers_ext, modtap]
keyboard.extensions = [rgb]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
keyboard.keymap = [
[ #QWERTY
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.GRV,
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.MINS,
KC.LCTRL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.LBRC, KC.RBRC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.ENT, RAISE, KC.BSPC, KC.RGUI
],
[ #LOWER
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.GRV, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.TILD,
_______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
_______, _______, _______, _______, _______, _______, _______, _______
],
[ #RAISE
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, _______,
KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT, XXXXXXX,
KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, _______, _______, KC.PLUS, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
_______, _______, _______, _______, _______, _______, _______, _______
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,20 @@
# Reviung41
![Reviung41](https://boardsource.imgix.net/ea77f3f8-6cc4-4cb4-a801-cf58b5af8fcc.jpg?raw=true)
The Reviung41 is a 41 key keyboard designed by gtips, it is a slightly larger version of the popular Reviung 39. These "split non-split" keyboards offer a lot of features split keyboards have in terms of comfort and ergonomics but do so in a single-piece package. Many people consider keyboards in this style easier to travel with since you don't have to manage two halves and there is of course no need for a TRRS cable. This board sits somewhere between and Atreus and Corne, and it is extremely comfortable to use.
kb.py is designed to work with the nice!nano
Hardware Availability: [PCB & Case Data](https://github.com/gtips/reviung/tree/master/reviung41)
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5f2ef1b52bf5e8714a60f613)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

38
boards/reviung41/kb.py Normal file
View File

@@ -0,0 +1,38 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.P0_22,
board.P0_24,
board.P1_00,
board.P0_11,
board.P1_04,
board.P1_06,
)
row_pins = (
board.P0_31,
board.P0_29,
board.P0_02,
board.P1_15,
board.P1_13,
board.P1_11,
board.P0_10,
)
diode_orientation = DiodeOrientation.COLUMNS
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 11
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# And now, to handle R3, which at this point is down to just five keys
coord_mapping.extend(ic(3, x) for x in range(5))

64
boards/reviung41/main.py Normal file
View File

@@ -0,0 +1,64 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.modtap import ModTap
keyboard = KMKKeyboard()
# Adding extensions
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels, val_limit=100, hue_default=190, sat_default=100, val_default=5)
modtap = ModTap()
layers_ext = Layers()
keyboard.modules = [layers_ext, modtap]
keyboard.extensions = [rgb]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.LT(3, KC.SPC)
RSFT_ENT = KC.MT(KC.ENT, KC.RSFT)
RSFT_SPC = KC.MT(KC.SPC, KC.RSFT)
RGB_TOG = KC.RGB_TOG
RGB_HUI = KC.RGB_HUI
RGB_HUD = KC.RGB_HUI
RGB_SAI = KC.RGB_SAI
RGB_SAD = KC.RGB_SAD
RGB_VAI = KC.RGB_VAI
RGB_VAD = KC.RGB_VAD
keyboard.keymap = [
[ #QWERTY
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, RSFT_ENT,
KC.LALT, LOWER, KC.SPC, RAISE, KC.RGUI,
],
[ #LOWER
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, XXXXXXX, XXXXXXX,
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RSFT_SPC,
KC.LALT, LOWER, KC.SPC, RAISE, KC.RGUI,
],
[ #RAISE
KC.ESC, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.EQL, KC.LCBR, KC.RCBR, KC.PIPE, KC.GRV,
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,
KC.LALT, LOWER, KC.SPC, RAISE, KC.RGUI,
],
[ #ADJUST
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC.LALT, LOWER, KC.SPC, RAISE, KC.RGUI,
]
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -0,0 +1,19 @@
# Rhymestone
![rhymestone](https://boardsource.imgix.net/0968c21e-ed0c-47ec-ae5e-511ec6eb3bd2.jpg?raw=true)
The Rhymestone is 40-key ortholinear split keyboard. Originally the Rhymestone was created to be sold alongside the Treadstone and used as either a Macro pad or a 10-key numpad, hence the similar naming conventions. However; the Rhymestone is also often used as a standalone split keyboard by people who prefer a 5 column ortholinear layout.
kb.py is designed to work with the nice!nano
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5ecb6aee86879c9a0c22da89)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

15
boards/rhymestone/kb.py Normal file
View File

@@ -0,0 +1,15 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.P0_31, board.P0_29, board.P0_02, board.P1_15)
col_pins = (board.P0_22, board.P0_24, board.P1_00, board.P0_11, board.P1_04)
diode_orientation = DiodeOrientation.COLUMNS
rgb_pixel_pin = board.P0_06
rgb_num_pixels = 40
data_pin = board.P0_08
i2c = board.I2C
powersave_pin = board.P0_13

51
boards/rhymestone/main.py Normal file
View File

@@ -0,0 +1,51 @@
from kb import KMKKeyboard
from kmk.extensions.layers import Layers
from kmk.extensions.split import Split, SplitSide, SplitType
from kmk.keys import KC
keyboard = KMKKeyboard()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
split = Split(split_type=SplitType.BLE, split_side=split_side)
layers_ext = Layers()
keyboard.extensions = [layers_ext, split]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
LOWER = KC.MO(2)
RAISE = KC.MO(1)
KC_Z_SF = KC.LSFT(KC.Z)
KC_SLSF = KC.RSFT(KC.SLSH)
KC_11SF = KC.LSFT(KC.F11)
KC_GRSF = KC.RSFT(KC.GRV)
keyboard.keymap = [
[ #QWERTY
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,
KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.ENT,
KC.Z_SF, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSF,
KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.BSPC, KC.SPC, RAISE, KC.RGUI, KC.APP, KC.RCTL
],
[ #RAISE
KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0,
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT, KC.RSFT,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.RO, KC.COMM, KC.DOT, KC.SLSF,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
],
[ #LOWER
KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, XXXXXXX, XXXXXXX, XXXXXXX, KC.SCLN, KC.QUOT,
KC.N11SF, KC.F12, KC.ESC, KC.TAB, _______, KC.DEL, XXXXXXX, XXXXXXX, KC.RO, KC.GRSF,
_______, _______, _______, _______, KC.DEL, _______, _______, _______, _______, _______
]
]
if __name__ == '__main__':
keyboard.go()

17
boards/tg4x/README.md Normal file
View File

@@ -0,0 +1,17 @@
# TG4X
![TG4X](https://boardsource.imgix.net/d50e1163-06dd-4c18-826e-caacd0a4a33d.jpg?raw=true)
TG4X is a 45% staggered keyboard, compared to a standard 40% stagger it has one additional column which makes it an approachable and highly use-able 40%-ish stagger.
kb.py is designed to work with the nice!nano
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5eff7ead037395179221b90c)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

31
boards/tg4x/kb.py Normal file
View File

@@ -0,0 +1,31 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (
board.P1_06,
board.P1_04,
board.P0_11,
board.P1_00,
board.P0_24,
board.P0_22,
board.P0_20,
board.P0_17,
)
col_pins = [
board.P0_06,
board.P1_11,
board.P1_13,
board.P1_15,
board.P0_02,
board.P0_29,
board.P0_31,
]
diode_orientation = DiodeOrientation.COLUMNS
rgb_pixel_pin = board.P0_08
rgb_num_pixels = 6
i2c = board.I2C
powersave_pin = board.P0_13

36
boards/tg4x/main.py Normal file
View File

@@ -0,0 +1,36 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
# Adding extensions
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels, val_limit=100, hue_default=190, sat_default=100, val_default=5)
layers_ext = Layers()
keyboard.modules = [layers_ext]
keyboard.extensions = [rgb]
keyboard.keymap = [
[ #QWERTY
KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.MINS, KC.DEL,\
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.QUOT, KC.ENT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
KC.LCTL, KC.LGUI, KC.LALT, KC.SPACE, KC.SPACE, KC.RALT, KC.RGUI, KC.RCTL, KC.MO(1)\
],
[ #LOWER
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
],
]
if __name__ == '__main__':
keyboard.go()

View File

@@ -1,3 +1,3 @@
import supervisor
supervisor.set_next_stack_limit(4096 + 1024)
supervisor.set_next_stack_limit(4096 + 4096)

10
build_kmkpython_release.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/sh
TIMESTAMP=$(date +%s)
TARGETS=${TARGETS:-"nice_nano itsybitsy_nrf52840_express"}
for TARGET in ${TARGETS}; do
make -C /opt/kmkpython/ports/nrf BOARD="${TARGET}"
cp "/opt/kmkpython/ports/nrf/build-${TARGET}/firmware.uf2" "/dist/${TARGET}-${TIMESTAMP}.uf2"
echo "===> Built /dist/${TARGET}-${TIMESTAMP}.uf2"
done

94
docs/Getting_Started.md Normal file
View File

@@ -0,0 +1,94 @@
# Getting Started
> Life was like a box of chocolates. You never know what you're gonna get.
KMK is a keyboard focused layer that sits on top of [CircuitPython](https://circuitpython.org/). As such, it should work with most [boards that support CircuitPython](https://circuitpython.org/downloads). It is best to use the last stable version (>5.0).
Known working and recommended devices can be found [here](Officially_Supported_Microcontrollers.md)
We are also providing a keyboard optimized version of CircuitPython (simplified to cope with memory limits of certain boards and with a selection of preinstalled relevant modules). If you're wondering why use KMKPython rather than barebone CircuitPython, we tried to compare both approaches [here](kmkpython_vs_circuitpython.md)
<br>
## TL;DR Quick start guide
> To infinity and beyond!
1. [Install CircuitPython on your board](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython). With most boards, it should be as easy as drag and dropping the firmware on the drive
2. Get a [copy of KMK](https://github.com/KMKfw/kmk_firmware/archive/refs/heads/master.zip) from the master branch
3. Unzip it and copy the KMK folder and the boot.py file at the root of the USB drive corresponding to your board (often appearing as CIRCUITPY)
4. Create a new *code.py* or *main.py* file in the same root directory (same level as boot.py) with the example content hereunder:
***IMPORTANT:*** adapt the GP0 / GP1 pins to your specific board ! <br>
```
print("Starting")
import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.matrix import DiodeOrientation
keyboard = KMKKeyboard()
keyboard.col_pins = (board.GP0,)
keyboard.row_pins = (board.GP1,)
keyboard.diode_orientation = DiodeOrientation.COL2ROW
keyboard.keymap = [
[KC.A,]
]
if __name__ == '__main__':
keyboard.go()
```
5. With a wire / paperclip / whatever, connect GPIO 0 & GPIO 1 together (or the pins you chose for your boards)
6. If it prints a "A" (or a "Q" or ... depending on your keyboard layout), you're done!
<br>
## Now that you're up and running, you may want to go further...
> This is your last chance. After this, there is no turning back. You take the blue pill—the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill—you stay in Wonderland, and I show you how deep the rabbit hole goes. Remember: all I'm offering is the truth. Nothing more.
### You're extremely lucky and you have a fully supported keyboard
If your keyboard and microcontroller are officially supported, simply visit the page for your files, and dropping them on the root of the "flash drive". Those pages can be found [here](https://github.com/KMKfw/boards). You will need the `kb.py` and `main.py`. More advanced instructions can be found [here](config_and_keymap.md).
Please note that we recommend using [KMKPython](https://github.com/KMKfw/kmkpython) for these boards as it is optimized for them. If using Circuitpython and NOT KMKPython, you will also need [boot.py](https://github.com/KMKfw/kmk_firmware/blob/master/boot.py)
### You've got another, maybe DIY, board and want to customise KMK for it
First, be sure to understand how your device work, and particularly its specific matrix configuration. You can have a look [here](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) or read the [guide](https://docs.qmk.fm/#/hand_wire) provided by the QMK team for handwired keyboards
<br>Once you've got the gist of it:
- You can have a look [here](config_and_keymap.md) and [here](keys.md) to start customizing your code.py / main.py file
- There's a [reference](keycodes.md) of the available keycodes
- [International](international.md) extension adds keys for non US layouts and [Media Keys](media_keys.md) adds keys for ... media
And to go even further:
- [Sequences](sequences.md) are used for sending multiple keystrokes in a single action
- [Layers](layers.md) can transform the whole way your keyboard is behaving with a single touch
- [ModTap](modtap.md) allow you tu customize the way a key behaves wether it is tapped or hold, and [TapDance](tapdance.md) depending on the number of times it is pressed
Want to have fun features such as RGB, split keyboards and more? Check out what builtin [modules](modules.md) and [extensions](extensions.md) can do!
You can also get ideas from the various [user examples](https://github.com/KMKfw/user_keymaps) that we provide and dig into our [documentation](https://github.com/KMKfw/kmk_firmware/tree/master/docs)
<br>
## Additional help and support
> Roads? Where we're going we don't need roads.
In case you need it, debugging help can be found [here](debugging.md)
If you need support with KMK or just want to say hi, find us in
[#kmkfw:klar.sh on Matrix](https://matrix.to/#/#kmkfw:klar.sh). This channel is
bridged to Discord [here](https://discordapp.com/widget?id=493256121075761173&theme=dark)
for convenience. If you ask for help on chat or open a bug report, if possible
please give us your commit SHA, found by running
`from kmk.consts import KMK_RELEASE; print(KMK_RELEASE)` in the REPL on your
controller.

View File

@@ -0,0 +1,62 @@
# Officially supported microcontrollers
While most Circuitpython devices are great for hand wired keyboards, most
keyboards are designed to accept a Pro Micro. The boards listed below either
are, or can be adapted to that pinout to use common keyboards already on the market.
## Nice!Nano
Features include
- Pro Micro pinout
- Both USB HID and Bluetooth support
- Can do bluetooth split keyboards with no wires at all
- Has battery support including charging
Downsides
- $25 USD per microcontroller at most retailers
Common Retailers
[Boardsource](https://boardsource.xyz/store/5f4a1733bbaa5c635b83ed67)
[NiceKeyboards](https://nicekeyboards.com/collections/group-buy/products/nice-nano-v1-0).
## ItsyBitsy M4 Express
Features include
- Affordable at $15 USD
- Can run most features of KMK including RGB
Downsides
- Needs adapted to work with Pro Micro pinout keyboards. Adapter can be found
[HERE](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
Common Retailers
[Adafruit](https://www.adafruit.com/product/3800)
## RP2040
Features include
- Very affordable
- Very powerful for the price
Downsides
- Little support for keyboard kits
Common Retailers
[Adafruit](https://www.adafruit.com/pico?src=raspberrypi)
[Sparkfun](https://www.sparkfun.com/products/17829?src=raspberrypi)
## Adafruit ItsyBitsy nRF52840 Express
Features include
- Both USB HID and Bluetooth support
- More affordable than the Nice!Nano at only $18
Downsides
- Needs adapted to work with Pro Micro pinout keyboards. Adapter can be found
[HERE](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
- No battery support without addon board found
[HERE](https://www.adafruit.com/product/2124)
Common Retailers
[Adafruit](https://www.adafruit.com/product/4481)
## Other microcontrollers
What you'll need to have at minimum
- CircuitPython/KMKpython
- 256KB of flash storage
- HID over USB and/or Bluetooth.

18
docs/adns9800.md Normal file
View File

@@ -0,0 +1,18 @@
# ADNS9800
Add this module for controlling ADNS9800 optical sensor.
```python
from kmk.modules.adns9800 import ADNS9800
keyboard.modules.append(ADNS9800(cs=board.GP0, sclk=board.GP2, miso=board.GP4, mosi=board.GP3, invert_y=True))
```
Firmware for this sensor has to be obtained separately and placed in kmk\modules\adns9800_firmware.py
```python
firmware = (
b'\x03'
b'\xa6'
...
)
```
## Constructor parameters
ADNS9800(cs=*cs_pin*, sclk=*clock_pin*, miso=*miso_pin*, mosi=*mosi_pin*, invert_x=*False*, invert_y=*False*)

33
docs/ble_hid.md Normal file
View File

@@ -0,0 +1,33 @@
# BLE HID
Bluetooth connections help clean up the wire mess!
## Circuitpython
If not running KMKpython, this does require the adafruit_ble library from Adafruit.
This can be downloaded
[here](https://github.com/adafruit/Adafruit_CircuitPython_BLE/tree/master/adafruit_ble).
It is part of the [Adafruit CircuitPython Bundle](https://github.com/adafruit/Adafruit_CircuitPython_Bundle).
Simply put this in the "root" of your circuitpython device. If unsure, it's the folder with main.py in it, and should be the first folder you see when you open the device.
## Enabling BLE
To enable BLE hid, change the keyboard.go(). By default, the advertised name
will be the name of the "flash drive". By default this is CIRCUITPY
```python
from kmk.hid import HIDModes
if __name__ == '__main__':
keyboard.go(hid_type=HIDModes.BLE)
```
## Changing the advertise name
There are two ways to change the advertising name. The first would be to
[change the name of the drive](https://learn.adafruit.com/welcome-to-circuitpython/the-circuitpy-drive).
The second would be to change the keyboard.go() like this.
```python
if __name__ == '__main__':
keyboard.go(hid_type=HIDModes.BLE, ble_name='KMKeyboard')
```

84
docs/config_and_keymap.md Normal file
View File

@@ -0,0 +1,84 @@
# Configuring KMK
KMK is configured through a rather large plain-old-Python class called
`KMKKeyboard`. Subclasses of this configuration exist which pre-fill defaults
for various known keyboards (for example, many QMK, TMK, or ZMK keyboards
are supported with a nice!nano, or through our ItsyBitsy to ProMicro pinout adapter.
This class is the main interface between end users and the inner workings of KMK.
Let's dive in!
- Edit or create a file called `main.py` on your `CIRCUITPY` drive. You can also
keep this file on your computer (perhaps under `user_keymaps` - please feel
free to submit a pull request with your layout definitions!) and copy it over
(either manually or, if you're adept with developer tooling and/or a command
line, [our
Makefile](https://github.com/KMKfw/kmk_firmware/blob/master/docs/flashing.md)).
It's definitely recommended to keep a backup of your configuration somewhere
that isn't the microcontroller itself - MCUs die, CircuitPython may run into
corruption bugs, or you might just have bad luck and delete the wrong file
some day.
- Assign a `KMKKeyboard` instance to a variable (ex. `keyboard = KMKKeyboard()` - note
the parentheses)
- Make sure this `KMKKeyboard` instance is actually run at the end of the file with
a block such as the following:
```python
if __name__ == '__main__':
keyboard.go()
```
- Assign pins and your diode orientation (only necessary on handwire keyboards),
for example:
```python
import board
from kmk.matrix import DiodeOrientation
col_pins = (board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4)
row_pins = (board.D10, board.D11, board.D12, board.D13, board.D9, board.D6, board.D5, board.SCL)
rollover_cols_every_rows = 4
diode_orientation = DiodeOrientation.COL2ROW
```
The pins should be based on whatever CircuitPython calls pins on your particular
board. You can find these in the REPL on your CircuitPython device:
```python
import board
print(dir(board))
```
> Note: `rollover_cols_every_rows` is only supported with
> `DiodeOrientation.COLUMNS`/`DiodeOrientation.COL2ROW`, not `DiodeOrientation.ROWS`/`DiodeOrientation.ROW2COL`. It is used for boards
> such as the Planck Rev6 which reuse column pins to simulate a 4x12 matrix in
> the form of an 8x6 matrix
- Import the global list of key definitions with `from kmk.keys import KC`. You
can either print this out in the REPL as we did with `board` above, or simply
look at [our Key
documentation](https://github.com/KMKfw/kmk_firmware/blob/master/docs/keycodes.md).
We've tried to keep that listing reasonably up to date, but if it feels like
something is missing, you may need to read through `kmk/keys.py` (and then
open a ticket to tell us our docs are out of date, or open a PR and fix the
docs yourself!)
- Define a keymap, which is, in Python terms, a List of Lists of `Key` objects.
A very simple keymap, for a keyboard with just two physical keys on a single
layer, may look like this:
```python
keyboard.keymap = [[KC.A, KC.B]]
```
You can further define a bunch of other stuff:
- `keyboard.debug_enabled` which will spew a ton of debugging information to the serial
console. This is very rarely needed, but can provide very valuable information
if you need to open an issue.
- `keyboard.tap_time` which defines how long `KC.TT` and `KC.LT` will wait before
considering a key "held" (see `layers.md`)

View File

@@ -1,9 +1,9 @@
# Debugging
Debug will output most of the useful state to the console. This can be enable in your firmware
by setting this in your keymap. NOTE that it will be MUCH slower, so only enable this when you
by setting this in your keymap. NOTE that it will be slower, so only enable this when you
need debugging.
```python
DEBUG_ENABLE = True
keyboard.debug_enabled = True
```
The output can be viewed by connecting to the serial port of the keybord. Please refer to [THIS](https://learn.adafruit.com/welcome-to-circuitpython/kattni-connecting-to-the-serial-console) for

59
docs/encoder.md Normal file
View File

@@ -0,0 +1,59 @@
# Encoder
Add twist control to your keyboard! Volume, zoom, anything you want.
## Enabling the extension
The constructor(`EncoderHandler` class) takes a minimum of 3 arguments: a list of pad_a pins, a list of pad_b pins,
and an encoder_map. The encoder_map is modeled after the keymap and works the
same way. It should have as many layers as your keymap, and use KC.NO keys for
layers that you don't require any action. The encoder supports a velocity mode
if you desire to make something for video or sound editing. The direction of
increment/decrement can be changed to make sense for the direction the knob is
turning by setting the is_inverted flag.
## Configuration
There is a complete example in the Atreus62 [main.py](/boards/atreus62/main.py)
Create the encoder_map.
> Anatomy of an encoder_map tuple: (increment_key, decrement_key, keys presses per encoder click)
> `encoder_map` is a Nested List with a Tuple as the list element (`List[List[Tuple(Key,Key,Int)]]`)
```python
from kmk.modules.encoder import EncoderHandler # import the Encoder module
Zoom_in = KC.LCTRL(KC.EQUAL)
Zoom_out = KC.LCTRL(KC.MINUS)
# create the encoder map, modeled after the keymap
encoder_map = [
[
# Only 1 encoder is being used, so only one tuple per layer is required
# Increment key is volume up, decrement key is volume down, and sends 2
# key presses for every "click" felt while turning the encoder.
(KC.VOLU,KC.VOLD,2),
],
[
# only one key press sent per encoder click
(Zoom_in, Zoom_out,1),
],
[
# No action keys sent here, the resolution is a dummy number, to be
# removed in the future.
(_______,_______,1),#
]
]
# create the encoder instance, and pass in a list of pad_a pins, a list of pad_b
# pins, and the encoder map created above
encoder_ext = EncoderHandler([board.D40],[board.D41], encoder_map)
# if desired, you can flip the incrfement/decrement direction of the knob by
# setting the is_inerted flag to True. If you turn the knob to the right and
# the volume goes down, setting this flag will make it go up. It's default
# setting is False
encoder_ext.encoders[0].is_inverted = True
# Make sure to add the encoder_ext to the modules list
keyboard.modules = [encoder_ext]
```

14
docs/extensions.md Normal file
View File

@@ -0,0 +1,14 @@
# Extensions
Extensions add features that change the experience, but not the core features of
the keyboard. They are meant to be easy to add, and create your own. These live in
a sandbox to help prevent any bad code from crashing your keyboard.
## Core Extensions
These extensions are provided in all builds and can be enabled. Currently offered
extensions are
- [International](international.md): Adds international keycodes
- [LED](led.md): Adds backlight support. This is for monocolor backlight, not RGB
- [MediaKeys](media_keys.md): Adds support for media keys such as volume
- [RGB](rgb.md): RGB lighting for underglow. Will work on most matrix RGB as will
be treated the same as underglow.

View File

@@ -1,26 +1,38 @@
# Flashing Instructions
KMK sits on top of an existing CircuitPython install, flash that for your board
as appropriate (see [Adafruit's
documentation](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython),
though it doesn't cover all CircuitPython boards - you may need to glance around
the CircuitPython source or ask on Discord). We primarily target CircuitPython
4.0-alpha1 and above, though many features should work on 3.x. You'll only need
to flash CircuitPython once (unless we update our baseline supported version).
In general, we recommend using the instructions in `README.md`, however, mostly
as a development artifact, another method of flashing KMK exists (tested and
supported only on Linux, though it should also work on MacOS, the BSDs, and
other Unix-likes. It may also work on Cygwin and the Windows Subsystem for
Linux).
After CircuitPython has been flashed, a `CIRCUITPY` drive should show up on your
computer (some Linux/BSD users without drive automounting will want to poke
around `dmesg` to find the drive identifier and mount this drive manually
somewhere - ex. `mkdir -p ~/mnt && sudo mount -o uid=1000,gid=1000 /dev/sdf1
~/mnt`, where `uid` and `gid` are your user ID and primary group ID, as found in
`id -u` and `id -g`). Take note of the path that this is mounted to (for MacOS
users, this will probably look something like `/Volumes/CIRCUITPY`).
Given `make` and `rsync` are available on your system (in `$PATH`), the
following will copy the `kmk` tree to your CircuitPython device, and will copy
the file defined as `USER_KEYMAP` as your `main.py`. It will also copy our
`boot.py`, which allocates a larger stack size (simply - more of the device's
RAM will be available to KMK and your keyboard config) than CircuitPython's
default. If any of these files exist on your CircuitPython device already, they
will be overwritten without a prompt.
To "flash" all of KMK, your keymap, and a basic `main.py` that will start
everything up, run `make MOUNTPOINT=/path/to/wherever
USER_KEYMAP=path/to/keymap.py`. For example, if my `CIRCUITPY` volume is mounted
to `~/mnt`, I might flash my development breadboard with the following:
If you get permissions errors here, **don't run make as root or with sudo**. See
`Troubleshooting` below.
```sh
make MOUNTPOINT=~/mnt USER_KEYMAP=user_keymaps/klardotsh/itsybitsy_m4_express/threethree.py
make MOUNTPOINT=/media/CIRCUITPY USER_KEYMAP=user_keymaps/nameofyourkeymap.py BOARD=board/nameofyourboard/kb.py
```
# Troubleshooting
## Linux/BSD
Check to see if your drive may have mounted elsewhere with a GUI tool or other
automounter. Most of these tools will mount your device under `/media`, probably
as `/media/CIRCUITPY`. If it's not mounted, you can read up on how to mount a
drive manually
[here](https://wiki.archlinux.org/index.php/File_systems#Mount_a_file_system).
For example,
`sudo mount -o uid=$(id -u),gid=$(id -g) /dev/disk/by-label/CIRCUITPY ~/mnt`
If you're still having issues, check out our support page to see where you can
come say hi and the community will gladly help you out.

6
docs/handwiring.md Normal file
View File

@@ -0,0 +1,6 @@
# Handwire keyboards
This guide will not talk about the physical wiring. Check out our
[recommended microcontrollers](Officially_Supported_Microcontrollers.md) and
follow the amazing guide for that [here](https://docs.qmk.fm/#/hand_wire). That
guide can be followed until you are setting up the firmware. After wiring the
keyboard, you can refer to our porting guide [here](porting_to_kmk.md)

View File

@@ -1,48 +0,0 @@
## Supported Devices
| Board | Chipset | Python Platform | Notes |
| ----- | ------- | --------------- | ----- |
| [Adafruit Feather M4 Express](https://www.adafruit.com/product/3857) | Atmel SAMD51 (Cortex M4F) | CircuitPython | An economical solution for basic USB keyboards |
| [Adafruit ItsyBitsy M4 Express](https://www.adafruit.com/product/3800) | Atmel SAMD51 (Cortex M4F) | CircuitPython | A smaller solution for basic USB keyboards |
## Community Supported
| Board | Chipset | Python Platform | Maintainer | Notes |
| ----- | ------- | --------------- | ----- | ----- |
| [pyboard v1.1](https://www.adafruit.com/product/2390) | STM32F405RG (Cortex M4F) | MicroPython | kdb424 | Very large and expensive, and has ram limitations. |
## Support Planned/WIP
| Board | Chipset | Python Platform | Notes |
| ----- | ------- | --------------- | ----- |
| [Seeed nRF52840 Micro Dev Kit](https://www.seeedstudio.com/nRF52840-Micro-Development-Kit-p-3079.html) | nRF52840 | [CircuitPython](https://github.com/KMKfw/circuitpython/tree/topic-nrf52840-mdk) | This is basically as bleeding edge as it gets. Will support BLE HID to PC as well as BLE split boards |
| [Planck rev6 Keyboard](https://olkb.com/planck) | STM32 of some sort | MicroPython | Requires porting MicroPython to STM32F3, this work has begun but I'm pretty terrible at it. |
| [Proton C Controller?](https://www.reddit.com/r/MechanicalKeyboards/comments/87cw36/render_of_the_qmk_proton_c_qmkpowered_pro_micro/) | ??? | ??? | Does not exist yet, the controller from a Planck rev6 in a Pro Micro pin-compat controller chip |
## Unsupported Devices
Here's a list of problematic, but possibly usable microcontrollers:
| Board | Chipset | Python Platform | Notes |
| ----- | ------- | --------------- | ------------------ |
| [Adafruit Feather Huzzah](https://www.adafruit.com/product/2821) | ESP8266 | CircuitPython | Suuuuuper limited on GPIO lanes, Lack USB HID (HW) |
| [Adafruit HUZZAH32](https://www.adafruit.com/product/3405) | ESP32 | MicroPython | This may work as a BLE HID device, or with a GPIO-based USB breakout. Lacks USB HID (HW) |
| [Adafruit Feather nRF52 BLE Controller](https://www.adafruit.com/product/3406) | nRF52832 | CircuitPython | Lacks USB HID (HW), but could be fixed with GPIO USB breakout. BLE HID should be possible, but it's considered somewhat unstable. This chip is considered "mostly unsupported" in CircuitPython at the time of writing. |
## Porting new devices
Pull requests are welcome and encouraged to add support for new
keyboards/microcontrollers. The base requirements for device support
- CircuitPython or MicroPython
- 256KB of flash storage
- HID over USB or Bluetooth.
## Secondary Support
In the future, secondary support for lesser contollers is planned. One of
these cases is the pro micro being used for a slave half of a split keyboard
while all actual work is being done by a supported board. This could also be
used to convert boards that use USB or i2c that run lesser chips to a KMK
board, with a supported board acting as a translation layer. Support for
a converter is planned with the inspiration coming from the [Hasu USB to
USB Controller Converter](https://www.1upkeyboards.com/shop/controllers/usb-to-usb-converter/) and would allow for conversion to KMK as
opposed to TMK or QMK with that board.

35
docs/international.md Normal file
View File

@@ -0,0 +1,35 @@
# International Keycodes
International extension adds keys for non US layouts. It can simply be added to
the extensions list.
```python
from kmk.extensions.international import International
keyboard.extensions.append(International())
```
## Keycodes
|Key |Aliases |Description |
|-----------------------|--------------------|-----------------------------------------------|
|`KC.NONUS_HASH` |`KC.NUHS` |Non-US `#` and `~` |
|`KC.NONUS_BSLASH` |`KC.NUBS` |Non-US `\` and <code>&#124;</code> |
|`KC.INT1` |`KC.RO` |JIS `\` and <code>&#124;</code> |
|`KC.INT2` |`KC.KANA` |JIS Katakana/Hiragana |
|`KC.INT3` |`KC.JYEN` |JIS `¥` |
|`KC.INT4` |`KC.HENK` |JIS Henkan |
|`KC.INT5` |`KC.MHEN` |JIS Muhenkan |
|`KC.INT6` | |JIS Numpad `,` |
|`KC.INT7` | |International 7 |
|`KC.INT8` | |International 8 |
|`KC.INT9` | |International 9 |
|`KC.LANG1` |`KC.HAEN` |Hangul/English |
|`KC.LANG2` |`KC.HANJ` |Hanja |
|`KC.LANG3` | |JIS Katakana |
|`KC.LANG4` | |JIS Hiragana |
|`KC.LANG5` | |JIS Zenkaku/Hankaku |
|`KC.LANG6` | |Language 6 |
|`KC.LANG7` | |Language 7 |
|`KC.LANG8` | |Language 8 |
|`KC.LANG9` | |Language 9 |

110
docs/ja/Getting_Started.md Normal file
View File

@@ -0,0 +1,110 @@
# はじめに
> Life was like a box of chocolates. You never know what you're gonna get.
KMKは[CircuitPython](https://circuitpython.org/)の上に配置されるキーボード用の実装レイヤーです。
そのため、[CircuitPythonをサポートするほとんどのボード](https://circuitpython.org/downloads)と互換性があります。
最新の安定したバージョンを使用することをおすすめします。(>5.0)
使用可能やおすすめなデバイスは[こちら](Officially_Supported_Microcontrollers.md)から確認できます。
CircuitPythonの最適化バージョン特定のボードの容量制限に対処した、プリインストールされた関連モジュールの選択が可能なバージョンも提供しています。
なぜCircuitPythonよりKMKPythonを使用するか気になっていたら、両方を比較した[実績](kmkpython_vs_circuitpython.md)があります。
<br>
## TL;DR クイックスタートガイド
> To infinity and beyond!
1. CircuitPythonをボードに[インストール](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython)する。
2. マスターブランチから[KMKのコピー](https://github.com/KMKfw/kmk_firmware/archive/refs/heads/master.zip)を取得。
3. ファイルを展開し、KMKフォルダーとboot.pyファイルをUSBドライブのルートCIRCUITPYと表示されることが多いにコピーする。
4. 同じルートディレクトリーboot.pyと同レベルに新規で*code.py* または *main.py*のファイルを作成する。中身は以下の例とする。
***重要:*** GP0 / GP1 ピンを使用ボードに合わせて下さい!<br>
```
print("Starting")
import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.matrix import DiodeOrientation
keyboard = KMKKeyboard()
keyboard.col_pins = (board.GP0,)
keyboard.row_pins = (board.GP1,)
keyboard.diode_orientation = DiodeOrientation.COL2ROW
keyboard.keymap = [
[KC.A,]
]
if __name__ == '__main__':
keyboard.go()
```
1. ワイヤーなどでGPIO 0とGPIO 1またはほかに指定したピンを接続する。
2. "A"や"Q"(キーボードのレイアウトによって異なる)が表示されたら、完成!
<br>
## とりあえず一通り動くようになったので、もっとに先へ進みたい場合
> This is your last chance. After this, there is no turning back. You take the blue pill—the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill—you stay in Wonderland, and I show you how deep the rabbit hole goes. Remember: all I'm offering is the truth. Nothing more.
### フルサポートされているキーボードを持っている場合
あなたのキーボードとマイコンが正式にサポートされている場合、[こちらのページ](https://github.com/KMKfw/boards)から`kb.py``main.py`を"flash drive"のルートに落とす必要があります。より高度な手順は[こちら](config_and_keymap.md)から確認できます。
このボードに最適化されているため、 [KMKPython](https://github.com/KMKfw/kmkpython) の使用を推奨します。
Circuitpythonを使用する場合、 [boot.py](https://github.com/KMKfw/kmk_firmware/blob/master/boot.py)も必要になります。
### ほかに自作ボードなどを持っていて、カスタマイズされたKMKを導入したい場合
最初にデバイスの動作や具体的なマトリックス構成についてしっかり理解してください。
QMKチームが提供している手配線キーボード用の[ガイド](https://docs.qmk.fm/#/hand_wire)と[ドキュメント](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) を確認できます。
<br>要旨をつかめてきたら:
- [ここ](config_and_keymap.md) と [ここ](keys.md)を見て、code.py / main.py ファイルをカスタイマイズできます。
- 使用可能なキーコードの[リファレンス](keycodes.md)があります。
- [インターナショナル](international.md)は、US配列以外のキーボードにキーを追加する拡張機能で、[メディアキー](media_keys.md)は・・・メディアにキーを追加する拡張機能です。
さらに先へ進むと:
- [シーケンス](sequences.md) 一つのアクションで複数のキーストロークを送信するために使用します。
- [レイヤー](layers.md)でタッチ一つでキーボードの全体の動きを変えることができます。
- [モドタップ](modtap.md) でキーの押し/長押しの動作を設定し、何回押されたかによって[タップダンス](tapdance.md)を設定します。
RGBや分裂型などの機能を楽しめたい場合は、ビルトイン[モジュール](modules.md)と[拡張機能](extensions.md)を見てみてください!
私たちが提供する、いろんな [ユーザー事例](https://github.com/KMKfw/user_keymaps)や[ドキュメント](https://github.com/KMKfw/kmk_firmware/tree/master/docs)からアイデアを得ることもできます。
<br>
## ヘルプ/サポート
> Roads? Where we're going we don't need roads.
デバッグについてのヘルプが必要な場合は[こちら](debugging.md)。
KMKについてサポートが必要な場合や、コミュニケーションをとりたい場合は[こちら](https://matrix.to/#/#kmkfw:klar.sh)。
このチャネルは[Discord](https://discordapp.com/widget?id=493256121075761173&theme=dark) からも見ることができます。
チャットやバグ報告などでヘルプを求める場合、可能な限り、コントローラーのREPLに`from kmk.consts import KMK_RELEASE; print(KMK_RELEASE)`を実行することによって表示されるコミットSHAを記載してください。

View File

@@ -52,7 +52,6 @@
|`KC.LBRACKET` |`KC.LBRC` |`[` and `{` |
|`KC.RBRACKET` |`KC.RBRC` |`]` and `}` |
|`KC.BSLASH` |`KC.BSLS` |`\` and <code>&#124;</code> |
|`KC.NONUS_HASH` |`KC.NUHS` |Non-US `#` and `~` |
|`KC.SCOLON` |`KC.SCLN` |`;` and `:` |
|`KC.QUOTE` |`KC.QUOT` |`'` and `"` |
|`KC.GRAVE` |`KC.GRV`, `KC.ZKHK` |<code>&#96;</code> and `~`, JIS Zenkaku/Hankaku|
@@ -102,7 +101,6 @@
|`KC.KP_9` |`KC.P9` |Keypad `9` and Page Up |
|`KC.KP_0` |`KC.P0` |Keypad `0` and Insert |
|`KC.KP_DOT` |`KC.PDOT` |Keypad `.` and Delete |
|`KC.NONUS_BSLASH` |`KC.NUBS` |Non-US `\` and <code>&#124;</code> |
|`KC.KP_EQUAL` |`KC.PEQL` |Keypad `=` |
|`KC.F13` | |F13 |
|`KC.F14` | |F14 |
@@ -121,24 +119,6 @@
|`KC.LOCKING_SCROLL` |`KC.LSCR` |Locking Scroll Lock |
|`KC.KP_COMMA` |`KC.PCMM` |Keypad `,` |
|`KC.KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards |
|`KC.INT1` |`KC.RO` |JIS `\` and <code>&#124;</code> |
|`KC.INT2` |`KC.KANA` |JIS Katakana/Hiragana |
|`KC.INT3` |`KC.JYEN` |JIS `¥` |
|`KC.INT4` |`KC.HENK` |JIS Henkan |
|`KC.INT5` |`KC.MHEN` |JIS Muhenkan |
|`KC.INT6` | |JIS Numpad `,` |
|`KC.INT7` | |International 7 |
|`KC.INT8` | |International 8 |
|`KC.INT9` | |International 9 |
|`KC.LANG1` |`KC.HAEN` |Hangul/English |
|`KC.LANG2` |`KC.HANJ` |Hanja |
|`KC.LANG3` | |JIS Katakana |
|`KC.LANG4` | |JIS Hiragana |
|`KC.LANG5` | |JIS Zenkaku/Hankaku |
|`KC.LANG6` | |Language 6 |
|`KC.LANG7` | |Language 7 |
|`KC.LANG8` | |Language 8 |
|`KC.LANG9` | |Language 9 |
|`KC.LCTRL` |`KC.LCTL` |Left Control |
|`KC.LSHIFT` |`KC.LSFT` |Left Shift |
|`KC.LALT` | |Left Alt |
@@ -185,15 +165,40 @@
|`KC.RIGHT_ANGLE_BRACKET`|`KC.RABK`, `KC.GT` |`>` |
|`KC.QUESTION` |`KC.QUES` |`?` |
## [International Keys]
|Key |Aliases |Description |
|------------------------|------------------------------|-----------------------|
|`KC.NONUS_HASH` |`KC.NUHS` |ISO Left of Return |
|`KC.NONUS_BSLASH` |`KC.NUBS` |ISO Right of LSHIFT |
|`KC.APPLICATION` |`KC.APP`,`KC.SEL`,`KC.WINMENU`|Menu Key (Near RCTRL) |
|`KC.INT1` |`KC.RO` | |
|`KC.INT2` |`KC.KANA` | |
|`KC.INT3` |`KC.JYEN` | |
|`KC.INT4` |`KC.HENK` | |
|`KC.INT5` |`KC.MHEN` | |
|`KC.INT6` | | |
|`KC.INT7` | | |
|`KC.INT8` | | |
|`KC.INT9` | | |
|`KC.LANG1` |`HAEN` | |
|`KC.LANG2` |`HAEJ` | |
|`KC.LANG3` | | |
|`KC.LANG4` | | |
|`KC.LANG5` | | |
|`KC.LANG6` | | |
|`KC.LANG7` | | |
|`KC.LANG8` | | |
|`KC.LANG9` | | |
## [Internal Keys]
|Key |Description |
|-----------------------|---------------------------------------------------------------------|
|`KC.RESET` |Put the keyboard into DFU mode for flashing |
|`KC.RESET` |Restarts the keyboard |
|`KC.DEBUG` |Toggle `debug_enabled`, which enables log spew to serial console |
|`KC.GESC` |Escape when tapped, <code>&#96;</code> when pressed with Shift or GUI|
|`KC.LEAD` |The [Leader key] |
|`KC.BKDL` |Backspace when tapped, Delete when pressed with GUI |
|`KC.UC_MODE_NOOP` |Sets UnicodeMode to NOOP |
|`KC.UC_MODE_LINUX` |Sets UnicodeMode to Linux |
|`KC.UC_MODE_MACOS` |Sets UnicodeMode to MocOS |
@@ -201,19 +206,6 @@
|`KC.MACRO_SLEEP_MS(ms)`|Sleeps in a macro. Check MACROS for more information. |
## [Layer Switching]
|Key |Description |
|-----------------|------------------------------------------------------------------------|
|`KC.DF(layer)` |Switches the default layer |
|`KC.MO(layer)` |Momentarily activates layer, switches off when you let go |
|`KC.LM(layer, mod)` |As `MO(layer)` but with `mod` active |
|`KC.LT(layer, kc)` |Momentarily activates layer if held, sends kc if tapped |
|`KC.TG(layer)` |Toggles the layer (enables it if no active, and vise versa) |
|`KC.TO(layer)` |Activates layer and deactivates all other layers |
|`KC.TT(layer)` |Momentarily activates layer if held, toggles it if tapped repeatedly |
## [Modifiers]
|Key |Description |
@@ -230,22 +222,10 @@
|`KC.RGUI(kc)`|Hold Right GUI and press `kc` |
## [Mod-Tap Keys] NOT IMPLEMENTED AT THIS TIME
## [Bluetooth Keys]
|Key |Aliases |Description |
|------------|---------------------------------------|-------------------------------------------------------|
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped |
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|Key |Aliases |Description |
|-----------------------------|-------------------|----------------------------------|
|`KC.BT_CLEAR_BONDS` |`KC.BT_CLR` |Clears all stored bondings |
|`KC.BT_NEXT_CONN` |`KC.BT_NXT` |Selects the next BT connection |
|`KC.BT_PREV_CONN` |`KC.BT_PRV` |Selects the previous BT connection|

View File

@@ -1,177 +0,0 @@
# Keymap
Keymaps in KMK are simple Python class objects with various attributes assigned
(some by default, however all are overridable).
The basics of what you'll need to get started are:
- Import the `Firmware` object for your keyboard from `kmk.boards` (or, if
handwiring your keyboard, import `Firmware` from the appropriate MCU for your
board from `kmk.mcus`. See `hardware.md` for the list of supported boards and
map this to the correct Python module under either of those paths.
- Add a file to `user_keymaps/your_username` called whatever you'd like
- Assign a `Firmware` instance to a variable (ex. `keyboard = Firmware()` - note
the parentheses)
- Make sure this `Firmware` instance is actually run at the end of the file with
a block such as the following:
```python
if __name__ == '__main__':
keyboard.go()
```
- Assign pins and your diode orientation (only necessary on handwire keyboards),
for example:
```python
col_pins = (P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4)
row_pins = (P.D10, P.D11, P.D12, P.D13, P.D9, P.D6, P.D5, P.SCL)
rollover_cols_every_rows = 4
diode_orientation = DiodeOrientation.COLUMNS
swap_indicies = {
(3, 3): (3, 9),
(3, 4): (3, 10),
(3, 5): (3, 11),
}
```
The pins should be based on whatever CircuitPython calls pins on your particular
board. You can find these in the REPL on your CircuitPython device:
```python
import board
print(dir(board))
```
> Note: `rollover_cols_every_rows` is only supported with
> `DiodeOrientation.COLUMNS`, not `DiodeOrientation.ROWS`. It is used for boards
> such as the Planck Rev6 which reuse column pins to simulate a 4x12 matrix in
> the form of an 8x6 matrix
> Note: `swap_indicies` is used to literally flip two keys' positions in the
> matrix. This is pretty rarely needed, but for example the Planck Rev6 in full
> 1u Grid mode swaps the bottom three right keys on each "half", thus the
> example above
You can further define a bunch of other stuff:
- `debug_enabled` which will spew a ton of debugging information to the serial
console. This is very rarely needed, but can provide very valuable information
if you need to open an issue.
- `unicode_mode` from `kmk.consts.UnicodeMode`, which defines the default
operating system implementation to use for unicode sequences (see examples
below, or `unicode.md`. This can be changed after boot with a key (see
`keycodes.md`)
- `tap_time` which defines how long `KC.TT` and `KC.LT` will wait before
considering a key "held" (see `keycodes.md`)
- `leader_dictionary`, which defines leader sequences (see `leader.md`), defined
as tuples of keycode objects (or you can use
`kmk.keycodes.generate_leader_dictionary_seq` with a string)
We also support unicode sequences (emojis, emoticons, umlauted letters,
whatever) if your operating system and system setup do! See `unicode.md` for
details.
Here's a giant example of all the above. This is my personal 4x12 matrix layout
running on a Planck Rev6 PCB, with a Feather M4 Express wired up to the outer
matrix pins (in somewhat of a "spider" setup), utilizing most of the above
features:
```python
from kmk.boards.klarank import Firmware
from kmk.consts import UnicodeMode
from kmk.keycodes import KC
from kmk.keycodes import generate_leader_dictionary_seq as glds
from kmk.macros.simple import send_string
from kmk.macros.unicode import compile_unicode_string_sequences as cuss
keyboard = Firmware()
keyboard.debug_enabled = True
keyboard.unicode_mode = UnicodeMode.LINUX
_______ = KC.TRNS
xxxxxxx = KC.NO
emoticons = cuss({
# Emojis
'BEER': r'🍺',
'BEER_TOAST': r'🍻',
'FACE_CUTE_SMILE': r'😊',
'FACE_HEART_EYES': r'😍',
'FACE_JOY': r'😂',
'FACE_SWEAT_SMILE': r'😅',
'FACE_THINKING': r'🤔',
'FIRE': r'🔥',
'FLAG_CA': r'🇨🇦',
'FLAG_US': r'🇺🇸',
'HAND_CLAP': r'👏',
'HAND_HORNS': r'🤘',
'HAND_OK': r'👌',
'HAND_THUMB_DOWN': r'👎',
'HAND_THUMB_UP': r'👍',
'HAND_WAVE': r'👋',
'HEART': r'❤️',
'MAPLE_LEAF': r'🍁',
'POOP': r'💩',
'TADA': r'🎉',
# Emoticons, but fancier
'ANGRY_TABLE_FLIP': r'(ノಠ痊ಠ)ノ彡┻━┻',
'CELEBRATORY_GLITTER': r'+。:.゚ヽ(´∀。)ノ゚.:。+゚゚+。:.゚ヽ(*´∀)ノ゚.:。+゚',
'SHRUGGIE': r'¯\_(ツ)_/¯',
'TABLE_FLIP': r'(╯°□°)╯︵ ┻━┻',
})
WPM = send_string("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Bibendum arcu vitae elementum curabitur vitae nunc sed. Facilisis sed odio morbi quis.")
keyboard.leader_dictionary = {
glds('hello'): send_string('hello world from kmk macros'),
glds('wpm'): WPM,
glds('atf'): emoticons.ANGRY_TABLE_FLIP,
glds('tf'): emoticons.TABLE_FLIP,
glds('fca'): emoticons.FLAG_CA,
glds('fus'): emoticons.FLAG_US,
glds('cel'): emoticons.CELEBRATORY_GLITTER,
}
keyboard.keymap = [
[
[KC.GESC, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC],
[KC.TAB, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENT],
[KC.LGUI, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.LALT],
[KC.LCTL, KC.LEAD, KC.LSHIFT(KC.LGUI), KC.MO(2), KC.MO(3), KC.LSFT, KC.SPC, KC.MO(1), KC.LEFT, KC.DOWN, KC.UP, KC.RGHT],
],
[
[KC.GESC, xxxxxxx, xxxxxxx, KC.F10, KC.F11, KC.F12, xxxxxxx, KC.PSLS, KC.N7, KC.N8, KC.N9, KC.BSPC],
[KC.TAB, xxxxxxx, xxxxxxx, KC.F7, KC.F8, KC.F9, xxxxxxx, KC.PAST, KC.N4, KC.N5, KC.N6, _______],
[KC.LGUI, xxxxxxx, xxxxxxx, KC.F4, KC.F5, KC.F6, xxxxxxx, KC.PMNS, KC.N1, KC.N2, KC.N3, _______],
[KC.LCTL, xxxxxxx, _______, KC.F1, KC.F2, KC.F3, KC.SPC, _______, KC.N0, KC.DOT, xxxxxxx, KC.EQL],
],
[
[KC.GESC, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.BSLS, KC.LBRC, KC.RBRC, KC.DEL],
[KC.TAB, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.MINS],
[KC.LGUI, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.LBRC, xxxxxxx, xxxxxxx, KC.INS],
[KC.LCTL, xxxxxxx, _______, _______, xxxxxxx, _______, xxxxxxx, xxxxxxx, KC.HOME, KC.PGDN, KC.PGUP, KC.END],
],
[
[KC.GRV, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.SLSH],
[KC.TAB, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.MINS],
[KC.LGUI, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx],
[KC.LCTL, xxxxxxx, xxxxxxx, xxxxxxx, _______, _______, xxxxxxx, xxxxxxx, KC.MUTE, KC.VOLD, KC.VOLU, xxxxxxx],
],
]
if __name__ == '__main__':
keyboard.go()
```

View File

@@ -1,10 +1,10 @@
# Keys
> NOTE: This is not a lookup table of key objects provided by KMK. That listing
> can be found in `keycodes.md`, though that file is not always kept up to date.
> It's probably worth a look at the raw source if you're stumped: `kmk/keys.py`.
> can be found in `keycodes.md`. It's probably worth a look at the raw source if
> you're stumped: `kmk/keys.py`.
This is a bunch of documentation about how physical keypresses translate to
This is a bunch of documentation about how a physical keypress translates to
events (and the lifecycle of said events) in KMK. It's somewhat technical, but
if you're looking to extend your keyboard's functionality with extra code,
you'll need at least some of this technical knowledge.

View File

@@ -0,0 +1,24 @@
## Firmware of choice
### KMKPython
KMKPython is a fork of Circuitpython, but with libraries for most extensions
built in. This saves you from having to get them all and keep them updated
yourself. There may be other features added in the future that are exclusive to
KMKPython. For the nice!nano, this is highly recommended, and used in place of
Circuitpython.
Notable differences include
- Built in libraries for bluetooth, RGB, and more
- Saves space as builds are optimized for keyboards
- Microcontrollers like the nice!nano will be able to access all features out of
the box.
### Circuitpython
Circuitpython can be installed by following this guide using the guide
[here](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython).
It's recommended to run the latest stable version that is at least 5.0 or higher.
Beta versions may work, but expect limited support.
#### Notable differences include
- Supports more devices
- Less built in libraries. If using RGB, bluetooth, and more, you will have to
add these libraries yourself
- Some devices such as the nice!nano don't have much free space, so not all
features can be installed at the same time

21
docs/layers.md Normal file
View File

@@ -0,0 +1,21 @@
# Layers
Layers module adds keys for accessing other layers. It can simply be added to
the extensions list.
```python
from kmk.modules.layers import Layers
keyboard.modules.append(Layers())
```
## Keycodes
|Key |Description |
|-----------------|------------------------------------------------------------------------|
|`KC.DF(layer)` |Switches the default layer |
|`KC.MO(layer)` |Momentarily activates layer, switches off when you let go |
|`KC.LM(layer, mod)` |As `MO(layer)` but with `mod` active |
|`KC.LT(layer, kc)` |Momentarily activates layer if held, sends kc if tapped |
|`KC.TG(layer)` |Toggles the layer (enables it if no active, and vise versa) |
|`KC.TO(layer)` |Activates layer and deactivates all other layers |
|`KC.TT(layer)` |Momentarily activates layer if held, toggles it if tapped repeatedly |

View File

@@ -1,68 +0,0 @@
# Leader Key
The leader key acts as a prefix to a key sequence. These can be used to trigger macros quickly
without dedicated keys set to each function. For those of you who dislike key combos, such as
Ctrl+Shift+Esc, then this feature is for you. This is very much inspired from vim.
Leader key sequences can be as long or short as you like. The action must be a macro, so it
can be things like unicode macros, or generic macros. The example below shows how you would
trigger task manager in Windows with a leader sequence.
1. Assign a key to KC.LEAD
2. Above your keymap, include a LEADER_DICTIONARY.
```python
from kmk.macros.simple import simple_key_sequence
# ...
keyboard.leader_dictionary = {
(KC.T, KC.A, KC.S, KC.K): simple_key_sequence([Modifiers.KC_LCTRL(Modifiers.KC_LSHIFT(Common.KC_ESC))])
}
keymap = [...KC.LEAD,...]
# ...
```
If defining tuples of keycodes is too obtuse for you, we have a convenience
function available for that, too!
```python
from kmk.keycodes import generate_leader_dictionary_seq as glds
# ...
keyboard.leader_dictionary = {
glds('task'): simple_key_sequence([Modifiers.KC_LCTRL(Modifiers.KC_LSHIFT(Common.KC_ESC))])
}
# ...
```
# Modes
1. LeaderMode.TIMEOUT (the default)
2. LeaderMode.ENTER
### Timeout Mode
Will expire after a timer and trigger the sequence that matches if any.
This can be enabled with
```python
from kmk.consts import LeaderMode
keyboard.leader_mode = LeaderMode.TIMEOUT
```
The timeout can be set like this
```python
keyboard.leader_timeout = 2000 # in milliseconds-ish
```
The timeout defaults to `1000`, which is roughly a second.
### Enter Mode
Has no timeout. To end sequence press the enter key, or cancel and do nothing, press escape.
This can be enabled with
```python
from kmk.consts import LeaderMode
keyboard.leader_mode = LeaderMode.ENTER
```

41
docs/led.md Normal file
View File

@@ -0,0 +1,41 @@
# LED (Mono color backlight)
Want your keyboard to shine? Add some lights!
## Enabling the extension
The only required values that you need to give the LED extension would be the
pixel pin, and the number of pixels/LED's. If using a split keyboard, this number
is per side, and not the total of both sides.
```python
from kmk.extensions.RGB import RGB
from kb import led_pin # This can be imported or defined manually
led_ext = LED(led_pin=led_pin)
keyboard.extensions.append(led_ext)
```
## [Keycodes]
|Key |Aliases |Description |
|-----------------------------|-------------------|----------------------------|
|`KC.LED_TOG` | |Toggles LED's |
|`KC.LED_INC` | |Increase Brightness |
|`KC.LED_DEC` | |Decrease Brightness |
|`KC.LED_ANI` | |Increase animation speed |
|`KC.LED_AND` | |Decrease animation speed |
|`KC.LED_MODE_PLAIN` |`LED_M_P` |Static LED's |
|`KC.LED_MODE_BREATHE` |`LED_M_B` |Breathing animation |
## Configuration
All of these values can be set by default for when the keyboard boots.
```python
from kmk.extensions.led import AnimationModes
led_ext = LED(
led_pin=led_pin,
brightness_step=5,
brightness_limit=100,
breathe_center=1.5,
animation_mode=AnimationModes.STATIC,
animation_speed=1,
val=100,
)
```

23
docs/media_keys.md Normal file
View File

@@ -0,0 +1,23 @@
# Media Keys
Media keys extension adds keys for common media control keys. It can simply be
added to the extensions list.
```python
from kmk.extensions.media_keys import MediaKeys
keyboard.extensions.append(MediaKeys())
```
## Keycodes
|Key |Aliases |Description |
|-----------------------|--------------------|-----------------------------------------------|
|`KC.AUDIO_MUTE` |`KC.MUTE` |Mute |
|`KC.AUDIO_VOL_UP` |`KC.VOLU` |Volume Up |
|`KC.AUDIO_VOL_DOWN` |`KC.VOLD` |Volume Down |
|`KC.MEDIA_NEXT_TRACK` |`KC.MNXT` |Next Track (Windows) |
|`KC.MEDIA_PREV_TRACK` |`KC.MPRV` |Previous Track (Windows) |
|`KC.MEDIA_STOP` |`KC.MSTP` |Stop Track (Windows) |
|`KC.MEDIA_PLAY_PAUSE` |`KC.MPLY` |Play/Pause Track |
|`KC.MEDIA_EJECT` |`KC.EJCT` |Eject (macOS) |
|`KC.MEDIA_FAST_FORWARD`|`KC.MFFD` |Next Track (macOS) |
|`KC.MEDIA_REWIND` |`KC.MRWD` |Previous Track (macOS) |

28
docs/modtap.md Normal file
View File

@@ -0,0 +1,28 @@
# ModTap Keycodes
Enabling ModTap will give you access to the following keycodes and can simply be
added to the modules list.
```python
from kmk.modules.modtap import ModTap
keyboard.modules.append(ModTap())
```
## Keycodes
|New Keycode | Description |
|-------------------------------------------------------|-----------------------------------------------------------------|
|LCTL = KC.MT(KC.SOMETHING, KC.LCTRL) |`LCTRL` if held `kc` if tapped |
|LSFT = KC.MT(KC.SOMETHING, KC.LSFT) |`LSHIFT` if held `kc` if tapped |
|LALT = KC.MT(KC.SOMETHING, KC.LALT) |`LALT` if held `kc` if tapped |
|LGUI = KC.MT(KC.SOMETHING, KC.LGUI) |`LGUI` if held `kc` if tapped |
|RCTL = KC.MT(KC.SOMETHING, KC.RCTRL) |`RCTRL` if held `kc` if tapped |
|RSFT = KC.MT(KC.SOMETHING, KC.RSFT) |`RSHIFT` if held `kc` if tapped |
|RALT = KC.MT(KC.SOMETHING, KC.RALT) |`RALT` if held `kc` if tapped |
|RGUI = KC.MT(KC.SOMETHING, KC.RGUI) |`RGUI` if held `kc` if tapped |
|SGUI = KC.MT(KC.SOMETHING, KC.LSHFT(KC.LGUI)) |`LSHIFT` and `LGUI` if held `kc` if tapped |
|LCA = KC.MT(KC.SOMETHING, KC.LCTRL(KC.LALT)) |`LCTRL` and `LALT` if held `kc` if tapped |
|LCAG = KC.MT(KC.SOMETHING, KC.LCTRL(KC.LALT(KC.LGUI))) |`LCTRL` and `LALT` and `LGUI` if held `kc` if tapped |
|MEH = KC.MT(KC.SOMETHING, KC.LCTRL(KC.LSFT(KC.LALT))) |`CTRL` and `LSHIFT` and `LALT` if held `kc` if tapped |
|HYPR = KC.MT(KC.SOMETHING, KC.HYPR) |`LCTRL` and `LSHIFT` and `LALT` and `LGUI` if held `kc` if tapped|

15
docs/modules.md Normal file
View File

@@ -0,0 +1,15 @@
# Modules
Modules, unlike extensions, change how your keyboard works. These are meant to have
the ability to alter the core code in any way. Unlike extensions, these are not in a
sandbox, and can make massive changes to normal operation.
## Core Modules
These modules are proveded in all builds and can be enabled. Currently offered
modules are
- [Layers](layers.md): Adds layer support (Fn key) to allow many more keys to be
put on your keyboard
- [ModTap](modtap.md): Adds support for augmented modifier keys to act as one key
when tapped, and modifier when held.
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!

20
docs/mouse_keys.md Normal file
View File

@@ -0,0 +1,20 @@
# Mouse keys
To enable mouse cursor and/or mouse buttons control from the keyboard add this module to list:
```python
from kmk.modules.mouse_keys import MouseKeys
keyboard.modules.append(MouseKeys())
```
# Keycodes
|Keycode | Description |
|---------------|---------------------------|
|MB_LMB |Left mouse button |
|MB_RMB |Right mouse button |
|MB_MMB |Middle mouse button |
|MW_UP |Mouse wheel up |
|MW_DOWN, MW_DN |Mouse wheel down |
|MS_UP |Move mouse cursor up |
|MS_DOWN, MS_DN |Move mouse cursor down |
|MS_LEFT, MS_LT |Move mouse cursor left |
|MS_RIGHT, MS_RT|Move mouse cursor right |

71
docs/porting_to_kmk.md Normal file
View File

@@ -0,0 +1,71 @@
# Porting to KMK
Porting a board to KMK is quite simple, and follows this base format.
```python
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
{EXTENSIONS_IMPORT}
class KMKKeyboard(_KMKKeyboard):
{REQUIRED}
extensions = []
```
## REQUIRED
This is designed to be replaced with the defining pins of your keyboard. Rows,
colums and the diode direction (if any), should be defined like this
```python
row_pins = [board.p0_31, board.p0_29, board.p0_02, board.p1_15]
col_pins = [board.p0_22, board.p0_24, board.p1_00, board.p0_11, board.p1_04]
diode_orientation = DiodeOrientation.COL2ROW
```
## Additional pins for extensions
KMK includes built in extensions for RGB and split keyboards, and powersave. If
these are applicible on your keyboard/microcontroller, the pins should be added
here. Refer to the instructions on the respective extensions page on how to add
them. If not adding any extensions, leave this as an empty list as shown.
# Coord mapping
If your keyboard is not built electrically as a square (though most are), you can
provide a mapping directly. An example of this is the
[Corne](https://github.com/foostan/crkbd). That has 12 colums for 3 rows, and 6
colums for the bottom row. Split keyboards count as the total keyboard, not per
side. That would look like this
```python
from kmk.matrix import intify_coordinate as ic
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))
```
## Keymaps
Keymaps are organized as a list of lists. Keycodes are added for every key on
each layer. See [keycodes](keycodes.md) for more details on what keycodes are
avaliable. If using layers or other extensions, also refer to the extensions
page for additional keycodes.
```python
from kb import KMKKeyboard
from kmk.keys import KC
keyboard = KMKKeyboard()
keyboard.keymap = [
[KC.A, KC.B],
[KC.C, KC.D],
]
if __name__ == '__main__':
keyboard.go()
```
## More information
More information on keymaps can be found [here](config_and_keymap.md)

42
docs/power.md Normal file
View File

@@ -0,0 +1,42 @@
# Power(save)
This module allows you to save power and is targeted to bluetooth/battery
based keyboards.
## Keycodes
|Key |Description |
|-----------------------|-------------------------|
|`KC.PS_TOG ` |Toggles powersave on/off |
|`KC.PS_ON ` |Turns powersave on |
|`KC.PS_OFF ` |Turns powersave off |
# Enabling the extension
To turn on basic power saving, this is all that is required.
```python
from kmk.modules.power import Power
power = Power()
keyboard.modules.append(power)
```
## Optional extra power saving
On supported boards, such as the nice!nano, power can be cut on VCC saving extra
power if OLEDS or RGBs are installed. These drain power even when off, so this
will prevent them from doing so.
```python
from kmk.modules.power import Power
# Your kb.py may already have this set. If not, add it like this
# import board
# keyboard.powersave_pin = board.P0_13
power = Power(powersave_pin=keyboard.powersave_pin)
keyboard.modules.append(power)
```
Make sure that the pin is correct for your microcontroller. The example is for
the nice!nano. Not all microcontrollers have this feature and this can be omitted
if not and there will simply be less power saving.

View File

@@ -0,0 +1,140 @@
# Começando
> A vida era como uma caixa de chocolates. Você nunca saberia o que iria
> encontrar.
KMK é uma camada focada em teclados que assenta-se em cima de
[CircuitPython](https://circuitpython.org/). Como tal, ela deve funcionar com a
maior parte das [placas que suportam
CircuitPython](https://circuitpython.org/downloads). É melhor usar a última
versão estável (>5.0). Dispositivos funcionais e recomendados podem ser
encontrados [aqui](Officially_Supported_Microcontrollers.md)
Também fornecemos uma versão de CircuitPython otimizada para teclados
(simplificada para lidar com os limites de certas placas e com a seleção dos
módulos relevantes pré-instalados). Se você estiver se perguntando por que usar
KMKPython em vez do CircuitPython cru, tentamos comparar ambas as abordagens
[aqui](kmkpython_vs_circuitpython.md)
<br>
## Guia Rápido
> Ao Infinito e Além!
1. [Installe CircuitPython na tua
placa](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython).
Com a maioria das placas, deve ser algo tão fácil quanto copiar e colar o
firmware no drive.
2. Obtenha uma [cópia do
KMK](https://github.com/KMKfw/kmk_firmware/archive/refs/heads/master.zip) a
partir do ramo master.
3. Descompacte e cole o diretório KMK e o arquivo boot.py na raiz do drive USB
correspondente à tua placa (geralmente aparecendo como CIRCUITPY).
4. Crie um novo arquivo *code.py* ou *main.py* no mesmo diretório raiz (no
mesmo nível de boot.py) com o exemplo contido abaixo:
***IMPORTANTE:*** adapte os pinos GP0 / GP1 para a tua placa específica! <br>
```
print("Starting")
import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.matrix import DiodeOrientation
keyboard = KMKKeyboard()
keyboard.col_pins = (board.GP0,)
keyboard.row_pins = (board.GP1,)
keyboard.diode_orientation = DiodeOrientation.COL2ROW
keyboard.keymap = [
[KC.A,]
]
if __name__ == '__main__':
keyboard.go()
```
5. Usando um fio, um clipe de papel ou o que seja, conecte o GPIO 0 e o GPIO 1
(ou os pinos que você escolheu para tua placa).
6. Se ela imprimir um "A" (ou um "Q" ou o que depender do teu layout de
teclado), você conseguiu!
<br>
## Agora que tudo está no seu lugar, você pode querer ir além...
> Esta é tua última chance. Após isso Esta é sua última chance. Depois não há
> como voltar. Se tomar a pílula azul a história acaba, e você acordará na sua
> cama acreditando no que quiser. Se tomar a pílula vermelha ficará no País das
> Maravilhas e eu te mostrarei até onde vai a toca do coelho. Lembre-se: tudo o
> que estou te oferecendo é a verdade. Nada mais.
### Você é extremamente sortudo e tem um teclado totalmente suportado
Se seu teclado e micro-controlador são suportados oficialmente, simplesmente
visite a webpage com os seus arquivos e coloque-os na raiz do "flash drive".
Estas webpages podem ser vistas [aqui](https://github.com/KMKfw/boards). Você
precisará dos arquivos `kb.py` e `main.py`. Instruções mais avançadas podem ser
vistas [aqui](config_and_keymap.md).
Note que recomendamos utilizar [KMKPython](https://github.com/KMKfw/kmkpython)
para essas placas pois ele é otimizado para elas. Se você usar o Circuitpython
em vez do KMKPython, você também vai precisar do
[boot.py](https://github.com/KMKfw/kmk_firmware/blob/master/boot.py).
### Você obteve outro teclado, possivelmente artesanal, e quer customizar o KMK para ele
Primeiro, certifique-se de entender como o seu teclado funciona, e em particular
sua configuração matricial específica. Você pode observar
[aqui](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) ou ler o
[guia](https://docs.qmk.fm/#/hand_wire) feito pelo time da QMK para teclados
artesanais.
<br>Uma vez que você compreendeu a essência da coisa:
- Você pode dar uma olhada [aqui](config_and_keymap.md) e [aqui](keys.md) para
começar a customizar seu arquivo code.py / main.py.
- Eis uma [referência](keycodes.md) dos códigos de teclas (*keycodes*)
disponíveis.
- A extensão [internacional](international.md) acrescenta teclas para layouts
não-americanos, e as [teclas de mídia](media_keys.md) acrecentam teclas
para... mídia.
E para ir mais além:
- [Sequências](sequences.md) são usadas para enviar múltiplas teclas em uma ação
só.
- [Camadas](layers.md) podem transformar totalmente como seu teclado age com um
simples toque.
- [ModTap](modtap.md) te permite customizar a maneira que uma tecla age quando é
pressionada ou "segurada"; e o
- [TapDance](tapdance.md) dependendo do número de vezes que ela é pressionada.
Você quer extensões divertidas como RGB, teclados repartidos ao meio e mais?
Confira o que os [módulos](modules.md) e [extensões](extensions.md) podem
fazer!
Você também pode obter ideias dos vários [exemplos de
usuários](https://github.com/KMKfw/user_keymaps) que fornecemos e fuce nossa
[documentação](https://github.com/KMKfw/kmk_firmware/tree/master/docs).
<br>
## Ajuda e Suporte Adicionais
> Estradas? Para onde vamos, estradas são desnecessárias.
Caso precise, ajuda para depuração pode ser encontrada [aqui](debugging.md).
Se você precisa de suporte com o KMK ou quer somente dizer oi, encontre-nos no
canal [#kmkfw:klar.sh no Matrix](https://matrix.to/#/#kmkfw:klar.sh). Este canal
tem uma ponte no Discord
[aqui](https://discordapp.com/widget?id=493256121075761173&theme=dark) por
conveniência. Se você precisa de ajuda ou pretende abrir um bug report, se
possível forneça o hash SHA do *commit* utilizado, o qual pode ser obtido
executando este comando no REPL de seu controlador:
`from kmk.consts import KMK_RELEASE; print(KMK_RELEASE)`

View File

@@ -0,0 +1,72 @@
# Micro-Controladores Oficialmente Suportados
Enquanto a maioria dos dispositivos com Circuitpython são muito bons para
teclados artesanais, amaioria dos teclados é projetada para aceitar um Pro
Micro. As placas listadas abaixo ou são, ou podem ser adaptadas para essa
pinagem a fim de usar teclados comuns já presentes no mercado.
## Nice!Nano
Características:
- Pinagem Pro Micro
- Suporte a USB HID e Bluetooth
- Pode ser usado para teclados repartidos sem fio (Bluetooth)
- Suporte a bateria, incluindo carga
Desvantagens:
- 25 dólares por micro-controladores na maioria das revendedoras
Varejistas comund:
- [Boardsource](https://boardsource.xyz/store/5f4a1733bbaa5c635b83ed67)
- [NiceKeyboards](https://nicekeyboards.com/collections/group-buy/products/nice-nano-v1-0).
## ItsyBitsy M4 Express
Características:
- Preços acessíveis a partir de 15 dólares
- Pode rodar a maior parte das vantagens do KMK, incluindo RGB
Desvantagens:
- Precisa de adaptadir para funcionar com a pinagem do Pro Micro. O adaptador
pode ser encontrado
[AQUI](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
Varejistas Comuns:
- [Adafruit](https://www.adafruit.com/product/3800)
## RP2040
Características:
- Preço bastante acessível
- Bastante poderosa dado o preço
Desvantagens:
- Pouco suporte para kits de teclado
Varejistas comuns:
- [Adafruit](https://www.adafruit.com/pico?src=raspberrypi)
- [Sparkfun](https://www.sparkfun.com/products/17829?src=raspberrypi)
## Adafruit ItsyBitsy nRF52840 Express
Características:
- Suporte a USB HID e Bluetooth
- Mais acessível que o Nice!Nano, apenas 18 dólares
Desvantagens:
- Precisa de adaptador para funcionar com teclados de pinagem Pro Micro pinout
keyboards. O adaptador pode ser encontrado
[AQUI](https://github.com/KMKfw/kmk_firmware/tree/master/hardware)
- O suporte à bateria precisa de uma placa adicional encontrada
[AQUI](https://www.adafruit.com/product/2124)
Varejistas comuns:
- [Adafruit](https://www.adafruit.com/product/4481)
## Outros Micro-Controladores
O mínimo que você vai precisar:
- CircuitPython/KMKpython
- 256KB de armazenamento flash
- HID sobre USB e/ou Bluetooth.

36
docs/ptBR/ble_hid.md Normal file
View File

@@ -0,0 +1,36 @@
# BLE HID
Conexões Bluetooth ajudam a se livrar da maçaroca de fios!
## Circuitpython
Se não estiver usando o KMKPython, você precisará da biblioteca `adafruit_ble`
da Adafruit. Ela pode ser baixada
[aqui](https://github.com/adafruit/Adafruit_CircuitPython_BLE/tree/master/adafruit_ble).
Ela faz parte do [Pacotão Adafruit
CircuitPython](https://github.com/adafruit/Adafruit_CircuitPython_Bundle). Simplesmente
coloque-a na raiz do seu dispositivo circuitpython. Se não tiver certeza, é o
primeiro diretório com `main.py` nele, e deve ser o primeiro que você abre
quando acessa o dispositivo.
## Habilitando BLE
Para habilitar o BLE hid, modifique o `keyboard.go()`. Por padrão, o nome
exibido será o nome do "flash drive", o qual por padrão é CIRCUITPY:
```python
if __name__ == '__main__':
keyboard.go(hid_type=HIDModes.BLE)
```
## Mudando o Nome Exibido
Existem duas formas de mudar o nome exibido. O primeiro seria [mudando o nome do
do
drive](https://learn.adafruit.com/welcome-to-circuitpython/the-circuitpy-drive). O
segundo seria mudando `keyboard.go()` assim:
```python
if __name__ == '__main__':
keyboard.go(hid_type=HIDModes.BLE, ble_name='KMKeyboard')
```

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