Compare commits
524 Commits
topic-slav
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d297e6ab2 | ||
|
|
1700aff408 | ||
|
|
63973e4a6e | ||
|
|
f7dac9e96e | ||
|
|
7ff77b97bb | ||
|
|
c7490087b6 | ||
|
|
a210c2bf62 | ||
|
|
c8df1d10ad | ||
|
|
d2e87b3e70 | ||
|
|
b3ec37e274 | ||
|
|
ec8e167996 | ||
|
|
175f0c6a97 | ||
|
|
e395e89864 | ||
|
|
8ac497d99b | ||
|
|
c880c02ad5 | ||
|
|
89351fc203 | ||
|
|
4b03ba846a | ||
|
|
87d1b0c6b9 | ||
|
|
be308d516f | ||
|
|
c950785385 | ||
|
|
74fa1fb52e | ||
|
|
7431192e95 | ||
|
|
142a15e175 | ||
|
|
0cb69651c8 | ||
|
|
6002ad33e1 | ||
|
|
3f0283422d | ||
|
|
cca5b91be2 | ||
|
|
f1d229c7ff | ||
|
|
08df52e90d | ||
|
|
529e6101ab | ||
|
|
ca773d0633 | ||
|
|
cc82433f74 | ||
|
|
7b92596937 | ||
|
|
e5f89963cf | ||
|
|
cc70c8f4a8 | ||
|
|
2a53bd8b64 | ||
|
|
07a485b04d | ||
|
|
d4e72b98c9 | ||
|
|
ea19f5bb30 | ||
|
|
24d0587ac6 | ||
|
|
d12f9a18f1 | ||
|
|
1a7d1d53f6 | ||
|
|
9539f2dc74 | ||
|
|
3687212ed7 | ||
|
|
d47143463b | ||
|
|
55a75cb9b3 | ||
|
|
9684e0d5f7 | ||
|
|
4f7f3dcc3c | ||
|
|
1863543428 | ||
|
|
58ea87dcc2 | ||
|
|
2a560cf3f3 | ||
|
|
275e61832f | ||
|
|
b2c7da2058 | ||
|
|
dc171360f6 | ||
|
|
32bafcdc46 | ||
|
|
5c33fd3a9f | ||
|
|
a8e7f43e59 | ||
|
|
c46d18ecb7 | ||
|
|
603833dbb7 | ||
|
|
2d005048cc | ||
|
|
cbaf995e33 | ||
|
|
3442a21835 | ||
|
|
4d1f9e487e | ||
|
|
e52af4f58a | ||
|
|
de1d602b25 | ||
|
|
e2f2c228d1 | ||
|
|
8dbbc42496 | ||
|
|
067b7d2e5f | ||
|
|
201d127348 | ||
|
|
c11fffea2c | ||
|
|
b3c8245365 | ||
|
|
9f2142d706 | ||
|
|
54ae022846 | ||
|
|
2008e0ab3f | ||
|
|
8cec85e3ec | ||
|
|
b7e3e4ea8c | ||
|
|
d54fff883d | ||
|
|
aae476b59f | ||
|
|
2fce09986e | ||
|
|
ef7b29bd43 | ||
|
|
ab7e0d3eb6 | ||
|
|
d26d397f10 | ||
|
|
ecc8b46a2c | ||
|
|
fd30b7a8d8 | ||
|
|
57ba0fe8b2 | ||
|
|
e7d306cf30 | ||
|
|
2d4db12c46 | ||
|
|
fb783c302c | ||
|
|
2096f1a950 | ||
|
|
a34272dd18 | ||
|
|
7f5ea97bba | ||
|
|
7f7eaafbf3 | ||
|
|
8e4ab1d733 | ||
|
|
0e029ebf72 | ||
|
|
f02ff1463a | ||
|
|
3c4e74d50e | ||
|
|
ba7b5ce15c | ||
|
|
671aa60838 | ||
|
|
dc4fc646aa | ||
|
|
6840330f50 | ||
|
|
da3e87ee2d | ||
|
|
7519a97eaa | ||
|
|
083f2e143d | ||
|
|
8c0f8ccbc3 | ||
|
|
fdf8e9f78c | ||
|
|
f4807f341e | ||
|
|
ee4cce32cb | ||
|
|
eb3a7bbf1e | ||
|
|
481c69b212 | ||
|
|
1c6b25517a | ||
|
|
a685618480 | ||
|
|
5cae17c9f3 | ||
|
|
7573556f33 | ||
|
|
f30206c7d5 | ||
|
|
21c058aaa8 | ||
|
|
0f7afe5b2c | ||
|
|
119ab3d80a | ||
|
|
7fba42f28c | ||
|
|
827862b34b | ||
|
|
f2aabd87cd | ||
|
|
91562abde9 | ||
|
|
65f48b53a4 | ||
|
|
cd4ba26e95 | ||
|
|
967046587b | ||
|
|
4a83e6de85 | ||
|
|
9e8b8376c5 | ||
|
|
aa01da7e1d | ||
|
|
1387cb2660 | ||
|
|
fa0062326b | ||
|
|
be2bbce21a | ||
|
|
1c82f7d387 | ||
|
|
9f373b4be0 | ||
|
|
2874d49d20 | ||
|
|
6ecb7807c2 | ||
|
|
99a9c6fd80 | ||
|
|
25fd205c3e | ||
|
|
a627102b52 | ||
|
|
3e3255ffea | ||
|
|
55a6636741 | ||
|
|
46152ae8d9 | ||
|
|
7fbda871c2 | ||
|
|
c09cd48218 | ||
|
|
bff1bdf6d9 | ||
|
|
f90de872d8 | ||
|
|
b6201d43d4 | ||
|
|
e70ce5f431 | ||
|
|
328a29c439 | ||
|
|
0bebdd6d27 | ||
|
|
af55acd584 | ||
|
|
245f7912b6 | ||
|
|
8419ed789c | ||
|
|
a62d39a252 | ||
|
|
10f8c74ad9 | ||
|
|
ef3d38f8ec | ||
|
|
61de548acb | ||
|
|
2527542379 | ||
|
|
14fd494cd4 | ||
|
|
c37170da56 | ||
|
|
3258e76ba4 | ||
|
|
7f207062e9 | ||
|
|
410cf7af07 | ||
|
|
8063898eb2 | ||
|
|
5fcd31b97c | ||
|
|
e1300ba767 | ||
|
|
a8b2bf75ad | ||
|
|
a7a560bbca | ||
|
|
dc364a77fb | ||
|
|
5073a29501 | ||
|
|
11ff03523b | ||
|
|
f7c0bd962b | ||
|
|
08b41fda69 | ||
|
|
797cdfe38a | ||
|
|
841f990481 | ||
|
|
85fe8fef12 | ||
|
|
f9dd03f207 | ||
|
|
9aa3a21900 | ||
|
|
899b95e586 | ||
|
|
0a81876eae | ||
|
|
1aa4db1dd3 | ||
|
|
235560bf72 | ||
|
|
72943a8fe1 | ||
|
|
9dbecbcb86 | ||
|
|
a2e26055a6 | ||
|
|
d8445c1262 | ||
|
|
3bbadece8d | ||
|
|
27104cc28d | ||
|
|
b2dae8175e | ||
|
|
b3d4ffde0a | ||
|
|
2da3b1f5f4 | ||
|
|
14c1cacf02 | ||
|
|
997f4651ee | ||
|
|
8d01908468 | ||
|
|
e92e122588 | ||
|
|
09dd2be1bc | ||
|
|
634d53b987 | ||
|
|
aa95412a0e | ||
|
|
b4fd94e911 | ||
|
|
7ce2827da7 | ||
|
|
0b43a3de38 | ||
|
|
7427531494 | ||
|
|
4a8b95ce93 | ||
|
|
6fce4c996c | ||
|
|
3e91f63c88 | ||
|
|
5aa123b550 | ||
|
|
4165e25ff5 | ||
|
|
997ddfc119 | ||
|
|
5f1b9d2b14 | ||
|
|
f381761507 | ||
|
|
4c73be5236 | ||
|
|
dffaec9f03 | ||
|
|
6c13c97e83 | ||
|
|
74186f20a1 | ||
|
|
b2db921a5b | ||
|
|
ed68ddb79d | ||
|
|
d9fb351448 | ||
|
|
0f6e183235 | ||
|
|
484bcc4d22 | ||
|
|
7993a4e415 | ||
|
|
2384550af4 | ||
|
|
1222477866 | ||
|
|
a6606c6957 | ||
|
|
dea2abb81a | ||
|
|
2d3b2e95c6 | ||
|
|
5572fabf8d | ||
|
|
6357141165 | ||
|
|
edfd127148 | ||
|
|
04b720da5b | ||
|
|
d2b34097f2 | ||
|
|
0bc6fe0c97 | ||
|
|
d114a28f9e | ||
|
|
6a38b3cb0a | ||
|
|
e3c1c86a0b | ||
|
|
0d27901b0d | ||
|
|
45e4356630 | ||
|
|
3069608e56 | ||
|
|
48ab6767e4 | ||
|
|
fb34038911 | ||
|
|
dac457d94c | ||
|
|
fc69245c57 | ||
|
|
7586df8de9 | ||
|
|
b8fd60e866 | ||
|
|
8167e0bc72 | ||
|
|
e5d7333e2e | ||
|
|
0a2f62a90b | ||
|
|
8650a6ea7c | ||
|
|
199ec1d914 | ||
|
|
abaafbd8c5 | ||
|
|
99577357f6 | ||
|
|
209acc94b2 | ||
|
|
4e938ef6b6 | ||
|
|
8a15378733 | ||
|
|
1a5e7fa54b | ||
|
|
9c46eaeb9c | ||
|
|
7b1d3f17c4 | ||
|
|
8199854b5e | ||
|
|
3bc038d0d8 | ||
|
|
0a61cbd4af | ||
|
|
5cd34bcfea | ||
|
|
a894d8d140 | ||
|
|
113e8eb867 | ||
|
|
0e528435a3 | ||
|
|
f36a18513b | ||
|
|
3ad2a00dc9 | ||
|
|
3c9c527a96 | ||
|
|
731f1b1030 | ||
|
|
27cf8e7d4d | ||
|
|
1ba8ea3728 | ||
|
|
e821acfca1 | ||
|
|
3d6e4fde41 | ||
|
|
584eee64c6 | ||
|
|
ea9625106c | ||
|
|
b287b2112c | ||
|
|
7601a6f21f | ||
|
|
d3b315d059 | ||
|
|
88e3fe45d4 | ||
|
|
09e26ae3a3 | ||
|
|
e77a0af23c | ||
|
|
02a9a088a0 | ||
|
|
aa55153a8e | ||
|
|
7991dc4609 | ||
|
|
dbe6e105e2 | ||
|
|
c9184477fb | ||
|
|
25015e54ca | ||
|
|
8ee368cfe4 | ||
|
|
2e75a89581 | ||
|
|
137df5a46c | ||
|
|
9a2918d85c | ||
|
|
bd31af0e14 | ||
|
|
c62b2e94f7 | ||
|
|
c023f368ba | ||
|
|
8d16cac06d | ||
|
|
b11fce321f | ||
|
|
d21aa772a7 | ||
|
|
9ad8233104 | ||
|
|
2b59ed7aec | ||
|
|
2c6ec8c5da | ||
|
|
ceb9f69a38 | ||
|
|
46206dabbf | ||
|
|
73b8542665 | ||
|
|
fd097c3924 | ||
|
|
586d1deb4e | ||
|
|
796b7733f5 | ||
|
|
9eb86d2069 | ||
|
|
a08ed5dc25 | ||
|
|
7e477e1aa8 | ||
|
|
3be9f9b9ad | ||
|
|
e0786e6118 | ||
|
|
9340579031 | ||
|
|
d43c712301 | ||
|
|
c75b52f94b | ||
|
|
3525a5f1a5 | ||
|
|
10a1447adc | ||
|
|
24a4a4da11 | ||
|
|
9aaebbcf54 | ||
|
|
081590f85d | ||
|
|
2db4682264 | ||
|
|
f256c49727 | ||
|
|
0247de4988 | ||
|
|
4139c97b22 | ||
|
|
917afe5f57 | ||
|
|
9e731bce1e | ||
|
|
3f10abc6fd | ||
|
|
4eba21a2fd | ||
|
|
15918db7ac | ||
|
|
eb5756f530 | ||
|
|
cd3e10ba13 | ||
|
|
083e4a701a | ||
|
|
ab6aa1838c | ||
|
|
270be1fa28 | ||
|
|
76e7ee4027 | ||
|
|
7310bdd780 | ||
|
|
a77fee7f04 | ||
|
|
e208dd64f3 | ||
|
|
7a30cc8cce | ||
|
|
1a348f1539 | ||
|
|
f79e508566 | ||
|
|
7400f43cf8 | ||
|
|
ece6441230 | ||
|
|
eb41d704b0 | ||
|
|
aeee945728 | ||
|
|
6f8eb425b1 | ||
|
|
6d5b99d78d | ||
|
|
66788c29ca | ||
|
|
33408dc228 | ||
|
|
581d8e269b | ||
|
|
9b5e35a5a8 | ||
|
|
ee7094e799 | ||
|
|
e72d2b8c34 | ||
|
|
9821f7bcc3 | ||
|
|
ea327f8f76 | ||
|
|
54f4644b5c | ||
|
|
3797797b43 | ||
|
|
6bfd5682f9 | ||
|
|
f1bce8fdbd | ||
|
|
01daa7a07e | ||
|
|
bf551a6de0 | ||
|
|
2d74fe7cb3 | ||
|
|
b8cb4bda98 | ||
|
|
8bb7c1f555 | ||
|
|
4afac426f0 | ||
|
|
4c06d8b626 | ||
|
|
015e0cdfd7 | ||
|
|
1b730cacf3 | ||
|
|
dc598ad439 | ||
|
|
ec16270006 | ||
|
|
1016dc552c | ||
|
|
5f4785f0ad | ||
|
|
6ed5d04af5 | ||
|
|
80d95816e4 | ||
|
|
1a4e81a2e5 | ||
|
|
6e10babfbe | ||
|
|
026308bbeb | ||
|
|
945fcca7b0 | ||
|
|
f3067099b2 | ||
|
|
a6d36d57a7 | ||
|
|
7bd2bdb35f | ||
|
|
69f7c3c8c2 | ||
|
|
7f1514e8de | ||
|
|
173ae842ca | ||
|
|
c4d057685b | ||
|
|
29373e9a37 | ||
|
|
e225d8b1d6 | ||
|
|
fba97fc364 | ||
|
|
73b7464ec1 | ||
|
|
b65a94972c | ||
|
|
d79a2c943c | ||
|
|
2cf64d8ce7 | ||
|
|
e5700eeb5f | ||
|
|
18eeb4eadc | ||
|
|
6844654d39 | ||
|
|
4d46653526 | ||
|
|
b082f26d9e | ||
|
|
ac9f4927c9 | ||
|
|
81c6b0ca5d | ||
|
|
d47665df50 | ||
|
|
ee83a32e87 | ||
|
|
5096bb7e30 | ||
|
|
2197dab6fa | ||
|
|
1bd84e49aa | ||
|
|
9fc4159c9a | ||
|
|
2244c95db6 | ||
|
|
b1c180ce78 | ||
|
|
afd924c8c4 | ||
|
|
7c81e01505 | ||
|
|
bec742bbf5 | ||
|
|
5ef37864de | ||
|
|
80004bb65f | ||
|
|
ed452084fe | ||
|
|
0ed40d3cef | ||
|
|
666c0a4f08 | ||
|
|
b03ae32e7d | ||
|
|
5da4555669 | ||
|
|
6baaf5e5d4 | ||
|
|
eb566b0f71 | ||
|
|
8c57844a22 | ||
|
|
86c8e006e0 | ||
|
|
17ba405bcc | ||
|
|
45cadc7e5a | ||
|
|
11a4604f88 | ||
|
|
38e8102532 | ||
|
|
02401e2ec0 | ||
|
|
1eaf0e2c79 | ||
|
|
ef1c69aa2c | ||
|
|
4bdf926360 | ||
|
|
6b73a5ec56 | ||
|
|
5a43bc291d | ||
|
|
64267bdc5b | ||
|
|
aaeaa74a0c | ||
|
|
5c0c13e8d0 | ||
|
|
8100b91dbc | ||
|
|
614883ef80 | ||
|
|
7197f7a3a4 | ||
|
|
5771a89433 | ||
|
|
55b07f330c | ||
|
|
39220beddb | ||
|
|
39e3a65955 | ||
|
|
cd7d8a2e4c | ||
|
|
8f5511327e | ||
|
|
ffe3fa3c64 | ||
|
|
a51d11f6e6 | ||
|
|
5c8bd45615 | ||
|
|
d0d1608350 | ||
|
|
ea62d08d2c | ||
|
|
1e9625ae0e | ||
|
|
e8c3b5ac70 | ||
|
|
b3e9a14e71 | ||
|
|
3b6286b480 | ||
|
|
3a1ce093ee | ||
|
|
6f3273a6f8 | ||
|
|
fc51f84045 | ||
|
|
241cf69979 | ||
|
|
ef09454d2e | ||
|
|
d15aa65cc6 | ||
|
|
056efa8ca5 | ||
|
|
004f40e7d2 | ||
|
|
b6af43ef90 | ||
|
|
c11984135a | ||
|
|
76087749fb | ||
|
|
d07560513f | ||
|
|
d34e8ce9d2 | ||
|
|
f6a39acd26 | ||
|
|
350c2438ad | ||
|
|
17094a2988 | ||
|
|
2947f81489 | ||
|
|
1fe80fec92 | ||
|
|
edcb681169 | ||
|
|
5b069a0104 | ||
|
|
7bff667a2b | ||
|
|
c16e2c51aa | ||
|
|
5532ffdcbf | ||
|
|
39b0b1e7f2 | ||
|
|
5158094549 | ||
|
|
3f8c6e7648 | ||
|
|
9d8682c866 | ||
|
|
86b8c4ffb0 | ||
|
|
bb198709f2 | ||
|
|
fa28b3afba | ||
|
|
efb642c374 | ||
|
|
1a06e0ed72 | ||
|
|
7ebf8d623f | ||
|
|
ec1a62e52d | ||
|
|
0a06e733d2 | ||
|
|
e2413a3c25 | ||
|
|
a882ef2c38 | ||
|
|
373ca8355e | ||
|
|
54d63037bf | ||
|
|
f7a1d54752 | ||
|
|
7ebfaa3bf7 | ||
|
|
f65ea1e841 | ||
|
|
5c8c2e97fd | ||
|
|
3ae7432de0 | ||
|
|
9fbad17ed4 | ||
|
|
1751cce299 | ||
|
|
ad3430eeb6 | ||
|
|
5334e7e0be | ||
|
|
2ad1fe8a9c | ||
|
|
31983a0873 | ||
|
|
0ba5911f8f | ||
|
|
7a58ac041f | ||
|
|
4b033857b1 | ||
|
|
e332804dc9 | ||
|
|
dabed0061d | ||
|
|
fa0421c5b9 | ||
|
|
c3ffb7b1ac | ||
|
|
9bb82d009c | ||
|
|
41dc58e428 | ||
|
|
0b364cf7f1 | ||
|
|
d70c2ccc17 | ||
|
|
7fcd36f2fb | ||
|
|
cf5ee5d4b2 | ||
|
|
7297bc4521 | ||
|
|
85ba57f9b0 | ||
|
|
9dce78370e | ||
|
|
f073b7568b | ||
|
|
f9b56d82f7 | ||
|
|
9c4a136989 | ||
|
|
b494857f21 | ||
|
|
0016ac8aa3 | ||
|
|
8bb55c84cd | ||
|
|
7e06b143e1 | ||
|
|
298f9489c2 | ||
|
|
a2cfa92f2f | ||
|
|
e792524b63 | ||
|
|
fc8ddba6cb |
@ -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
16
.github/workflows/test.yml
vendored
Normal 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
|
||||
15
.gitignore
vendored
15
.gitignore
vendored
@ -102,6 +102,7 @@ venv.bak/
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.compiled/
|
||||
|
||||
.ampy
|
||||
.submodules
|
||||
@ -115,3 +116,17 @@ venv.bak/
|
||||
|
||||
# Personal dev scripts
|
||||
.scripts
|
||||
|
||||
# Mountpoints
|
||||
mnt/
|
||||
mnt2/
|
||||
|
||||
# Mac
|
||||
.DS_Store
|
||||
|
||||
# build artifacts
|
||||
kmk/release_info.py
|
||||
kmk/release_info.mpy
|
||||
*.mpy
|
||||
.vscode
|
||||
.dist
|
||||
|
||||
81
.s3cfg
Normal file
81
.s3cfg
Normal 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
39
Dockerfile
Normal 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
|
||||
@ -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
|
||||
86
Makefile
86
Makefile
@ -1,61 +1,98 @@
|
||||
.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
|
||||
@echo "===> Removing pipenv-managed virtual environment"
|
||||
@$(PIPENV) --rm || true
|
||||
|
||||
test: lint
|
||||
test: lint unit-tests
|
||||
|
||||
.PHONY: unit-tests
|
||||
unit-tests: devdeps
|
||||
@$(PIPENV) run python3 -m unittest
|
||||
|
||||
reset-bootloader:
|
||||
@echo "===> Rebooting your board to bootloader (safe to ignore file not found errors)"
|
||||
@ -78,6 +115,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 +148,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
|
||||
|
||||
22
Pipfile
22
Pipfile
@ -4,19 +4,19 @@ 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 = "*"
|
||||
|
||||
501
Pipfile.lock
generated
501
Pipfile.lock
generated
@ -1,12 +1,10 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "96625b372d35c7f5ed0fd3289ba61afd0bcc034ddad31feb958a107e2751fb0a"
|
||||
"sha256": "0a04ec24d4aef6828e4f5eefa0a7d2c312f21f2b2f18c42c7004cdbe0c02bd53"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
"python_version": "3.7"
|
||||
},
|
||||
"requires": {},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
@ -15,52 +13,69 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"click": {
|
||||
"hashes": [
|
||||
"sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d",
|
||||
"sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b"
|
||||
"sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
|
||||
"sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
|
||||
],
|
||||
"version": "==6.7"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==8.0.3"
|
||||
},
|
||||
"decorator": {
|
||||
"hashes": [
|
||||
"sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82",
|
||||
"sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c"
|
||||
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
||||
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
||||
],
|
||||
"version": "==4.3.0"
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"flake8": {
|
||||
"hashes": [
|
||||
"sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0",
|
||||
"sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37"
|
||||
"sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b",
|
||||
"sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.5.0"
|
||||
"version": "==3.9.2"
|
||||
},
|
||||
"flake8-black": {
|
||||
"hashes": [
|
||||
"sha256:941514149cb8b489cb17a4bb1cf18d84375db3b34381bb018de83509437931a0",
|
||||
"sha256:f26651bc10db786c03f4093414f7c9ea982ed8a244cec323c984feeffdf4c118"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.2.1"
|
||||
},
|
||||
"flake8-commas": {
|
||||
"hashes": [
|
||||
@ -72,89 +87,126 @@
|
||||
},
|
||||
"flake8-comprehensions": {
|
||||
"hashes": [
|
||||
"sha256:b83891fec0e680b07aa1fd92e53eb6993be29a0f3673a09badbe8da307c445e0",
|
||||
"sha256:e4ccf1627f75f192eb7fde640f5edb81c98d04b1390df9d4145ffd7710bb1ef2"
|
||||
"sha256:b07aef3277623db32310aa241a1cec67212b53c1d18e767d7e26d4d83aa05bf7",
|
||||
"sha256:f24be9032587127f7a5bc6d066bf755b6e66834f694383adb8a673e229c1f559"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.4.1"
|
||||
"version": "==3.5.0"
|
||||
},
|
||||
"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:3f1116e985ef437c130431ac92f9b3155f8f652fda7405ac22ffdfd7a9d1055e"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.6"
|
||||
"version": "==3.2.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:0051c6f1f27cb756ffc0ffbac7d2cd48cb0362ac1736871399a739b2885134d3",
|
||||
"sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711",
|
||||
"sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd",
|
||||
"sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073",
|
||||
"sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708",
|
||||
"sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67",
|
||||
"sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23",
|
||||
"sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1",
|
||||
"sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08",
|
||||
"sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd",
|
||||
"sha256:2bde6792f313f4e918caabc46532aa64aa27a0db05d75b20edfc5c6f46479de2",
|
||||
"sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa",
|
||||
"sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8",
|
||||
"sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40",
|
||||
"sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab",
|
||||
"sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6",
|
||||
"sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc",
|
||||
"sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b",
|
||||
"sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e",
|
||||
"sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963",
|
||||
"sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3",
|
||||
"sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d",
|
||||
"sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d",
|
||||
"sha256:8c5d5b35f789a030ebb95bff352f1d27a93d81069f2adb3182d99882e095cefe",
|
||||
"sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28",
|
||||
"sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3",
|
||||
"sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e",
|
||||
"sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c",
|
||||
"sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d",
|
||||
"sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0",
|
||||
"sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497",
|
||||
"sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee",
|
||||
"sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713",
|
||||
"sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58",
|
||||
"sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a",
|
||||
"sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06",
|
||||
"sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88",
|
||||
"sha256:b336501a05e13b616ef81ce329c0e09ac5ed8c732d9ba7e3e983fcc1a9e86965",
|
||||
"sha256:b8c008de9d0daba7b6666aa5bbfdc23dcd78cafc33997c9b7741ff6353bafb7f",
|
||||
"sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4",
|
||||
"sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5",
|
||||
"sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c",
|
||||
"sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a",
|
||||
"sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1",
|
||||
"sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43",
|
||||
"sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627",
|
||||
"sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b",
|
||||
"sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168",
|
||||
"sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d",
|
||||
"sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5",
|
||||
"sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478",
|
||||
"sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf",
|
||||
"sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce",
|
||||
"sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c",
|
||||
"sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"
|
||||
],
|
||||
"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.2"
|
||||
},
|
||||
"ipdb": {
|
||||
"hashes": [
|
||||
"sha256:7081c65ed7bfe7737f83fa4213ca8afd9617b42ff6b3f1daf9a3419839a2a00a"
|
||||
"sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.11"
|
||||
"version": "==0.13.9"
|
||||
},
|
||||
"ipython": {
|
||||
"hashes": [
|
||||
"sha256:007dcd929c14631f83daff35df0147ea51d1af420da303fd078343878bd5fb62",
|
||||
"sha256:b0f2ef9eada4a68ef63ee10b6dde4f35c840035c50fd24265f8052c98947d5a4"
|
||||
"sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874",
|
||||
"sha256:b5548ec5329a4bcf054a5deed5099b0f9622eb9ea51aaa7104d215fece201d8c"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==6.5.0"
|
||||
},
|
||||
"ipython-genutils": {
|
||||
"hashes": [
|
||||
"sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
|
||||
"sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
|
||||
],
|
||||
"version": "==0.2.0"
|
||||
"version": "==7.31.1"
|
||||
},
|
||||
"isort": {
|
||||
"hashes": [
|
||||
"sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af",
|
||||
"sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8",
|
||||
"sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497"
|
||||
"sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6",
|
||||
"sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==4.3.4"
|
||||
"version": "==5.8.0"
|
||||
},
|
||||
"jedi": {
|
||||
"hashes": [
|
||||
"sha256:b409ed0f6913a701ed474a614a3bb46e6953639033e31f769ca7581da5bd1ec1",
|
||||
"sha256:c254b135fb39ad76e78d4d8f92765ebc9bf92cbc76f49e97ade1d5f5121e1f6f"
|
||||
"sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d",
|
||||
"sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"
|
||||
],
|
||||
"version": "==0.12.1"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.18.1"
|
||||
},
|
||||
"matplotlib-inline": {
|
||||
"hashes": [
|
||||
"sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee",
|
||||
"sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.1.3"
|
||||
},
|
||||
"mccabe": {
|
||||
"hashes": [
|
||||
@ -165,150 +217,295 @@
|
||||
},
|
||||
"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:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc",
|
||||
"sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147",
|
||||
"sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3",
|
||||
"sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba",
|
||||
"sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39",
|
||||
"sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85",
|
||||
"sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9",
|
||||
"sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a",
|
||||
"sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec",
|
||||
"sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88",
|
||||
"sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e",
|
||||
"sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a",
|
||||
"sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b",
|
||||
"sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1",
|
||||
"sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3",
|
||||
"sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef",
|
||||
"sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079",
|
||||
"sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52",
|
||||
"sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a",
|
||||
"sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a",
|
||||
"sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4",
|
||||
"sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996",
|
||||
"sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73",
|
||||
"sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a",
|
||||
"sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920",
|
||||
"sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7",
|
||||
"sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d",
|
||||
"sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770",
|
||||
"sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50",
|
||||
"sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2",
|
||||
"sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2",
|
||||
"sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d",
|
||||
"sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea",
|
||||
"sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"
|
||||
],
|
||||
"version": "==0.5.6"
|
||||
"version": "==1.0.3"
|
||||
},
|
||||
"mypy-extensions": {
|
||||
"hashes": [
|
||||
"sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
|
||||
"sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
|
||||
],
|
||||
"version": "==0.4.3"
|
||||
},
|
||||
"neovim": {
|
||||
"hashes": [
|
||||
"sha256:6ce58a742e0427491c0e1c8108556ee72ba33844209bd9e226b8da9538299276"
|
||||
"sha256:a6a0e7a5b4433bf4e6ddcbc5c5ff44170be7d84259d002b8e8d8fb4ee78af60f"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.2.6"
|
||||
"version": "==0.3.1"
|
||||
},
|
||||
"parso": {
|
||||
"hashes": [
|
||||
"sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2",
|
||||
"sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24"
|
||||
"sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0",
|
||||
"sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"
|
||||
],
|
||||
"version": "==0.3.1"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.8.3"
|
||||
},
|
||||
"pathmatch": {
|
||||
"pathspec": {
|
||||
"hashes": [
|
||||
"sha256:b35db907d0532c66132e5bc8aaa20dbfae916441987c8f0abd53ac538376d9a7"
|
||||
"sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
|
||||
"sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
|
||||
],
|
||||
"version": "==0.2.1"
|
||||
"version": "==0.9.0"
|
||||
},
|
||||
"pexpect": {
|
||||
"hashes": [
|
||||
"sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba",
|
||||
"sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b"
|
||||
"sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
|
||||
"sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
|
||||
],
|
||||
"markers": "sys_platform != 'win32'",
|
||||
"version": "==4.6.0"
|
||||
"version": "==4.8.0"
|
||||
},
|
||||
"pickleshare": {
|
||||
"hashes": [
|
||||
"sha256:84a9257227dfdd6fe1b4be1319096c20eb85ff1e82c7932f36efccfe1b09737b",
|
||||
"sha256:c9a2541f25aeabc070f12f452e1f2a8eae2abd51e1cd19e8430402bdf4c1d8b5"
|
||||
"sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
|
||||
"sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
|
||||
],
|
||||
"version": "==0.7.4"
|
||||
"version": "==0.7.5"
|
||||
},
|
||||
"prompt-toolkit": {
|
||||
"hashes": [
|
||||
"sha256:1df952620eccb399c53ebb359cc7d9a8d3a9538cb34c5a1344bdbeb29fbcc381",
|
||||
"sha256:3f473ae040ddaa52b52f97f6b4a493cfa9f5920c255a12dc56a7d34397a398a4",
|
||||
"sha256:858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"
|
||||
"sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6",
|
||||
"sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"
|
||||
],
|
||||
"version": "==1.0.15"
|
||||
"markers": "python_full_version >= '3.6.2'",
|
||||
"version": "==3.0.24"
|
||||
},
|
||||
"ptyprocess": {
|
||||
"hashes": [
|
||||
"sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0",
|
||||
"sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"
|
||||
"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
|
||||
"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
|
||||
],
|
||||
"version": "==0.6.0"
|
||||
"version": "==0.7.0"
|
||||
},
|
||||
"pycodestyle": {
|
||||
"hashes": [
|
||||
"sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766",
|
||||
"sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9"
|
||||
"sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068",
|
||||
"sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"
|
||||
],
|
||||
"version": "==2.3.1"
|
||||
"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:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f",
|
||||
"sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805"
|
||||
"sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3",
|
||||
"sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"
|
||||
],
|
||||
"version": "==1.6.0"
|
||||
"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:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65",
|
||||
"sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"
|
||||
],
|
||||
"version": "==2.2.0"
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==2.11.2"
|
||||
},
|
||||
"pynvim": {
|
||||
"hashes": [
|
||||
"sha256:3a795378bde5e8092fbeb3a1a99be9c613d2685542f1db0e5c6fd467eed56dff"
|
||||
],
|
||||
"version": "==0.4.3"
|
||||
},
|
||||
"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:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3",
|
||||
"sha256:a5de49a31e953b45ff2d2fd434bbc2670e8db5273606c1e737cc6b93eff3655f"
|
||||
],
|
||||
"version": "==0.9.1"
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.19.2"
|
||||
},
|
||||
"simplegeneric": {
|
||||
"python-magic": {
|
||||
"hashes": [
|
||||
"sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"
|
||||
"sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626",
|
||||
"sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf"
|
||||
],
|
||||
"version": "==0.8.1"
|
||||
"index": "pypi",
|
||||
"version": "==0.4.24"
|
||||
},
|
||||
"regex": {
|
||||
"hashes": [
|
||||
"sha256:04611cc0f627fc4a50bc4a9a2e6178a974c6a6a4aa9c1cca921635d2c47b9c87",
|
||||
"sha256:0b5d6f9aed3153487252d00a18e53f19b7f52a1651bc1d0c4b5844bc286dfa52",
|
||||
"sha256:0d2f5c3f7057530afd7b739ed42eb04f1011203bc5e4663e1e1d01bb50f813e3",
|
||||
"sha256:11772be1eb1748e0e197a40ffb82fb8fd0d6914cd147d841d9703e2bef24d288",
|
||||
"sha256:1333b3ce73269f986b1fa4d5d395643810074dc2de5b9d262eb258daf37dc98f",
|
||||
"sha256:16f81025bb3556eccb0681d7946e2b35ff254f9f888cff7d2120e8826330315c",
|
||||
"sha256:1a171eaac36a08964d023eeff740b18a415f79aeb212169080c170ec42dd5184",
|
||||
"sha256:1d6301f5288e9bdca65fab3de6b7de17362c5016d6bf8ee4ba4cbe833b2eda0f",
|
||||
"sha256:1e031899cb2bc92c0cf4d45389eff5b078d1936860a1be3aa8c94fa25fb46ed8",
|
||||
"sha256:1f8c0ae0a0de4e19fddaaff036f508db175f6f03db318c80bbc239a1def62d02",
|
||||
"sha256:2245441445099411b528379dee83e56eadf449db924648e5feb9b747473f42e3",
|
||||
"sha256:22709d701e7037e64dae2a04855021b62efd64a66c3ceed99dfd684bfef09e38",
|
||||
"sha256:24c89346734a4e4d60ecf9b27cac4c1fee3431a413f7aa00be7c4d7bbacc2c4d",
|
||||
"sha256:25716aa70a0d153cd844fe861d4f3315a6ccafce22b39d8aadbf7fcadff2b633",
|
||||
"sha256:2dacb3dae6b8cc579637a7b72f008bff50a94cde5e36e432352f4ca57b9e54c4",
|
||||
"sha256:34316bf693b1d2d29c087ee7e4bb10cdfa39da5f9c50fa15b07489b4ab93a1b5",
|
||||
"sha256:36b2d700a27e168fa96272b42d28c7ac3ff72030c67b32f37c05616ebd22a202",
|
||||
"sha256:37978254d9d00cda01acc1997513f786b6b971e57b778fbe7c20e30ae81a97f3",
|
||||
"sha256:38289f1690a7e27aacd049e420769b996826f3728756859420eeee21cc857118",
|
||||
"sha256:385ccf6d011b97768a640e9d4de25412204fbe8d6b9ae39ff115d4ff03f6fe5d",
|
||||
"sha256:3c7ea86b9ca83e30fa4d4cd0eaf01db3ebcc7b2726a25990966627e39577d729",
|
||||
"sha256:49810f907dfe6de8da5da7d2b238d343e6add62f01a15d03e2195afc180059ed",
|
||||
"sha256:519c0b3a6fbb68afaa0febf0d28f6c4b0a1074aefc484802ecb9709faf181607",
|
||||
"sha256:51f02ca184518702975b56affde6c573ebad4e411599005ce4468b1014b4786c",
|
||||
"sha256:552a39987ac6655dad4bf6f17dd2b55c7b0c6e949d933b8846d2e312ee80005a",
|
||||
"sha256:596f5ae2eeddb79b595583c2e0285312b2783b0ec759930c272dbf02f851ff75",
|
||||
"sha256:6014038f52b4b2ac1fa41a58d439a8a00f015b5c0735a0cd4b09afe344c94899",
|
||||
"sha256:61ebbcd208d78658b09e19c78920f1ad38936a0aa0f9c459c46c197d11c580a0",
|
||||
"sha256:6213713ac743b190ecbf3f316d6e41d099e774812d470422b3a0f137ea635832",
|
||||
"sha256:637e27ea1ebe4a561db75a880ac659ff439dec7f55588212e71700bb1ddd5af9",
|
||||
"sha256:6aa427c55a0abec450bca10b64446331b5ca8f79b648531138f357569705bc4a",
|
||||
"sha256:6ca45359d7a21644793de0e29de497ef7f1ae7268e346c4faf87b421fea364e6",
|
||||
"sha256:6db1b52c6f2c04fafc8da17ea506608e6be7086715dab498570c3e55e4f8fbd1",
|
||||
"sha256:752e7ddfb743344d447367baa85bccd3629c2c3940f70506eb5f01abce98ee68",
|
||||
"sha256:760c54ad1b8a9b81951030a7e8e7c3ec0964c1cb9fee585a03ff53d9e531bb8e",
|
||||
"sha256:768632fd8172ae03852e3245f11c8a425d95f65ff444ce46b3e673ae5b057b74",
|
||||
"sha256:7a0b9f6a1a15d494b35f25ed07abda03209fa76c33564c09c9e81d34f4b919d7",
|
||||
"sha256:7e070d3aef50ac3856f2ef5ec7214798453da878bb5e5a16c16a61edf1817cc3",
|
||||
"sha256:7e12949e5071c20ec49ef00c75121ed2b076972132fc1913ddf5f76cae8d10b4",
|
||||
"sha256:7e26eac9e52e8ce86f915fd33380f1b6896a2b51994e40bb094841e5003429b4",
|
||||
"sha256:85ffd6b1cb0dfb037ede50ff3bef80d9bf7fa60515d192403af6745524524f3b",
|
||||
"sha256:8618d9213a863c468a865e9d2ec50221015f7abf52221bc927152ef26c484b4c",
|
||||
"sha256:8acef4d8a4353f6678fd1035422a937c2170de58a2b29f7da045d5249e934101",
|
||||
"sha256:8d2f355a951f60f0843f2368b39970e4667517e54e86b1508e76f92b44811a8a",
|
||||
"sha256:90b6840b6448203228a9d8464a7a0d99aa8fa9f027ef95fe230579abaf8a6ee1",
|
||||
"sha256:9187500d83fd0cef4669385cbb0961e227a41c0c9bc39219044e35810793edf7",
|
||||
"sha256:93c20777a72cae8620203ac11c4010365706062aa13aaedd1a21bb07adbb9d5d",
|
||||
"sha256:93cce7d422a0093cfb3606beae38a8e47a25232eea0f292c878af580a9dc7605",
|
||||
"sha256:94c623c331a48a5ccc7d25271399aff29729fa202c737ae3b4b28b89d2b0976d",
|
||||
"sha256:97f32dc03a8054a4c4a5ab5d761ed4861e828b2c200febd4e46857069a483916",
|
||||
"sha256:9a2bf98ac92f58777c0fafc772bf0493e67fcf677302e0c0a630ee517a43b949",
|
||||
"sha256:a602bdc8607c99eb5b391592d58c92618dcd1537fdd87df1813f03fed49957a6",
|
||||
"sha256:a9d24b03daf7415f78abc2d25a208f234e2c585e5e6f92f0204d2ab7b9ab48e3",
|
||||
"sha256:abfcb0ef78df0ee9df4ea81f03beea41849340ce33a4c4bd4dbb99e23ec781b6",
|
||||
"sha256:b013f759cd69cb0a62de954d6d2096d648bc210034b79b1881406b07ed0a83f9",
|
||||
"sha256:b02e3e72665cd02afafb933453b0c9f6c59ff6e3708bd28d0d8580450e7e88af",
|
||||
"sha256:b52cc45e71657bc4743a5606d9023459de929b2a198d545868e11898ba1c3f59",
|
||||
"sha256:ba37f11e1d020969e8a779c06b4af866ffb6b854d7229db63c5fdddfceaa917f",
|
||||
"sha256:bb804c7d0bfbd7e3f33924ff49757de9106c44e27979e2492819c16972ec0da2",
|
||||
"sha256:bf594cc7cc9d528338d66674c10a5b25e3cde7dd75c3e96784df8f371d77a298",
|
||||
"sha256:c38baee6bdb7fe1b110b6b3aaa555e6e872d322206b7245aa39572d3fc991ee4",
|
||||
"sha256:c73d2166e4b210b73d1429c4f1ca97cea9cc090e5302df2a7a0a96ce55373f1c",
|
||||
"sha256:c9099bf89078675c372339011ccfc9ec310310bf6c292b413c013eb90ffdcafc",
|
||||
"sha256:cf0db26a1f76aa6b3aa314a74b8facd586b7a5457d05b64f8082a62c9c49582a",
|
||||
"sha256:d19a34f8a3429bd536996ad53597b805c10352a8561d8382e05830df389d2b43",
|
||||
"sha256:da80047524eac2acf7c04c18ac7a7da05a9136241f642dd2ed94269ef0d0a45a",
|
||||
"sha256:de2923886b5d3214be951bc2ce3f6b8ac0d6dfd4a0d0e2a4d2e5523d8046fdfb",
|
||||
"sha256:defa0652696ff0ba48c8aff5a1fac1eef1ca6ac9c660b047fc8e7623c4eb5093",
|
||||
"sha256:e54a1eb9fd38f2779e973d2f8958fd575b532fe26013405d1afb9ee2374e7ab8",
|
||||
"sha256:e5c31d70a478b0ca22a9d2d76d520ae996214019d39ed7dd93af872c7f301e52",
|
||||
"sha256:ebaeb93f90c0903233b11ce913a7cb8f6ee069158406e056f884854c737d2442",
|
||||
"sha256:ecfe51abf7f045e0b9cdde71ca9e153d11238679ef7b5da6c82093874adf3338",
|
||||
"sha256:f99112aed4fb7cee00c7f77e8b964a9b10f69488cdff626ffd797d02e2e4484f",
|
||||
"sha256:fd914db437ec25bfa410f8aa0aa2f3ba87cdfc04d9919d608d02330947afaeab"
|
||||
],
|
||||
"version": "==2022.1.18"
|
||||
},
|
||||
"s3cmd": {
|
||||
"hashes": [
|
||||
"sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa",
|
||||
"sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==2.1.0"
|
||||
},
|
||||
"setuptools": {
|
||||
"hashes": [
|
||||
"sha256:2404879cda71495fc4d5cbc445ed52fdaddf352b36e40be8dcc63147cb4edabe",
|
||||
"sha256:68eb94073fc486091447fcb0501efd6560a0e5a1839ba249e5ff3c4c93f05f90"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==60.5.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:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d",
|
||||
"sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"
|
||||
],
|
||||
"version": "==6.3.0"
|
||||
"version": "==6.18.3"
|
||||
},
|
||||
"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:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7",
|
||||
"sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"
|
||||
],
|
||||
"version": "==4.3.2"
|
||||
},
|
||||
"typing": {
|
||||
"hashes": [
|
||||
"sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d",
|
||||
"sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4",
|
||||
"sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a"
|
||||
],
|
||||
"version": "==3.6.6"
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"wcwidth": {
|
||||
"hashes": [
|
||||
"sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
|
||||
"sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
|
||||
"sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784",
|
||||
"sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"
|
||||
],
|
||||
"version": "==0.1.7"
|
||||
"version": "==0.2.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
156
README.md
156
README.md
@ -1,101 +1,93 @@
|
||||
# KMK: Python-based keyboard firmware for humans (and ARM microcontrollers)
|
||||
# KMK: Clackety Keyboards Powered by Python
|
||||

|
||||
|
||||
[](https://circleci.com/gh/KMKfw/kmk_firmware/tree/master)[](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).
|
||||
|
||||
[Or, head directly to the #support channel](https://matrix.to/#/#support:kmkfw.io)
|
||||
**KMK is currently looking for maintainers.** If you like keyboards and/or
|
||||
Python, and ideally have contributed to KMK in the past, and are interested in
|
||||
(co-)maintaining KMK, comment on [the relevant GitHub
|
||||
issue](https://github.com/KMKfw/kmk_firmware/issues/196) or drop by the Matrix
|
||||
channel below.
|
||||
|
||||
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).
|
||||
> 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://discord.gg/QBHUUpeGUd) for
|
||||
> convenience.
|
||||
|
||||
<hr/>
|
||||
## Features
|
||||
|
||||
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.
|
||||
- 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.
|
||||
|
||||
This project is currently written and maintained by:
|
||||
## Getting Started
|
||||
|
||||
- [Josh Klar (@klardotsh)](https://github.com/klardotsh)
|
||||
- [Kyle Brown (@kdb424)](https://github.com/kdb424)
|
||||
Our getting started guide can be found
|
||||
[here](https://github.com/KMKfw/kmk_firmware/blob/master/docs/Getting_Started.md)
|
||||
|
||||
With community help from:
|
||||
## The KMK Team
|
||||
|
||||
- [@siddacious](https://github.com/siddacious)
|
||||
- [Scott Shawcroft (@tannewt)](https://github.com/tannewt)
|
||||
KMK was originally authored by @klardotsh and @kdb424 over the winter of
|
||||
2018-19, and has been contributed to by numerous others since. 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).
|
||||
|
||||
> 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.
|
||||
> 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.
|
||||
|
||||
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:
|
||||
## Code Style
|
||||
|
||||
- [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)!
|
||||
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`).
|
||||
|
||||
- [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.
|
||||
## Tests
|
||||
|
||||
## Why KMK?
|
||||
Unit tests within the `tests` folder mock various CircuitPython modules to allow
|
||||
them to be executed in a desktop development environment.
|
||||
|
||||
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.
|
||||
Execute tests using the command `python -m unittest`.
|
||||
|
||||
## 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,
|
||||
version 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
16
boards/atreus62/README.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Atreus62
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
26
boards/atreus62/kb.py
Normal file
26
boards/atreus62/kb.py
Normal file
@ -0,0 +1,26 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
223
boards/atreus62/main.py
Normal file
223
boards/atreus62/main.py
Normal file
@ -0,0 +1,223 @@
|
||||
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
|
||||
|
||||
|
||||
layers_ext = Layers()
|
||||
|
||||
# 1 encoder, no button, inversed = True
|
||||
encoder_ext = EncoderHandler(
|
||||
(board.D40, board.D41, None, 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,
|
||||
],
|
||||
]
|
||||
|
||||
|
||||
# for use in the encoder extension
|
||||
encoder_map = [
|
||||
[
|
||||
(
|
||||
KC.VOLU,
|
||||
KC.VOLD,
|
||||
None,
|
||||
), # Only 1 encoder is being used, so only one tuple per layer is required
|
||||
],
|
||||
[
|
||||
(Zoom_in, Zoom_out, None),
|
||||
],
|
||||
[
|
||||
(_______, _______, None), # no action taken by the encoder on this layer
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
13
boards/boardsource/3x4/README.md
Normal file
13
boards/boardsource/3x4/README.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Boardsource 3x4
|
||||
|
||||

|
||||
|
||||
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.
|
||||
12
boards/boardsource/3x4/kb.py
Normal file
12
boards/boardsource/3x4/kb.py
Normal file
@ -0,0 +1,12 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
31
boards/boardsource/3x4/main.py
Normal file
31
boards/boardsource/3x4/main.py
Normal file
@ -0,0 +1,31 @@
|
||||
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()
|
||||
21
boards/boardsource/4x12/README.md
Normal file
21
boards/boardsource/4x12/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Boardsource 4x12 Ortho
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
25
boards/boardsource/4x12/kb.py
Normal file
25
boards/boardsource/4x12/kb.py
Normal file
@ -0,0 +1,25 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
44
boards/boardsource/4x12/main.py
Normal file
44
boards/boardsource/4x12/main.py
Normal file
@ -0,0 +1,44 @@
|
||||
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()
|
||||
21
boards/boardsource/5x12/README.md
Normal file
21
boards/boardsource/5x12/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Boardsource 5x12 Ortho
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
25
boards/boardsource/5x12/kb.py
Normal file
25
boards/boardsource/5x12/kb.py
Normal file
@ -0,0 +1,25 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
47
boards/boardsource/5x12/main.py
Normal file
47
boards/boardsource/5x12/main.py
Normal file
@ -0,0 +1,47 @@
|
||||
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()
|
||||
19
boards/boardsource/microdox/README.md
Normal file
19
boards/boardsource/microdox/README.md
Normal file
@ -0,0 +1,19 @@
|
||||
# Microdox
|
||||
|
||||

|
||||
|
||||
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_keyboards.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_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
24
boards/boardsource/microdox/kb.py
Normal file
24
boards/boardsource/microdox/kb.py
Normal file
@ -0,0 +1,24 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 20, 21, 22, 23, 24,
|
||||
5, 6, 7, 8, 9, 25, 26, 27, 28, 29,
|
||||
10, 11, 12, 13, 14, 30, 31, 32, 33, 34,
|
||||
17, 18, 19, 35, 36, 37,
|
||||
]
|
||||
55
boards/boardsource/microdox/main.py
Normal file
55
boards/boardsource/microdox/main.py
Normal file
@ -0,0 +1,55 @@
|
||||
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
27
boards/crkbd/README.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Corne Keyboard (CRKBD)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
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_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.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
30
boards/crkbd/kb.py
Normal file
@ -0,0 +1,30 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
|
||||
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
|
||||
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
|
||||
21, 22, 23, 47, 46, 45,
|
||||
]
|
||||
|
||||
28
boards/crkbd/kb_rp2040.py
Normal file
28
boards/crkbd/kb_rp2040.py
Normal file
@ -0,0 +1,28 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
|
||||
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
|
||||
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
|
||||
21, 22, 23, 47, 46, 45,
|
||||
]
|
||||
68
boards/crkbd/main.py
Normal file
68
boards/crkbd/main.py
Normal file
@ -0,0 +1,68 @@
|
||||
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()
|
||||
24
boards/ergo_travel/README.md
Normal file
24
boards/ergo_travel/README.md
Normal file
@ -0,0 +1,24 @@
|
||||
# Ergo Travel
|
||||
|
||||

|
||||
|
||||
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)
|
||||
|
||||
Retailers (Canada)
|
||||
[BlueMicro Store (ErgoTravel's creator)](https://store.jpconstantineau.com/#/group/split_boards)
|
||||
|
||||
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_keyboards.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_keyboards.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
33
boards/ergo_travel/kb.py
Normal file
@ -0,0 +1,33 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 6, 34, 33, 32, 31, 30, 29, 28,
|
||||
7, 8, 9, 10, 11, 12, 13, 41, 40, 39, 38, 37, 36, 35,
|
||||
14, 15, 16, 17, 18, 19, 20, 48, 47, 46, 45, 44, 43, 42,
|
||||
21, 22, 23, 24, 25, 26, 54, 53, 52, 51, 50, 49,
|
||||
]
|
||||
59
boards/ergo_travel/main.py
Normal file
59
boards/ergo_travel/main.py
Normal file
@ -0,0 +1,59 @@
|
||||
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()
|
||||
17
boards/fourtypercentclub/gherkin/README.md
Normal file
17
boards/fourtypercentclub/gherkin/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Ghirkin
|
||||
|
||||

|
||||
|
||||
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
|
||||
21
boards/fourtypercentclub/gherkin/kb.py
Normal file
21
boards/fourtypercentclub/gherkin/kb.py
Normal file
@ -0,0 +1,21 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
68
boards/fourtypercentclub/gherkin/main.py
Normal file
68
boards/fourtypercentclub/gherkin/main.py
Normal file
@ -0,0 +1,68 @@
|
||||
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()
|
||||
18
boards/fourtypercentclub/luddite/README.md
Normal file
18
boards/fourtypercentclub/luddite/README.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Luddite
|
||||
|
||||

|
||||
|
||||
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
|
||||
30
boards/fourtypercentclub/luddite/converter_kb.py
Normal file
30
boards/fourtypercentclub/luddite/converter_kb.py
Normal file
@ -0,0 +1,30 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
33
boards/fourtypercentclub/luddite/kb.py
Normal file
33
boards/fourtypercentclub/luddite/kb.py
Normal file
@ -0,0 +1,33 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
41
boards/fourtypercentclub/luddite/main.py
Normal file
41
boards/fourtypercentclub/luddite/main.py
Normal file
@ -0,0 +1,41 @@
|
||||
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()
|
||||
13
boards/jpconstantineau/Batreus44/README.md
Normal file
13
boards/jpconstantineau/Batreus44/README.md
Normal file
@ -0,0 +1,13 @@
|
||||
# JPConstantineau's Batreus44: An Atreus44 clone with Low Profile Switches and Wireless Options!
|
||||
|
||||

|
||||
|
||||
44 Keys Low Profile Keyboard inspired from Keyboardio's Atreus with a socket for a NiceNano, BlueMicro840 or Pro Micro RP2040 and a place to solder in a Battery.
|
||||
|
||||
kb_BlueMicro840.py is designed to work with the BlueMicro840
|
||||
|
||||
Retailers (USA)
|
||||
|
||||
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
|
||||
23
boards/jpconstantineau/Batreus44/kb_BlueMicro840.py
Normal file
23
boards/jpconstantineau/Batreus44/kb_BlueMicro840.py
Normal file
@ -0,0 +1,23 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.P0_15,
|
||||
board.P0_17,
|
||||
board.P0_20,
|
||||
board.P0_13,
|
||||
board.P0_24,
|
||||
board.P0_09,
|
||||
board.P0_03,
|
||||
board.P1_13,
|
||||
board.P0_02,
|
||||
board.P0_29,
|
||||
board.P0_26,
|
||||
board.P0_30,
|
||||
)
|
||||
row_pins = (board.P0_28, board.P1_11, board.P0_10, board.P1_06)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
15
boards/jpconstantineau/PyKey60/README.md
Normal file
15
boards/jpconstantineau/PyKey60/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# JPConstantineau's PyKey60
|
||||
|
||||

|
||||
|
||||
A 60% RGB Keyboard PCB with Hot Swap Sockets, running CircuitPython on a RP2040 Soldered on board.
|
||||
|
||||
kb.py is designed to work with the [PyKey60 CircuitPython UF2](https://circuitpython.org/board/jpconstantineau_pykey60/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/pykey60-rgb-keyboard-pcb-with-a-rp2040/)
|
||||
|
||||
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
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
27
boards/jpconstantineau/PyKey60/kb.py
Normal file
27
boards/jpconstantineau/PyKey60/kb.py
Normal file
@ -0,0 +1,27 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.COL1,
|
||||
board.COL2,
|
||||
board.COL3,
|
||||
board.COL4,
|
||||
board.COL5,
|
||||
board.COL6,
|
||||
board.COL7,
|
||||
board.COL8,
|
||||
board.COL9,
|
||||
board.COL10,
|
||||
board.COL11,
|
||||
board.COL12,
|
||||
board.COL13,
|
||||
board.COL14,
|
||||
)
|
||||
row_pins = (board.ROW1, board.ROW2, board.ROW3, board.ROW4, board.ROW5)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.NEOPIXEL
|
||||
rgb_num_pixels = 61
|
||||
15
boards/jpconstantineau/gridmx47/README.md
Normal file
15
boards/jpconstantineau/gridmx47/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# JPConstantineau's GridMX47: A Planck clone
|
||||
|
||||
/i/556481/products/2021-10-26T23%3A29%3A50.131Z-PXL_20211026_230848859.jpg?1635265805)
|
||||
|
||||
47 Keys RGB Keyboard inspired from OLKB's Planck with a Raspberry Pi Pico
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/47-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
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
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
25
boards/jpconstantineau/gridmx47/kb.py
Normal file
25
boards/jpconstantineau/gridmx47/kb.py
Normal file
@ -0,0 +1,25 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP11,
|
||||
board.GP12,
|
||||
board.GP13,
|
||||
board.GP14,
|
||||
board.GP15,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
board.GP26,
|
||||
board.GP27,
|
||||
board.GP28,
|
||||
)
|
||||
row_pins = (board.GP7, board.GP8, board.GP9, board.GP10)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.GP6
|
||||
rgb_num_pixels = 47
|
||||
15
boards/jpconstantineau/offsetmx43/README.md
Normal file
15
boards/jpconstantineau/offsetmx43/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# JPConstantineau's OffsetMX43: A 40% Staggered keyboard
|
||||
|
||||
/i/556481/products/2021-10-26T23%3A40%3A53.317Z-PXL_20211026_234121626.jpg?1635266543)
|
||||
|
||||
43 Keys RGB Keyboard the same size as the GridMX47 but with staggered keys instead of ortholinear (keys in a grid). Uses a Raspberry Pi Pico as the controller.
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/43-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
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
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
25
boards/jpconstantineau/offsetmx43/kb.py
Normal file
25
boards/jpconstantineau/offsetmx43/kb.py
Normal file
@ -0,0 +1,25 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP11,
|
||||
board.GP12,
|
||||
board.GP13,
|
||||
board.GP14,
|
||||
board.GP15,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
board.GP26,
|
||||
board.GP27,
|
||||
board.GP28,
|
||||
)
|
||||
row_pins = (board.GP7, board.GP8, board.GP9, board.GP10)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.GP6
|
||||
rgb_num_pixels = 47
|
||||
15
boards/jpconstantineau/vcolchoc44/README.md
Normal file
15
boards/jpconstantineau/vcolchoc44/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# JPConstantineau's VColChoc44: A Low Profile Atreus44 clone
|
||||
|
||||

|
||||
|
||||
44 Keys Low Profile RGB Keyboard inspired from Keyboardio's Atreus with a RP2040 Soldered on board.
|
||||
|
||||
kb.py is designed to work with the [PyKey60 CircuitPython UF2](https://circuitpython.org/board/jpconstantineau_pykey60/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/low-profile-44-keys-rgb-keyboard-pcb-with-a-rp2040/)
|
||||
|
||||
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
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
24
boards/jpconstantineau/vcolchoc44/kb.py
Normal file
24
boards/jpconstantineau/vcolchoc44/kb.py
Normal file
@ -0,0 +1,24 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.COL1,
|
||||
board.COL2,
|
||||
board.COL3,
|
||||
board.COL4,
|
||||
board.COL5,
|
||||
board.COL6,
|
||||
board.COL7,
|
||||
board.COL8,
|
||||
board.COL9,
|
||||
board.COL10,
|
||||
board.COL11,
|
||||
)
|
||||
row_pins = (board.ROW1, board.ROW2, board.ROW3, board.ROW4)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.NEOPIXEL
|
||||
rgb_num_pixels = 44
|
||||
16
boards/jpconstantineau/vcolmx44/README.md
Normal file
16
boards/jpconstantineau/vcolmx44/README.md
Normal file
@ -0,0 +1,16 @@
|
||||
# JPConstantineau's VColMX44: An Atreus44 clone
|
||||
|
||||

|
||||
|
||||
|
||||
44 Keys RGB Keyboard inspired from Keyboardio's Atreus with a Raspberry Pi Pico
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/44-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
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
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
24
boards/jpconstantineau/vcolmx44/kb.py
Normal file
24
boards/jpconstantineau/vcolmx44/kb.py
Normal file
@ -0,0 +1,24 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP20,
|
||||
board.GP19,
|
||||
board.GP18,
|
||||
board.GP17,
|
||||
board.GP16,
|
||||
board.GP5,
|
||||
board.GP4,
|
||||
board.GP3,
|
||||
board.GP2,
|
||||
board.GP1,
|
||||
board.GP0,
|
||||
)
|
||||
row_pins = (board.GP22, board.GP21, board.GP14, board.GP15)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.GP28
|
||||
rgb_num_pixels = 44
|
||||
15
boards/keebio/iris/README.md
Normal file
15
boards/keebio/iris/README.md
Normal 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_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
40
boards/keebio/iris/kb.py
Normal file
40
boards/keebio/iris/kb.py
Normal file
@ -0,0 +1,40 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
|
||||
# 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
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
|
||||
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
|
||||
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
|
||||
18, 19, 20, 21, 22, 23, 26, 57, 54, 53, 52, 51, 50, 49,
|
||||
28, 29, 30, 60, 59, 58,
|
||||
]
|
||||
40
boards/keebio/iris/kb_converter.py
Normal file
40
boards/keebio/iris/kb_converter.py
Normal file
@ -0,0 +1,40 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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_offset = (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
|
||||
|
||||
# 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
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
|
||||
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
|
||||
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
|
||||
18, 19, 20, 21, 22, 23, 26, 57, 54, 53, 52, 51, 50, 49,
|
||||
28, 29, 30, 60, 59, 58,
|
||||
]
|
||||
96
boards/keebio/iris/main.py
Normal file
96
boards/keebio/iris/main.py
Normal file
@ -0,0 +1,96 @@
|
||||
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()
|
||||
15
boards/keebio/levinson/README.md
Normal file
15
boards/keebio/levinson/README.md
Normal 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_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
23
boards/keebio/levinson/kb.py
Normal file
23
boards/keebio/levinson/kb.py
Normal file
@ -0,0 +1,23 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
18
boards/keebio/levinson/kb_converter.py
Normal file
18
boards/keebio/levinson/kb_converter.py
Normal file
@ -0,0 +1,18 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
133
boards/keebio/levinson/main.py
Normal file
133
boards/keebio/levinson/main.py
Normal file
@ -0,0 +1,133 @@
|
||||
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()
|
||||
16
boards/keebio/nyquist/README.md
Normal file
16
boards/keebio/nyquist/README.md
Normal 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_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
23
boards/keebio/nyquist/kb.py
Normal file
23
boards/keebio/nyquist/kb.py
Normal file
@ -0,0 +1,23 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
15
boards/keebio/nyquist/kb_converter.py
Normal file
15
boards/keebio/nyquist/kb_converter.py
Normal file
@ -0,0 +1,15 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
152
boards/keebio/nyquist/main.py
Normal file
152
boards/keebio/nyquist/main.py
Normal file
@ -0,0 +1,152 @@
|
||||
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
46
boards/klarank.py
Normal file
@ -0,0 +1,46 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners import intify_coordinate as ic
|
||||
|
||||
# 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, 12) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x, 12) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x, 12) for x in range(12))
|
||||
coord_mapping.extend(ic(3, r3_swap(x), 12) for x in range(12))
|
||||
|
||||
layers_ext = Layers()
|
||||
modules = [layers_ext]
|
||||
53
boards/kyria/README.md
Normal file
53
boards/kyria/README.md
Normal file
@ -0,0 +1,53 @@
|
||||
# Kyria Keyboard
|
||||
|
||||
A split keyboard with a 3x6 columnar stagger and 7 thumb keys. One button on each side is usually replaced by an
|
||||
encoder.
|
||||
|
||||
Official retailer of Kyria PCB: [splitkb.com](https://splitkb.com/collections/keyboard-kits/products/kyria-pcb-kit). PCB
|
||||
was designed with QMK in mind and KMK implementation is not officially supported by PCB designer and seller.
|
||||
|
||||
Keyboard works with controllers having Pro Micro layout. Existing configurations:
|
||||
|
||||
| PCB version | Board | Config file |
|
||||
|:-----------:|----------------------------------------------------------------------|---------------------------|
|
||||
| 1.* | [Sparkfun Pro Micro RP2040](https://www.sparkfun.com/products/18288) | kyria_v1_rp2040 |
|
||||
| 1.* | [Adafruit KB2040](https://www.adafruit.com/product/5302) | kyria_v1_kb2040 |
|
||||
| 2.* | [Sparkfun Pro Micro RP2040](https://www.sparkfun.com/products/18288) | _waiting for pinout docs_ |
|
||||
| 2.* | [Adafruit KB2040](https://www.adafruit.com/product/5302) | _waiting for pinout docs_ |
|
||||
|
||||
## Compatibility issues
|
||||
|
||||
- **TRRS connection** - KMK has no protocol for one-pin communication between two splits. So, if you are using TRRS wire
|
||||
connection, only right side send matrix events to the left side. No issue when using BLE.
|
||||
- **Right side encoder** - right encoder currently doesn't send updates to left half and can even freeze right half
|
||||
- **OLED screens** - OLED screens are not required, but often element of Kyria keyboards. KMK have no official OLED
|
||||
implementation, but as it's based on Circuit Python, adding one is very simple and there are many examples, also on
|
||||
KMK forks
|
||||
|
||||
## `main.py` example config
|
||||
|
||||
Current layout is based on default [QMK Kyria layout](https://config.qmk.fm/#/splitkb/kyria/rev1/LAYOUT)
|
||||
|
||||
It has the following modules/extensions enabled:
|
||||
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Do you need more keys than switches? Use
|
||||
layers.
|
||||
- [ModTap](https://github.com/KMKfw/kmk_firmware/blob/master/docs/modtap.md) Enable press/hold double binding of keys
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/blob/master/docs/media_keys.md) Common media controls
|
||||
|
||||
Also uncomment right section to enable samples of following:
|
||||
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Turn on the backlight (**requires neopixel.py
|
||||
library to work**)
|
||||
- [Encoder](https://github.com/KMKfw/kmk_firmware/blob/master/docs/encoder.md) Make the knobs do something
|
||||
|
||||
## More steps required during install
|
||||
|
||||
In order to mitigate lack of one-wire protocol, KMK use its UART implementation but with special low-level PIO
|
||||
subprogram available only on RP2040. It allows using other pins for UART than on-board RX and TX.
|
||||
|
||||
Because of the above, besides of normal installation steps, you have to also:
|
||||
|
||||
- install Circuit Python in 7.2+ version
|
||||
- add `adafruit_pioasm.mpy` library to lib or root folder of a board
|
||||
34
boards/kyria/kyria_v1_kb2040.py
Normal file
34
boards/kyria/kyria_v1_kb2040.py
Normal file
@ -0,0 +1,34 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners import intify_coordinate as ic
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.A3,
|
||||
board.A2,
|
||||
board.A1,
|
||||
board.A0,
|
||||
board.SCK,
|
||||
board.MISO,
|
||||
board.MOSI,
|
||||
board.D10,
|
||||
)
|
||||
row_pins = (board.D8, board.D7, board.D6, board.D4)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
data_pin = board.D1
|
||||
rgb_pixel_pin = board.D0
|
||||
encoder_pin_0 = board.D9
|
||||
encoder_pin_1 = board.D5
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(4, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(1, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(5, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(2, x, 8) for x in range(8))
|
||||
coord_mapping.extend(ic(6, x, 8) for x in range(7, -1, -1))
|
||||
coord_mapping.extend(ic(3, x, 8) for x in range(3, 8))
|
||||
coord_mapping.extend(ic(7, x, 8) for x in range(7, 2, -1))
|
||||
34
boards/kyria/kyria_v1_rp2040.py
Normal file
34
boards/kyria/kyria_v1_rp2040.py
Normal file
@ -0,0 +1,34 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners import intify_coordinate as ic
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.D29,
|
||||
board.D28,
|
||||
board.D27,
|
||||
board.D26,
|
||||
board.D22,
|
||||
board.D20,
|
||||
board.D23,
|
||||
board.D21,
|
||||
)
|
||||
row_pins = (board.D8, board.D7, board.D6, board.D4)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
data_pin = board.RX
|
||||
rgb_pixel_pin = board.D0
|
||||
encoder_pin_0 = board.D9
|
||||
encoder_pin_1 = board.D5
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(4, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(1, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(5, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(2, x, 8) for x in range(8))
|
||||
coord_mapping.extend(ic(6, x, 8) for x in range(7, -1, -1))
|
||||
coord_mapping.extend(ic(3, x, 8) for x in range(3, 8))
|
||||
coord_mapping.extend(ic(7, x, 8) for x in range(7, 2, -1))
|
||||
99
boards/kyria/main.py
Normal file
99
boards/kyria/main.py
Normal file
@ -0,0 +1,99 @@
|
||||
from kyria_v1_rp2040 import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.rgb import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.modtap import ModTap
|
||||
from kmk.modules.split import Split, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.debug_enabled = True
|
||||
|
||||
keyboard.modules.append(Layers())
|
||||
keyboard.modules.append(ModTap())
|
||||
keyboard.extensions.append(MediaKeys())
|
||||
|
||||
# Using drive names (KYRIAL, KYRIAR) to recognize sides; use split_side arg if you're not doing it
|
||||
split = Split(split_type=SplitType.UART, use_pio=True)
|
||||
keyboard.modules.append(split)
|
||||
|
||||
# Uncomment below if you're using encoder
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = ((keyboard.encoder_pin_0, keyboard.encoder_pin_1, None, False),)
|
||||
|
||||
# Uncomment below if you're having RGB
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=keyboard.rgb_pixel_pin,
|
||||
num_pixels=10,
|
||||
animation_mode=AnimationModes.BREATHING_RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(rgb_ext)
|
||||
|
||||
# Edit your layout below
|
||||
# Currently, that's a default QMK Kyria Layout - https://config.qmk.fm/#/splitkb/kyria/rev1/LAYOUT
|
||||
ESC_LCTL = KC.MT(KC.ESC, KC.LCTL)
|
||||
QUOTE_RCTL = KC.MT(KC.QUOTE, KC.RCTL)
|
||||
ENT_LALT = KC.MT(KC.ENT, KC.LALT)
|
||||
MINUS_RCTL = KC.MT(KC.MINUS, KC.RCTL)
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
|
||||
ESC_LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, QUOTE_RCTL,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
|
||||
],
|
||||
[
|
||||
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC,
|
||||
ESC_LCTL, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, MINUS_RCTL,
|
||||
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.RSFT,
|
||||
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
|
||||
],
|
||||
[
|
||||
KC.TAB, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
|
||||
ESC_LCTL, KC.A, KC.R, KC.S, KC.T, KC.G, KC.M, KC.N, KC.E, KC.I, KC.O, QUOTE_RCTL,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PGUP, KC.HOME, KC.UP, KC.END, KC.VOLU, KC.DEL,
|
||||
KC.TRNS, KC.LGUI, KC.LALT, KC.LCTL, KC.LSFT, KC.TRNS, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.VOLD, KC.INS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.SLCK, KC.TRNS, KC.TRNS, KC.PAUS, KC.MPRV, KC.MPLY, KC.MNXT, KC.MUTE, KC.PSCR,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.EQL,
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.PLUS,
|
||||
KC.PIPE, KC.BSLS, KC.COLN, KC.SCLN, KC.MINS, KC.LBRC, KC.LCBR, KC.TRNS, KC.TRNS, KC.RCBR, KC.RBRC, KC.UNDS, KC.COMM, KC.DOT, KC.SLSH, KC.QUES,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.F9, KC.F10, KC.F11, KC.F12, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.F5, KC.F6, KC.F7, KC.F8, KC.TRNS, KC.TRNS, KC.RSFT, KC.RCTL, KC.LALT, KC.RGUI, KC.TRNS,
|
||||
KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F4, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(0), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(1), KC.TRNS, KC.TRNS, KC.RGB_TOG, KC.RGB_SAI, KC.RGB_HUI, KC.RGB_VAI, KC.RGB_M_P, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(2), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.RGB_SAD, KC.RGB_HUD, KC.RGB_VAD, KC.RGB_M_P, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
]
|
||||
|
||||
# Uncomment below if using an encoder
|
||||
# Edit your encoder layout below
|
||||
encoder_handler.map = (
|
||||
((KC.VOLD, KC.VOLU),),
|
||||
((KC.VOLD, KC.VOLU),),
|
||||
((KC.VOLD, KC.VOLU),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
)
|
||||
keyboard.modules.append(encoder_handler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
20
boards/lily58/README.md
Normal file
20
boards/lily58/README.md
Normal file
@ -0,0 +1,20 @@
|
||||
# Lily 58 Pro
|
||||
|
||||

|
||||
|
||||
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
|
||||
31
boards/lily58/kb.py
Normal file
31
boards/lily58/kb.py
Normal file
@ -0,0 +1,31 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
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
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
|
||||
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
|
||||
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
|
||||
18, 19, 20, 21, 22, 23, 54, 53, 52, 51, 50, 49,
|
||||
26, 27, 28, 29, 30, 60, 59, 58, 57, 56,
|
||||
]
|
||||
71
boards/lily58/main.py
Normal file
71
boards/lily58/main.py
Normal file
@ -0,0 +1,71 @@
|
||||
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
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
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, XXXXXXX, XXXXXXX, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
],
|
||||
[ #LOWER
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
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, XXXXXXX, XXXXXXX,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
],
|
||||
[ #RAISE
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
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, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
],
|
||||
[ #ADJUST
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
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, XXXXXXX, XXXXXXX,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
24
boards/lunakey_pico/README.md
Normal file
24
boards/lunakey_pico/README.md
Normal file
@ -0,0 +1,24 @@
|
||||
# Lunakey Pico
|
||||
|
||||

|
||||
|
||||
Lunakey Pico is a 40% keyboard which has 44 keys and is split to left and right. Each side has 3 rows x 6 columns and 4 keys that are pressed by a thumb. Also, it has an ability to light up by Underglow LEDs on the bottom and an ability to play a sound by a speaker module. Of course, the column-staggered key layout is the result of deep thinking to fit each finger and each key naturally.
|
||||
|
||||
* 40% keyboard (3 rows and 6 columns for each side).
|
||||
* Column-staggered key layout to fit each length of fingers.
|
||||
* 4 keys for thumb fitted to range of movement of the finger naturally.
|
||||
* Supported both Cherry MX compatible key switches and Kailh Choc low profile key switches.
|
||||
* Can exchange key switches without soldering by adopting the key sockets.
|
||||
* Underglow LEDs lighting effect.
|
||||
* Provides a sound feedback by a piezoelectric speaker.
|
||||
|
||||
The special feature of this Lunakey Pico is that [Raspberry Pi Pico](https://www.raspberrypi.org/products/raspberry-pi-pico/) has been adopted. Users can use some firmwares including [KMK Firmware](https://github.com/KMKfw/kmk_firmware).
|
||||
|
||||
Hardware Availability: [PCB & Case Source](https://github.com/yoichiro/lunakey#lunakey-pico)
|
||||
|
||||
Retailers: [Lunakey Pico - Yoichiro's Garage - BOOTH](https://yoichiro.booth.pm/items/3324672)
|
||||
|
||||
## Dependencies
|
||||
|
||||
* [neopixel.py](https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel) - It is necessary to turn on the Underglow LEDs.
|
||||
* [pwmio](https://circuitpython.readthedocs.io/en/latest/shared-bindings/pwmio/index.html) - It is necessary to support a sound feedback with a piezoelectric speaker.
|
||||
18
boards/lunakey_pico/kb.py
Normal file
18
boards/lunakey_pico/kb.py
Normal file
@ -0,0 +1,18 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (board.GP12, board.GP13, board.GP14, board.GP15)
|
||||
col_pins = (board.GP21, board.GP20, board.GP19, board.GP18, board.GP17, board.GP16)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
|
||||
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
|
||||
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
|
||||
20, 21, 22, 23, 47, 46, 45, 44,
|
||||
]
|
||||
120
boards/lunakey_pico/main.py
Normal file
120
boards/lunakey_pico/main.py
Normal file
@ -0,0 +1,120 @@
|
||||
import board
|
||||
import digitalio
|
||||
|
||||
import pwmio
|
||||
import time
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.modtap import ModTap
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
led = digitalio.DigitalInOut(board.GP25)
|
||||
led.direction = digitalio.Direction.OUTPUT
|
||||
led.value = True
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.tap_time = 100
|
||||
|
||||
layers_ext = Layers()
|
||||
modtap_ext = ModTap()
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
|
||||
data_pin = board.GP1 if split_side == SplitSide.LEFT else board.GP0
|
||||
data_pin2 = board.GP0 if split_side == SplitSide.LEFT else board.GP1
|
||||
|
||||
split = Split(
|
||||
split_side=split_side,
|
||||
split_type=SplitType.UART,
|
||||
split_flip=True,
|
||||
data_pin=data_pin,
|
||||
data_pin2=data_pin2
|
||||
)
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=board.GP6,
|
||||
num_pixels=6,
|
||||
animation_mode=AnimationModes.BREATHING_RAINBOW
|
||||
)
|
||||
|
||||
keyboard.modules = [layers_ext, modtap_ext, split]
|
||||
keyboard.extensions.append(rgb_ext)
|
||||
|
||||
if split_side == SplitSide.LEFT:
|
||||
buzzer = pwmio.PWMOut(board.GP8, variable_frequency=True)
|
||||
OFF = 0
|
||||
ON = 2**15
|
||||
buzzer.duty_cycle = ON
|
||||
buzzer.frequency = 2000
|
||||
time.sleep(0.2)
|
||||
buzzer.frequency = 1000
|
||||
time.sleep(0.2)
|
||||
buzzer.duty_cycle = OFF
|
||||
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
ADJUST = KC.MO(3)
|
||||
CT_TAB = KC.MT(KC.TAB, KC.LCTRL)
|
||||
CT_QUOT = KC.MT(KC.QUOT, KC.LCTRL)
|
||||
SF_MINS = KC.MT(KC.MINS, KC.LSHIFT)
|
||||
SG_PSCR = KC.LSFT(KC.LGUI(KC.PSCR))
|
||||
SF_PSCR = KC.LSFT(KC.PSCR)
|
||||
CG_RGHT = KC.LCTRL(KC.LGUI(KC.RGHT))
|
||||
RESET = KC.RESET
|
||||
LANG1 = KC.LANG1
|
||||
LANG2 = KC.LANG2
|
||||
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.GESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
CT_TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, CT_QUOT,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, SF_MINS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.LALT, LANG2, LOWER, KC.SPC, KC.ENT, RAISE, LANG1, KC.RALT
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
],
|
||||
[ # LOWER
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.BSLS, KC.CIRC, KC.EXLM, KC.AMPR, KC.PIPE, KC.DLR, KC.AT, KC.ASTR, KC.PLUS, KC.EQL, KC.PERC, KC.BSPC,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DQT,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.COLN, KC.LABK, KC.RABK, KC.QUES, KC.UNDS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.LGUI, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, ADJUST, KC.TRNS, KC.LGUI
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
],
|
||||
[ # RAISE
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.BSLS, KC.CIRC, KC.EXLM, KC.AMPR, KC.PIPE, KC.DLR, KC.AT, KC.ASTR, KC.PLUS, KC.EQL, KC.PERC, KC.BSPC,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.HASH, KC.GRV, KC.LBRC, KC.RBRC, KC.LPRN, KC.RPRN, KC.PGUP, KC.HOME, KC.UP, KC.END, KC.TRNS, KC.DQT,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TILD, KC.TRNS, KC.TRNS, KC.LCBR, KC.RCBR, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.TRNS, KC.TRNS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.LGUI, KC.TRNS, ADJUST, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.LGUI
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
],
|
||||
[ # ADJUST
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, RESET, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.VOLD, KC.VOLU, KC.MUTE, KC.TRNS, SG_PSCR, SF_PSCR, KC.CAPS, KC.TRNS, CG_RGHT, KC.TRNS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
17
boards/may_pad/README.md
Normal file
17
boards/may_pad/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# May Pad
|
||||
|
||||

|
||||
|
||||
A through hole kit using a pro micro footprint and through hole diodes! Can be a 20 key macropad or a numpad!
|
||||
|
||||
kb.py is designed to work with the Adafruit KB2040
|
||||
|
||||
Retailers (USA)
|
||||
[KeyHive](https://keyhive.xyz/shop/may-pad)
|
||||
|
||||
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
|
||||
16
boards/may_pad/kb.py
Normal file
16
boards/may_pad/kb.py
Normal file
@ -0,0 +1,16 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (board.D5, board.D6, board.D7, board.D8, board.D9)
|
||||
col_pins = (
|
||||
board.A1,
|
||||
board.A0,
|
||||
board.SCK,
|
||||
board.MISO,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
||||
30
boards/may_pad/main.py
Normal file
30
boards/may_pad/main.py
Normal file
@ -0,0 +1,30 @@
|
||||
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
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.NLCK, KC.PSLS, KC.PAST, KC.PMNS,
|
||||
KC.P7, KC.P8, KC.P9, _______,
|
||||
KC.P4, KC.P5, KC.P6, KC.PPLS,
|
||||
KC.P1, KC.P2, KC.P3, _______,
|
||||
_______, KC.P0, KC.PDOT, KC.PENT,
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
17
boards/navi10/README.md
Normal file
17
boards/navi10/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Navi10 / ナビ10
|
||||
|
||||

|
||||
|
||||
A simple and fun navigation cluster macropad with exposed components.
|
||||
|
||||
kb.py is designed to work with the Adafruit KB2040
|
||||
|
||||
Retailers (USA)
|
||||
[KeyHive](https://keyhive.xyz/shop/navi10)
|
||||
|
||||
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
|
||||
19
boards/navi10/kb.py
Normal file
19
boards/navi10/kb.py
Normal file
@ -0,0 +1,19 @@
|
||||
import board
|
||||
import digitalio
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
led = digitalio.DigitalInOut(board.D9)
|
||||
led.direction = digitalio.Direction.OUTPUT
|
||||
led.value = False
|
||||
row_pins = (board.D10, board.MOSI, board.MISO, board.D8)
|
||||
col_pins = (
|
||||
board.D4,
|
||||
board.D7,
|
||||
board.SCK,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
||||
41
boards/navi10/main.py
Normal file
41
boards/navi10/main.py
Normal file
@ -0,0 +1,41 @@
|
||||
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
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #Nav Keys
|
||||
KC.INSERT, KC.HOME, KC.PGUP,
|
||||
KC.DELETE, KC.END, KC.PGDOWN,
|
||||
XXXXXXX, KC.UP, XXXXXXX,
|
||||
KC.LEFT, KC.DOWN, KC.RIGHT
|
||||
],
|
||||
[ #I3
|
||||
KC.LGUI(KC.L), KC.LGUI(KC.LSHIFT(KC.UP)), KC.LGUI(KC.LSHIFT(KC.P)),
|
||||
KC.LGUI(KC.LSHIFT(KC.LEFT)), KC.LGUI(KC.LSHIFT(KC.DOWN)), KC.LGUI(KC.LSHIFT(KC.RIGHT)),
|
||||
XXXXXXX, KC.LGUI(KC.UP), XXXXXXX,
|
||||
KC.LGUI(KC.LEFT), KC.LGUI(KC.DOWN), KC.LGUI(KC.RIGHT)
|
||||
],
|
||||
[ #Media keys
|
||||
KC.MUTE, KC.MPLY, KC.MSTP,
|
||||
KC.MRWD, XXXXXXX, KC.MFFD,
|
||||
XXXXXXX, KC.VOLU, XXXXXXX,
|
||||
KC.MPRV, KC.VOLD, KC.MNXT
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
28
boards/pimoroni/README.md
Normal file
28
boards/pimoroni/README.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Pimoroni Keybow family
|
||||
|
||||
A family of macro pads based on raspberry pi hardware:
|
||||

|
||||
(Original) Keybow - Raspberry Pi hat. 4x3 hotswap keys, with an APA102 LED per key.
|
||||
|
||||

|
||||
Keybow 2040 - custom RP2040 board. 4x4 hotswap keys, with an RGB LED per key driven by a shared IS31FL3731 controller.
|
||||
|
||||
These boards share the 'feature' of using a single GPIO per key rather than a row and column matrix, so these both
|
||||
use CircuitPython's `keypad.Keys` module instead of the regular KMK matrix scanner.
|
||||
|
||||
|
||||
## Retailers
|
||||
### UK
|
||||
- Pimoroni
|
||||
- [Keybow](https://shop.pimoroni.com/products/keybow)
|
||||
- [Keybow 2040](https://shop.pimoroni.com/products/keybow-2040)
|
||||
|
||||
### AU
|
||||
- Core Electronics
|
||||
- [Keybow](https://core-electronics.com.au/pimoroni-keybow-mini-mechanical-keyboard-kit-clicky-keys.html)
|
||||
- [Keybow 2040](https://core-electronics.com.au/pimoroni-keybow-2040-tactile-keys.html)
|
||||
|
||||
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 (Keybow only so far)
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
24
boards/pimoroni/keybow/code.py
Normal file
24
boards/pimoroni/keybow/code.py
Normal file
@ -0,0 +1,24 @@
|
||||
from keybow import Keybow
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keybow = Keybow()
|
||||
|
||||
# fmt: off
|
||||
keybow.keymap = [
|
||||
[
|
||||
KC.A, KC.B, KC.C,
|
||||
KC.E, KC.F, KC.G,
|
||||
KC.I, KC.J, KC.K,
|
||||
KC.M, KC.N, KC.O,
|
||||
]
|
||||
]
|
||||
|
||||
keybow.extensions.extend([MediaKeys()])
|
||||
keybow.modules.extend([Layers()])
|
||||
# fmt: on
|
||||
|
||||
if __name__ == '__main__':
|
||||
keybow.go()
|
||||
94
boards/pimoroni/keybow/keybow.py
Normal file
94
boards/pimoroni/keybow/keybow.py
Normal file
@ -0,0 +1,94 @@
|
||||
'''
|
||||
KMK keyboard for Pimoroni Keybow.
|
||||
|
||||
WARNING: This doesn't currently function correctly on the Raspberry Pi Zero,
|
||||
some of the keys are stuck in the 'pressed' position. There's either a bug in
|
||||
the keypad implementation on the rpi0, or the pin numbers don't match the pins
|
||||
in linux.
|
||||
|
||||
This is a 4x3 macro pad designed to fit the rpi's GPIO connector. Each key is
|
||||
attached to a single GPIO and has an APA102 LED mounted underneath it.
|
||||
|
||||
The layout of the board is as follows (GPIO connector on the left):
|
||||
|
||||
R0 | D20 D6 D22
|
||||
R1 | D17 D16 D12
|
||||
R2 | D24 D27 D26
|
||||
R0 | D13 D5 D23
|
||||
------------------
|
||||
C0 C1 C2
|
||||
|
||||
This board also functions with an adaptor (see
|
||||
https://learn.adafruit.com/itsybitsy-keybow-mechanical-keypad/) to work with an
|
||||
itsybitsy in place of the rpi, which uses an alternate pin mapping:
|
||||
|
||||
R0 | A2 A1 A0
|
||||
R1 | A5 A4 A3
|
||||
R2 | D10 D9 D7
|
||||
R3 | D11 D12 D2
|
||||
------------------
|
||||
C0 C1 C2
|
||||
|
||||
This keyboard file should automatically select the correct mapping at runtime.
|
||||
'''
|
||||
|
||||
import board
|
||||
|
||||
import adafruit_dotstar
|
||||
import sys
|
||||
|
||||
from kmk.extensions.rgb import RGB, AnimationModes
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
|
||||
# fmt: off
|
||||
def raspi_pins():
|
||||
return [
|
||||
board.D20, board.D16, board.D26,
|
||||
board.D6, board.D12, board.D13,
|
||||
board.D22, board.D24, board.D5,
|
||||
board.D17, board.D27, board.D23,
|
||||
]
|
||||
|
||||
|
||||
def itsybitsy_pins():
|
||||
return [
|
||||
board.D11, board.D12, board.D2,
|
||||
board.D10, board.D9, board.D7,
|
||||
board.A5, board.A4, board.A3,
|
||||
board.A2, board.A1, board.A0,
|
||||
]
|
||||
# fmt: on
|
||||
|
||||
|
||||
def isPi():
|
||||
return sys.platform == 'BROADCOM'
|
||||
|
||||
|
||||
if isPi():
|
||||
_KEY_CFG = raspi_pins()
|
||||
_LED_PINS = (board.SCK, board.MOSI)
|
||||
else:
|
||||
_KEY_CFG = itsybitsy_pins()
|
||||
_LED_PINS = (board.SCK, board.MOSI)
|
||||
|
||||
|
||||
led_strip = adafruit_dotstar.DotStar(_LED_PINS[0], _LED_PINS[1], 12)
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=0,
|
||||
pixels=led_strip,
|
||||
num_pixels=12,
|
||||
animation_mode=AnimationModes.BREATHING_RAINBOW,
|
||||
)
|
||||
|
||||
|
||||
class Keybow(KMKKeyboard):
|
||||
'''
|
||||
Default keyboard config for the Keybow.
|
||||
'''
|
||||
|
||||
extensions = [rgb_ext]
|
||||
|
||||
def __init__(self):
|
||||
self.matrix = KeysScanner(_KEY_CFG)
|
||||
0
boards/pimoroni/keybow_2040/__init__.py
Normal file
0
boards/pimoroni/keybow_2040/__init__.py
Normal file
30
boards/pimoroni/keybow_2040/code.py
Normal file
30
boards/pimoroni/keybow_2040/code.py
Normal file
@ -0,0 +1,30 @@
|
||||
from is31fl3731_pixelbuf import Keybow2040Leds
|
||||
from keybow_2040 import Keybow2040
|
||||
|
||||
from kmk.extensions.rgb import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=0,
|
||||
pixels=Keybow2040Leds(16),
|
||||
num_pixels=16,
|
||||
animation_mode=AnimationModes.BREATHING_RAINBOW,
|
||||
)
|
||||
|
||||
keybow = Keybow2040()
|
||||
keybow.extensions = [rgb_ext]
|
||||
|
||||
# fmt: off
|
||||
keybow.keymap = [
|
||||
[
|
||||
KC.A, KC.B, KC.C, KC.D,
|
||||
KC.E, KC.F, KC.G, KC.H,
|
||||
KC.I, KC.J, KC.K, KC.L,
|
||||
KC.M, KC.N, KC.O, KC.P,
|
||||
KC.Q
|
||||
]
|
||||
]
|
||||
# fmt: on
|
||||
|
||||
if __name__ == '__main__':
|
||||
keybow.go()
|
||||
26
boards/pimoroni/keybow_2040/is31fl3731_pixelbuf.py
Normal file
26
boards/pimoroni/keybow_2040/is31fl3731_pixelbuf.py
Normal file
@ -0,0 +1,26 @@
|
||||
'''
|
||||
Simple PixelBuf wrapper for the IS31FL3731 controller used for the Keybow2040's RGB LEDs.
|
||||
'''
|
||||
|
||||
import board
|
||||
|
||||
from adafruit_is31fl3731.keybow2040 import Keybow2040 as KeybowLeds
|
||||
from adafruit_pixelbuf import PixelBuf
|
||||
|
||||
|
||||
class Keybow2040Leds(PixelBuf):
|
||||
'''
|
||||
Minimal PixelBuf wrapper for the Keybow 2040's LED array.
|
||||
'''
|
||||
|
||||
def __init__(self, size: int):
|
||||
self.leds = KeybowLeds(board.I2C())
|
||||
self._pixels = size
|
||||
super().__init__(size, byteorder='RGB')
|
||||
|
||||
def _transmit(self, buffer):
|
||||
for pixel in range(self._pixels):
|
||||
r = buffer[pixel * 3 + 0]
|
||||
g = buffer[pixel * 3 + 1]
|
||||
b = buffer[pixel * 3 + 2]
|
||||
self.leds.pixelrgb(pixel // 4, pixel % 4, r, g, b)
|
||||
46
boards/pimoroni/keybow_2040/keybow_2040.py
Normal file
46
boards/pimoroni/keybow_2040/keybow_2040.py
Normal file
@ -0,0 +1,46 @@
|
||||
'''
|
||||
KMK keyboard for Pimoroni Keybow 2040.
|
||||
|
||||
This is a 4x4 macro pad based on the RP2040. Each key is attached to a single
|
||||
GPIO, so the KMK matrix scanner needs to be overridden. Additionally, each
|
||||
key has an RGB LED controlled by an IS31FL3731 controller which is incompatible
|
||||
with the default RGB module.
|
||||
|
||||
The layout of the board is as follows:
|
||||
|
||||
[RESET] [USB-C] [BOOT]
|
||||
R0 | SW3 SW7 SW11 SW15
|
||||
R1 | SW2 SW6 SW10 SW14
|
||||
R2 | SW1 SW5 SW9 SW13
|
||||
R3 | SW0 SW4 SW8 SW12
|
||||
-----------------------------
|
||||
C0 C1 C2 C3
|
||||
|
||||
The binding defined in the _KEY_CFG array binds the switches to keys such that
|
||||
the keymap can be written in a way that lines up with the natural order of the
|
||||
key switches, then adds [BOOT] in (4,0). [RESET] can't be mapped as a key.
|
||||
'''
|
||||
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
# fmt: off
|
||||
_KEY_CFG = [
|
||||
board.SW3, board.SW7, board.SW11, board.SW15,
|
||||
board.SW2, board.SW6, board.SW10, board.SW14,
|
||||
board.SW1, board.SW5, board.SW9, board.SW13,
|
||||
board.SW0, board.SW4, board.SW8, board.SW12,
|
||||
board.USER_SW,
|
||||
]
|
||||
# fmt: on
|
||||
|
||||
|
||||
class Keybow2040(KMKKeyboard):
|
||||
'''
|
||||
Default keyboard config for the Keybow2040.
|
||||
'''
|
||||
|
||||
def __init__(self):
|
||||
self.matrix = KeysScanner(_KEY_CFG)
|
||||
20
boards/reviung39/README.md
Normal file
20
boards/reviung39/README.md
Normal file
@ -0,0 +1,20 @@
|
||||
# Reviung39
|
||||
|
||||

|
||||
|
||||
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
27
boards/reviung39/kb.py
Normal file
@ -0,0 +1,27 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
49
boards/reviung39/main.py
Normal file
49
boards/reviung39/main.py
Normal file
@ -0,0 +1,49 @@
|
||||
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()
|
||||
20
boards/reviung41/README.md
Normal file
20
boards/reviung41/README.md
Normal file
@ -0,0 +1,20 @@
|
||||
# Reviung41
|
||||
|
||||

|
||||
|
||||
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
38
boards/reviung41/kb.py
Normal file
@ -0,0 +1,38 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners 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, 12) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x, 12) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x, 12) 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, 12) for x in range(5))
|
||||
65
boards/reviung41/main.py
Normal file
65
boards/reviung41/main.py
Normal file
@ -0,0 +1,65 @@
|
||||
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()
|
||||
19
boards/rhymestone/README.md
Normal file
19
boards/rhymestone/README.md
Normal file
@ -0,0 +1,19 @@
|
||||
# Rhymestone
|
||||
|
||||

|
||||
|
||||
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_keyboards.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_keyboards.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
15
boards/rhymestone/kb.py
Normal file
@ -0,0 +1,15 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners 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
|
||||
52
boards/rhymestone/main.py
Normal file
52
boards/rhymestone/main.py
Normal file
@ -0,0 +1,52 @@
|
||||
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()
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user