Compare commits
553 Commits
klardotsh/
...
topic-memo
Author | SHA1 | Date | |
---|---|---|---|
|
9e8c9c3669 | ||
|
0b4b98f5fb | ||
|
1cb4bddce4 | ||
|
dafc969bf5 | ||
|
a1450de137 | ||
|
f418762874 | ||
|
f9203dbb85 | ||
|
fdb07dd82b | ||
|
473d54a83f | ||
|
87955f7b5f | ||
|
194dd58d16 | ||
|
0b23f36b5d | ||
|
b3dd790f9d | ||
|
6ac68f5358 | ||
|
4b48547155 | ||
|
a91e379a79 | ||
|
a4ae43138a | ||
|
46cf7030a1 | ||
|
737973c334 | ||
|
aee793a300 | ||
|
ea94e9ba19 | ||
|
57c61ced85 | ||
|
c95efbe8ea | ||
|
e71d1fcb6e | ||
|
9d555209b8 | ||
|
f62d32157a | ||
|
b4363c73a7 | ||
|
6d6ccbc240 | ||
|
838263d409 | ||
|
bca11489d0 | ||
|
6d255a24f5 | ||
|
47601b730a | ||
|
5e7738fe87 | ||
|
5fcce6785c | ||
|
34f4264362 | ||
|
9c7b14e865 | ||
|
7f1e7a2708 | ||
|
ad3c261c1a | ||
|
0b23da551a | ||
|
ad6f4e5f05 | ||
|
23fd3a9bed | ||
|
ed38227276 | ||
|
f0544465c7 | ||
|
5d2a42d9a9 | ||
|
b676afe075 | ||
|
ce0e29b02f | ||
|
857c2c1162 | ||
|
a6825b6a3c | ||
|
6d132ba4b4 | ||
|
d9b0c9100c | ||
|
3d80e4aba8 | ||
|
4c93720a2f | ||
|
cb83df25f0 | ||
|
bfd5e2b262 | ||
|
5ba865e4c6 | ||
|
f674ac6b13 | ||
|
ecfbca82a6 | ||
|
2016848cb2 | ||
|
fbe593eb80 | ||
|
6c71538aa9 | ||
|
a1d8a990f1 | ||
|
5a85c6cfb3 | ||
|
e0ca1124fb | ||
|
2a7654f852 | ||
|
637991cedc | ||
|
606780ee1c | ||
|
fe6510baec | ||
|
74563368c5 | ||
|
3f3bd93109 | ||
|
3f826267b4 | ||
|
914f449699 | ||
|
84f1b2ae06 | ||
|
f086a78864 | ||
|
47ccd56c30 | ||
|
4d6983da11 | ||
|
d830ff7293 | ||
|
fd73292da0 | ||
|
bff8d3d7c5 | ||
|
d584b1f506 | ||
|
682731bfe1 | ||
|
ed94ad06da | ||
|
f46e3d59e6 | ||
|
25a86df5c1 | ||
|
688c2f0572 | ||
|
ca719faa29 | ||
|
c2a3a1895f | ||
|
8ab67052cf | ||
|
c49f409fb4 | ||
|
521f991f2d | ||
|
664a557483 | ||
|
50279f88fb | ||
|
82a68b0fe5 | ||
|
e064796016 | ||
|
3db84528f2 | ||
|
f33e4d1870 | ||
|
ab75b2bca3 | ||
|
81f4f7ccf0 | ||
|
103e51eb7f | ||
|
a5dc665ddc | ||
|
d8ca20c73c | ||
|
d7d253b1ea | ||
|
ec1f84f9ea | ||
|
b17c73bac0 | ||
|
0392aa74e2 | ||
|
0e58bdc343 | ||
|
9a3524d363 | ||
|
ca2aca47d6 | ||
|
00700e373c | ||
|
20705e2150 | ||
|
db395a81e4 | ||
|
9e29f4c442 | ||
|
6fe2457d8e | ||
|
2e515d25b4 | ||
|
a22e9754c1 | ||
|
f83e3361e4 | ||
|
946a8a8652 | ||
|
1293863cc0 | ||
|
ed41f4cda5 | ||
|
6e8aaff050 | ||
|
61ef788dc6 | ||
|
58248a9631 | ||
|
1bc54a10a1 | ||
|
17e63a435d | ||
|
edb5bc336e | ||
|
c4f81e3bd6 | ||
|
e478fed927 | ||
|
9e71038853 | ||
|
e72ab5a958 | ||
|
aafa0d9c6a | ||
|
ed378c960f | ||
|
178acc0702 | ||
|
36703a1e0d | ||
|
ac8a696acb | ||
|
258e622bb4 | ||
|
64d9147615 | ||
|
9e1d9aa621 | ||
|
26b629cc45 | ||
|
357165c14b | ||
|
03d5f7ae10 | ||
|
d2eba7b4ef | ||
|
bb2ddc1e33 | ||
|
e829bc83de | ||
|
b25f325871 | ||
|
7886b374b6 | ||
|
c77bfc432a | ||
|
4707b92fd4 | ||
|
c5c927acf2 | ||
|
c6bbd49d05 | ||
|
6033dc91d0 | ||
|
b55942731d | ||
|
654127bac7 | ||
|
05d1a622dd | ||
|
17a8e39bfe | ||
|
e448e09e73 | ||
|
d5dfbf456f | ||
|
aa327e4557 | ||
|
37e67c7c44 | ||
|
8db4cbbf94 | ||
|
1f8d66ce8c | ||
|
c54f4fea6c | ||
|
333913a924 | ||
|
15c5e4415e | ||
|
63d54cd9b5 | ||
|
b7de9122c2 | ||
|
d8594f49e1 | ||
|
17aac3b901 | ||
|
d7bfb917f2 | ||
|
5c8f33fc3e | ||
|
10572d71f6 | ||
|
dde6efe6fe | ||
|
f816f24497 | ||
|
8083188b9e | ||
|
9f23d9048e | ||
|
9840569dc6 | ||
|
d70de71c5f | ||
|
0f9eb196c2 | ||
|
ffcfc9835d | ||
|
6068b60cac | ||
|
614961521d | ||
|
50b8554757 | ||
|
d1f23a668c | ||
|
b6a782e83c | ||
|
91f494846a | ||
|
8d7ae8b284 | ||
|
561896769c | ||
|
5bf33056bf | ||
|
f44c1a8c20 | ||
|
a58293600d | ||
|
9a1fc95f54 | ||
|
80660e4336 | ||
|
4b0e459d62 | ||
|
90c4ce99f3 | ||
|
f21fa5edb7 | ||
|
3ee701e986 | ||
|
80b44b5c1b | ||
|
35b1a5843f | ||
|
400042f799 | ||
|
229b7afcb0 | ||
|
8460c5abfe | ||
|
093d0329e6 | ||
|
b04b740f9a | ||
|
d6659cd1a3 | ||
|
645124dab6 | ||
|
55df583396 | ||
|
ff3f7234d4 | ||
|
b91974bce2 | ||
|
08d3386643 | ||
|
4a29530ad5 | ||
|
1771b76b19 | ||
|
b6146365b3 | ||
|
32f5520ec6 | ||
|
e4db502b9b | ||
|
fb1a51abdc | ||
|
4c1ee62273 | ||
|
c00e769868 | ||
|
ef04cdc07c | ||
|
9e3b9f6229 | ||
|
b57d672bc5 | ||
|
11e042c098 | ||
|
401ba51ba5 | ||
|
42221f4a28 | ||
|
d895da5a6a | ||
|
fb931ab2d3 | ||
|
d95b4344dd | ||
|
dade827c76 | ||
|
72d6fb9304 | ||
|
eb23ed0020 | ||
|
73e17d780a | ||
|
da0e987b68 | ||
|
0e051a904b | ||
|
8d0b835c9c | ||
|
a6e5ee1c08 | ||
|
9a211f091a | ||
|
55b06bba79 | ||
|
2de044469f | ||
|
664af4d4f2 | ||
|
719cef4945 | ||
|
9b34fcd7ef | ||
|
6970a6c786 | ||
|
7e760a2917 | ||
|
ad43377a5e | ||
|
44d27ef09a | ||
|
86e3b138b2 | ||
|
caab7a4a15 | ||
|
6ef20ee042 | ||
|
09583aa7f7 | ||
|
c183bebb58 | ||
|
bea0f6d75b | ||
|
12e7a1b42c | ||
|
73e95bfdde | ||
|
842537064f | ||
|
9f964aba36 | ||
|
a4d6a44a04 | ||
|
b97fca7c76 | ||
|
0f22ce071b | ||
|
14fb78c191 | ||
|
5dc1013d00 | ||
|
5f5c04b9c7 | ||
|
9898a1ed73 | ||
|
d0c60a7694 | ||
|
f119678ec7 | ||
|
8208194842 | ||
|
003bb7d96a | ||
|
f632aaddc3 | ||
|
809a62b64d | ||
|
34a7d47e49 | ||
|
52b0ff5ca1 | ||
|
9b1976ec3e | ||
|
8d066e578d | ||
|
f12a7e9e9d | ||
|
1040221762 | ||
|
239b09d94d | ||
|
256c0f1c55 | ||
|
51f07d8558 | ||
|
7af0e11f75 | ||
|
385263e0e6 | ||
|
00a484fa61 | ||
|
0751f6ca5f | ||
|
29abba63e7 | ||
|
f2b8c7106e | ||
|
30252099cd | ||
|
6c2d64843b | ||
|
609e275c03 | ||
|
660b751c87 | ||
|
a0efbb92d5 | ||
|
1b902b907c | ||
|
bce7959f66 | ||
|
bd87b278b8 | ||
|
62ff7c838d | ||
|
4419f13f1c | ||
|
8950e45325 | ||
|
7d46e701aa | ||
|
bb8dec907a | ||
|
bdc2bbb3cf | ||
|
6a7f5e285e | ||
|
5eeb88e2b7 | ||
|
88cbbc6a90 | ||
|
49b83305d9 | ||
|
e67a1a8cd7 | ||
|
da239e535e | ||
|
9e171abc69 | ||
|
9733c43d2a | ||
|
dfa73a8cca | ||
|
1985712637 | ||
|
09d0287800 | ||
|
c7eaeaf90c | ||
|
fb5ecf7e38 | ||
|
642790b2e7 | ||
|
e04a01c25e | ||
|
62013f1770 | ||
|
27a0bc1977 | ||
|
7a51ce576f | ||
|
651e203cb7 | ||
|
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 |
93
.gitignore
vendored
93
.gitignore
vendored
@@ -1,3 +1,25 @@
|
||||
# KMK Specific
|
||||
.compiled/
|
||||
.ampy
|
||||
.submodules
|
||||
.circuitpy-deps
|
||||
.micropython-deps
|
||||
.devdeps
|
||||
.docker_base
|
||||
.dist
|
||||
|
||||
# Personal dev scripts
|
||||
.scripts
|
||||
|
||||
# Mountpoints
|
||||
mnt/
|
||||
mnt2/
|
||||
|
||||
# VSCode
|
||||
.vscode/
|
||||
|
||||
# Everything below is from https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
@@ -20,6 +42,7 @@ parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
@@ -38,14 +61,17 @@ pip-delete-this-directory.txt
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
@@ -55,6 +81,7 @@ coverage.xml
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
@@ -67,16 +94,47 @@ instance/
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/#use-with-ide
|
||||
#.pdm.toml
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
@@ -103,27 +161,22 @@ venv.bak/
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.compiled/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
.ampy
|
||||
.submodules
|
||||
.circuitpy-deps
|
||||
.micropython-deps
|
||||
.devdeps
|
||||
.docker_base
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# Pycharms cruft
|
||||
.idea
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Personal dev scripts
|
||||
.scripts
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# Mountpoints
|
||||
mnt/
|
||||
mnt2/
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
.idea/
|
||||
|
||||
# build artifacts
|
||||
kmk/release_info.py
|
||||
kmk/release_info.mpy
|
||||
*.mpy
|
||||
.vscode
|
||||
.dist
|
||||
|
10
Makefile
10
Makefile
@@ -21,7 +21,7 @@ PIPENV ?= $(shell which pipenv 2>/dev/null)
|
||||
|
||||
MPY_CROSS ?= $(shell which mpy-cross 2>/dev/null)
|
||||
MPY_FLAGS ?= '-O2'
|
||||
MPY_SOURCES = 'kmk/'
|
||||
MPY_SOURCES ?= 'kmk/'
|
||||
MPY_TARGET_DIR ?= .compiled
|
||||
PY_KMK_TREE = $(shell find $(MPY_SOURCES) -name "*.py")
|
||||
DIST_DESCRIBE = $(shell $(DIST_DESCRIBE_CMD))
|
||||
@@ -40,7 +40,7 @@ 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' \;
|
||||
@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
|
||||
|
||||
@@ -88,7 +88,11 @@ powerwash: clean
|
||||
@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)"
|
||||
|
383
Pipfile.lock
generated
383
Pipfile.lock
generated
@@ -47,19 +47,19 @@
|
||||
},
|
||||
"click": {
|
||||
"hashes": [
|
||||
"sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a",
|
||||
"sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"
|
||||
"sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
|
||||
"sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==8.0.1"
|
||||
"version": "==8.0.3"
|
||||
},
|
||||
"decorator": {
|
||||
"hashes": [
|
||||
"sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323",
|
||||
"sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"
|
||||
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
||||
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==5.0.9"
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"flake8": {
|
||||
"hashes": [
|
||||
@@ -110,58 +110,64 @@
|
||||
},
|
||||
"greenlet": {
|
||||
"hashes": [
|
||||
"sha256:03f28a5ea20201e70ab70518d151116ce939b412961c33827519ce620957d44c",
|
||||
"sha256:06d7ac89e6094a0a8f8dc46aa61898e9e1aec79b0f8b47b2400dd51a44dbc832",
|
||||
"sha256:06ecb43b04480e6bafc45cb1b4b67c785e183ce12c079473359e04a709333b08",
|
||||
"sha256:096cb0217d1505826ba3d723e8981096f2622cde1eb91af9ed89a17c10aa1f3e",
|
||||
"sha256:0c557c809eeee215b87e8a7cbfb2d783fb5598a78342c29ade561440abae7d22",
|
||||
"sha256:0de64d419b1cb1bfd4ea544bedea4b535ef3ae1e150b0f2609da14bbf48a4a5f",
|
||||
"sha256:14927b15c953f8f2d2a8dffa224aa78d7759ef95284d4c39e1745cf36e8cdd2c",
|
||||
"sha256:16183fa53bc1a037c38d75fdc59d6208181fa28024a12a7f64bb0884434c91ea",
|
||||
"sha256:206295d270f702bc27dbdbd7651e8ebe42d319139e0d90217b2074309a200da8",
|
||||
"sha256:22002259e5b7828b05600a762579fa2f8b33373ad95a0ee57b4d6109d0e589ad",
|
||||
"sha256:2325123ff3a8ecc10ca76f062445efef13b6cf5a23389e2df3c02a4a527b89bc",
|
||||
"sha256:258f9612aba0d06785143ee1cbf2d7361801c95489c0bd10c69d163ec5254a16",
|
||||
"sha256:3096286a6072553b5dbd5efbefc22297e9d06a05ac14ba017233fedaed7584a8",
|
||||
"sha256:3d13da093d44dee7535b91049e44dd2b5540c2a0e15df168404d3dd2626e0ec5",
|
||||
"sha256:408071b64e52192869129a205e5b463abda36eff0cebb19d6e63369440e4dc99",
|
||||
"sha256:598bcfd841e0b1d88e32e6a5ea48348a2c726461b05ff057c1b8692be9443c6e",
|
||||
"sha256:5d928e2e3c3906e0a29b43dc26d9b3d6e36921eee276786c4e7ad9ff5665c78a",
|
||||
"sha256:5f75e7f237428755d00e7460239a2482fa7e3970db56c8935bd60da3f0733e56",
|
||||
"sha256:60848099b76467ef09b62b0f4512e7e6f0a2c977357a036de602b653667f5f4c",
|
||||
"sha256:6b1d08f2e7f2048d77343279c4d4faa7aef168b3e36039cba1917fffb781a8ed",
|
||||
"sha256:70bd1bb271e9429e2793902dfd194b653221904a07cbf207c3139e2672d17959",
|
||||
"sha256:76ed710b4e953fc31c663b079d317c18f40235ba2e3d55f70ff80794f7b57922",
|
||||
"sha256:7920e3eccd26b7f4c661b746002f5ec5f0928076bd738d38d894bb359ce51927",
|
||||
"sha256:7db68f15486d412b8e2cfcd584bf3b3a000911d25779d081cbbae76d71bd1a7e",
|
||||
"sha256:8833e27949ea32d27f7e96930fa29404dd4f2feb13cce483daf52e8842ec246a",
|
||||
"sha256:944fbdd540712d5377a8795c840a97ff71e7f3221d3fddc98769a15a87b36131",
|
||||
"sha256:9a6b035aa2c5fcf3dbbf0e3a8a5bc75286fc2d4e6f9cfa738788b433ec894919",
|
||||
"sha256:9bdcff4b9051fb1aa4bba4fceff6a5f770c6be436408efd99b76fc827f2a9319",
|
||||
"sha256:a9017ff5fc2522e45562882ff481128631bf35da444775bc2776ac5c61d8bcae",
|
||||
"sha256:aa4230234d02e6f32f189fd40b59d5a968fe77e80f59c9c933384fe8ba535535",
|
||||
"sha256:ad80bb338cf9f8129c049837a42a43451fc7c8b57ad56f8e6d32e7697b115505",
|
||||
"sha256:adb94a28225005890d4cf73648b5131e885c7b4b17bc762779f061844aabcc11",
|
||||
"sha256:b3090631fecdf7e983d183d0fad7ea72cfb12fa9212461a9b708ff7907ffff47",
|
||||
"sha256:b33b51ab057f8a20b497ffafdb1e79256db0c03ef4f5e3d52e7497200e11f821",
|
||||
"sha256:b97c9a144bbeec7039cca44df117efcbeed7209543f5695201cacf05ba3b5857",
|
||||
"sha256:be13a18cec649ebaab835dff269e914679ef329204704869f2f167b2c163a9da",
|
||||
"sha256:be9768e56f92d1d7cd94185bab5856f3c5589a50d221c166cc2ad5eb134bd1dc",
|
||||
"sha256:c1580087ab493c6b43e66f2bdd165d9e3c1e86ef83f6c2c44a29f2869d2c5bd5",
|
||||
"sha256:c35872b2916ab5a240d52a94314c963476c989814ba9b519bc842e5b61b464bb",
|
||||
"sha256:c70c7dd733a4c56838d1f1781e769081a25fade879510c5b5f0df76956abfa05",
|
||||
"sha256:c767458511a59f6f597bfb0032a1c82a52c29ae228c2c0a6865cfeaeaac4c5f5",
|
||||
"sha256:c87df8ae3f01ffb4483c796fe1b15232ce2b219f0b18126948616224d3f658ee",
|
||||
"sha256:ca1c4a569232c063615f9e70ff9a1e2fee8c66a6fb5caf0f5e8b21a396deec3e",
|
||||
"sha256:cc407b68e0a874e7ece60f6639df46309376882152345508be94da608cc0b831",
|
||||
"sha256:da862b8f7de577bc421323714f63276acb2f759ab8c5e33335509f0b89e06b8f",
|
||||
"sha256:dfe7eac0d253915116ed0cd160a15a88981a1d194c1ef151e862a5c7d2f853d3",
|
||||
"sha256:ed1377feed808c9c1139bdb6a61bcbf030c236dd288d6fca71ac26906ab03ba6",
|
||||
"sha256:f42ad188466d946f1b3afc0a9e1a266ac8926461ee0786c06baac6bd71f8a6f3",
|
||||
"sha256:f92731609d6625e1cc26ff5757db4d32b6b810d2a3363b0ff94ff573e5901f6f"
|
||||
"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"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
||||
"version": "==1.1.0"
|
||||
"version": "==1.1.2"
|
||||
},
|
||||
"ipdb": {
|
||||
"hashes": [
|
||||
@@ -172,18 +178,11 @@
|
||||
},
|
||||
"ipython": {
|
||||
"hashes": [
|
||||
"sha256:9bc24a99f5d19721fb8a2d1408908e9c0520a17fff2233ffe82620847f17f1b6",
|
||||
"sha256:d513e93327cf8657d6467c81f1f894adc125334ffe0e4ddd1abbb1c78d828703"
|
||||
"sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874",
|
||||
"sha256:b5548ec5329a4bcf054a5deed5099b0f9622eb9ea51aaa7104d215fece201d8c"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==7.24.1"
|
||||
},
|
||||
"ipython-genutils": {
|
||||
"hashes": [
|
||||
"sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
|
||||
"sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
|
||||
],
|
||||
"version": "==0.2.0"
|
||||
"version": "==7.31.1"
|
||||
},
|
||||
"isort": {
|
||||
"hashes": [
|
||||
@@ -195,19 +194,19 @@
|
||||
},
|
||||
"jedi": {
|
||||
"hashes": [
|
||||
"sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93",
|
||||
"sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"
|
||||
"sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d",
|
||||
"sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.18.0"
|
||||
"version": "==0.18.1"
|
||||
},
|
||||
"matplotlib-inline": {
|
||||
"hashes": [
|
||||
"sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811",
|
||||
"sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"
|
||||
"sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee",
|
||||
"sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.1.2"
|
||||
"version": "==0.1.3"
|
||||
},
|
||||
"mccabe": {
|
||||
"hashes": [
|
||||
@@ -218,36 +217,42 @@
|
||||
},
|
||||
"msgpack": {
|
||||
"hashes": [
|
||||
"sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9",
|
||||
"sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841",
|
||||
"sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439",
|
||||
"sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694",
|
||||
"sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a",
|
||||
"sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f",
|
||||
"sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e",
|
||||
"sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1",
|
||||
"sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c",
|
||||
"sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b",
|
||||
"sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759",
|
||||
"sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326",
|
||||
"sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc",
|
||||
"sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192",
|
||||
"sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83",
|
||||
"sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06",
|
||||
"sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e",
|
||||
"sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9",
|
||||
"sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33",
|
||||
"sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54",
|
||||
"sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f",
|
||||
"sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887",
|
||||
"sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009",
|
||||
"sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2",
|
||||
"sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c",
|
||||
"sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87",
|
||||
"sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984",
|
||||
"sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"
|
||||
"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": "==1.0.2"
|
||||
"version": "==1.0.3"
|
||||
},
|
||||
"mypy-extensions": {
|
||||
"hashes": [
|
||||
@@ -265,18 +270,18 @@
|
||||
},
|
||||
"parso": {
|
||||
"hashes": [
|
||||
"sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398",
|
||||
"sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"
|
||||
"sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0",
|
||||
"sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.8.2"
|
||||
"version": "==0.8.3"
|
||||
},
|
||||
"pathspec": {
|
||||
"hashes": [
|
||||
"sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd",
|
||||
"sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"
|
||||
"sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
|
||||
"sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
|
||||
],
|
||||
"version": "==0.8.1"
|
||||
"version": "==0.9.0"
|
||||
},
|
||||
"pexpect": {
|
||||
"hashes": [
|
||||
@@ -295,11 +300,11 @@
|
||||
},
|
||||
"prompt-toolkit": {
|
||||
"hashes": [
|
||||
"sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f",
|
||||
"sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"
|
||||
"sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6",
|
||||
"sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.1'",
|
||||
"version": "==3.0.19"
|
||||
"markers": "python_full_version >= '3.6.2'",
|
||||
"version": "==3.0.24"
|
||||
},
|
||||
"ptyprocess": {
|
||||
"hashes": [
|
||||
@@ -326,11 +331,11 @@
|
||||
},
|
||||
"pygments": {
|
||||
"hashes": [
|
||||
"sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f",
|
||||
"sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"
|
||||
"sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65",
|
||||
"sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==2.9.0"
|
||||
"version": "==2.11.2"
|
||||
},
|
||||
"pynvim": {
|
||||
"hashes": [
|
||||
@@ -347,18 +352,19 @@
|
||||
},
|
||||
"python-dateutil": {
|
||||
"hashes": [
|
||||
"sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c",
|
||||
"sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"
|
||||
"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.1"
|
||||
"version": "==2.8.2"
|
||||
},
|
||||
"python-dotenv": {
|
||||
"hashes": [
|
||||
"sha256:dd8fe852847f4fbfadabf6183ddd4c824a9651f02d51714fa075c95561959c7d",
|
||||
"sha256:effaac3c1e58d89b3ccb4d04a40dc7ad6e0275fda25fd75ae9d323e2465e202d"
|
||||
"sha256:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3",
|
||||
"sha256:a5de49a31e953b45ff2d2fd434bbc2670e8db5273606c1e737cc6b93eff3655f"
|
||||
],
|
||||
"version": "==0.18.0"
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.19.2"
|
||||
},
|
||||
"python-magic": {
|
||||
"hashes": [
|
||||
@@ -370,49 +376,82 @@
|
||||
},
|
||||
"regex": {
|
||||
"hashes": [
|
||||
"sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5",
|
||||
"sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79",
|
||||
"sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31",
|
||||
"sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500",
|
||||
"sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11",
|
||||
"sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14",
|
||||
"sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3",
|
||||
"sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439",
|
||||
"sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c",
|
||||
"sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82",
|
||||
"sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711",
|
||||
"sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093",
|
||||
"sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a",
|
||||
"sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb",
|
||||
"sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8",
|
||||
"sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17",
|
||||
"sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000",
|
||||
"sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d",
|
||||
"sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480",
|
||||
"sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc",
|
||||
"sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0",
|
||||
"sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9",
|
||||
"sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765",
|
||||
"sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e",
|
||||
"sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a",
|
||||
"sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07",
|
||||
"sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f",
|
||||
"sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac",
|
||||
"sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7",
|
||||
"sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed",
|
||||
"sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968",
|
||||
"sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7",
|
||||
"sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2",
|
||||
"sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4",
|
||||
"sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87",
|
||||
"sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8",
|
||||
"sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10",
|
||||
"sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29",
|
||||
"sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605",
|
||||
"sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6",
|
||||
"sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"
|
||||
"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": "==2021.4.4"
|
||||
"version": "==2022.1.18"
|
||||
},
|
||||
"s3cmd": {
|
||||
"hashes": [
|
||||
@@ -422,6 +461,14 @@
|
||||
"index": "pypi",
|
||||
"version": "==2.1.0"
|
||||
},
|
||||
"setuptools": {
|
||||
"hashes": [
|
||||
"sha256:2404879cda71495fc4d5cbc445ed52fdaddf352b36e40be8dcc63147cb4edabe",
|
||||
"sha256:68eb94073fc486091447fcb0501efd6560a0e5a1839ba249e5ff3c4c93f05f90"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==60.5.0"
|
||||
},
|
||||
"six": {
|
||||
"hashes": [
|
||||
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
||||
@@ -432,10 +479,10 @@
|
||||
},
|
||||
"testfixtures": {
|
||||
"hashes": [
|
||||
"sha256:5ec3a0dd6f71cc4c304fbc024a10cc293d3e0b852c868014b9f233203e149bda",
|
||||
"sha256:9ed31e83f59619e2fa17df053b241e16e0608f4580f7b5a9333a0c9bdcc99137"
|
||||
"sha256:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d",
|
||||
"sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"
|
||||
],
|
||||
"version": "==6.17.1"
|
||||
"version": "==6.18.3"
|
||||
},
|
||||
"toml": {
|
||||
"hashes": [
|
||||
@@ -447,11 +494,11 @@
|
||||
},
|
||||
"traitlets": {
|
||||
"hashes": [
|
||||
"sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396",
|
||||
"sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"
|
||||
"sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7",
|
||||
"sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==5.0.5"
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"wcwidth": {
|
||||
"hashes": [
|
||||
|
65
README.md
65
README.md
@@ -1,34 +1,27 @@
|
||||
# KMK: Clackety Keyboards Powered by Python
|
||||

|
||||

|
||||

|
||||
[](https://discord.gg/QBHUUpeGUd)
|
||||

|
||||

|
||||

|
||||
|
||||
Documentation available at [📖 kmkfw.io](http://kmkfw.io/).
|
||||
|
||||
KMK is a feature-rich and beginner-friendly firmware for computer keyboards
|
||||
written and configured in
|
||||
[CircuitPython](https://github.com/adafruit/circuitpython). **KMK is currently
|
||||
in public beta, however should handle most workflows without major issues**.
|
||||
[CircuitPython](https://github.com/adafruit/circuitpython).
|
||||
|
||||
<!--
|
||||
@klardotsh 06 July 2021: commented for now because CDN builds have been broken
|
||||
for ages and folks are (reasonably) getting confused.
|
||||
|
||||
You can always find the latest releases on our CDN, in [compiled and
|
||||
optimized](https://cdn.kmkfw.io/kmk-latest.zip) and [raw, hackable text
|
||||
file](https://cdn.kmkfw.io/kmk-latest.unoptimized.zip) forms. These follow the
|
||||
`master` branch here on GitHub.
|
||||
-->
|
||||
**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 need support with KMK or just want to say hi, find us in
|
||||
> [#kmkfw:klar.sh on Matrix](https://matrix.to/#/#kmkfw:klar.sh). This channel
|
||||
> is bridged to Discord
|
||||
> [here](https://discordapp.com/widget?id=493256121075761173&theme=dark) for
|
||||
> [here](https://discord.gg/QBHUUpeGUd) for
|
||||
> convenience.
|
||||
|
||||
## Features
|
||||
@@ -42,7 +35,7 @@ file](https://cdn.kmkfw.io/kmk-latest.unoptimized.zip) forms. These follow the
|
||||
- [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
|
||||
- [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
|
||||
@@ -52,16 +45,17 @@ file](https://cdn.kmkfw.io/kmk-latest.unoptimized.zip) forms. These follow the
|
||||
- Bluetooth HID and split keyboards. No more wires.
|
||||
|
||||
## Getting Started
|
||||
|
||||
KMK requires [CircuitPython](https://circuitpython.org/) version 7.0 or higher.
|
||||
Our getting started guide can be found
|
||||
[here](https://github.com/KMKfw/kmk_firmware/blob/master/docs/Getting_Started.md)
|
||||
[here](https://github.com/KMKfw/kmk_firmware/blob/master/docs/Getting_Started.md).
|
||||
|
||||
## The KMK Team
|
||||
|
||||
KMK is primarily written and maintained by @klardotsh and @kdb424, but
|
||||
contributions are welcome from all, whether it's in the form of code,
|
||||
documentation, hardware designs, feature ideas, or anything else that comes to
|
||||
mind. A list of KMK's contributors can be found [on
|
||||
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).
|
||||
|
||||
> While Adafruit employees and affiliates are occasionally found in the commit
|
||||
@@ -80,11 +74,24 @@ 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`).
|
||||
|
||||
## Tests
|
||||
|
||||
Unit tests within the `tests` folder mock various CircuitPython modules to allow
|
||||
them to be executed in a desktop development environment.
|
||||
|
||||
Execute tests using the command `python -m unittest`.
|
||||
|
||||
## License, Copyright, and Legal
|
||||
|
||||
All software in this repository is licensed under the [GNU Public License,
|
||||
verison 3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)).
|
||||
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.
|
||||
|
||||
**Due to ethical and legal concerns, any works derived from GitHub Copilot or
|
||||
similar artificial intelligence tooling are unacceptable for inclusion in any
|
||||
first-party KMK repository or other code collection. We further recommend not
|
||||
using GitHub Copilot while developing anything KMK-related, regardless of
|
||||
intent to submit upstream.**
|
||||
|
42
boards/Pico87/kb.py
Normal file
42
boards/Pico87/kb.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP0,
|
||||
board.GP1,
|
||||
board.GP2,
|
||||
board.GP3,
|
||||
board.GP4,
|
||||
board.GP5,
|
||||
board.GP6,
|
||||
board.GP7,
|
||||
board.GP8,
|
||||
board.GP9,
|
||||
board.GP10,
|
||||
board.GP11,
|
||||
board.GP12,
|
||||
board.GP13,
|
||||
board.GP14,
|
||||
board.GP15,
|
||||
board.GP16,
|
||||
board.GP17,
|
||||
)
|
||||
|
||||
row_pins = (
|
||||
board.GP18,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
board.GP26,
|
||||
)
|
||||
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
leds = LED(led_pin=[board.GP27, board.GP28])
|
||||
_KMKKeyboard.extensions.append(leds)
|
60
boards/Pico87/main.py
Normal file
60
boards/Pico87/main.py
Normal file
@@ -0,0 +1,60 @@
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.lock_status import LockStatus
|
||||
from kmk.extensions.stringy_keymaps import StringyKeymaps
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
Pico87 = KMKKeyboard()
|
||||
|
||||
|
||||
class LEDLockStatus(LockStatus):
|
||||
def set_lock_leds(self):
|
||||
if self.get_caps_lock():
|
||||
Pico87.leds.set_brightness(50, leds=[0])
|
||||
else:
|
||||
Pico87.leds.set_brightness(0, leds=[0])
|
||||
|
||||
if self.get_scroll_lock():
|
||||
Pico87.leds.set_brightness(50, leds=[1])
|
||||
else:
|
||||
Pico87.leds.set_brightness(0, leds=[1])
|
||||
|
||||
def after_hid_send(self, sandbox):
|
||||
super().after_hid_send(sandbox) # Critically important. Removing this will break lock status.
|
||||
|
||||
if self.report_updated:
|
||||
self.set_lock_leds()
|
||||
|
||||
|
||||
Pico87.modules.append(Layers())
|
||||
Pico87.extensions.append(LEDLockStatus())
|
||||
Pico87.extensions.append(StringyKeymaps())
|
||||
|
||||
MOLYR = KC.MO(1)
|
||||
|
||||
# Make this for better looking formatting...
|
||||
______ = 'NO'
|
||||
|
||||
Pico87.keymap = [[
|
||||
# Layer 0 QWERTY
|
||||
'ESC', ______, 'F1', 'F2', 'F3', 'F4', ______, 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'PSCR', 'SLCK', 'PAUS',
|
||||
'GRV', 'N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9', 'N0', 'MINS', 'EQL', ______, 'BSPC', 'INS', 'HOME', 'PGUP',
|
||||
'TAB', ______, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'LBRC', 'RBRC', 'BSLS', 'DEL', 'END', 'PGDN',
|
||||
'CAPS', ______, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'SCLN', 'QUOT', 'ENT', ______, ______, ______, ______,
|
||||
______, 'LSFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'COMM', 'DOT', 'SLSH', ______, 'RSFT', ______, ______, 'UP', ______,
|
||||
'LCTL', 'LGUI', ______, 'LALT', ______, ______, 'SPC', ______, ______, ______, 'RALT', 'RGUI', ______, MOLYR, 'RCTL', 'LEFT', 'DOWN', 'RGHT',
|
||||
], [
|
||||
# Layer 1
|
||||
'ESC', ______, 'F1', 'F2', 'F3', 'F4', ______, 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'PSCR', 'SLCK', 'PAUS',
|
||||
'GRV', 'N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9', 'N0', 'MINS', 'EQL', ______, 'BSPC', 'INS', 'HOME', 'PGUP',
|
||||
'TAB', ______, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'LBRC', 'RBRC', 'BSLS', 'DEL', 'END', 'PGDN',
|
||||
'CAPS', ______, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'SCLN', 'QUOT', 'ENT', ______, ______, ______, ______,
|
||||
______, 'LSFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'COMM', 'DOT', 'SLSH', ______, 'RSFT', ______, ______, 'UP', ______,
|
||||
'LCTL', 'LGUI', ______, 'LALT', ______, ______, 'SPC', ______, ______, ______, 'RALT', 'RGUI', ______, MOLYR, 'RCTL', 'LEFT', 'DOWN', 'RGHT',
|
||||
]]
|
||||
|
||||
if __name__ == '__main__':
|
||||
Pico87.go()
|
105
boards/ZFR_KBD/RP2.65-F/kb.py
Normal file
105
boards/ZFR_KBD/RP2.65-F/kb.py
Normal file
@@ -0,0 +1,105 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.COL0,
|
||||
board.COL1,
|
||||
board.COL2,
|
||||
board.COL3,
|
||||
board.COL4,
|
||||
board.COL5,
|
||||
board.COL6,
|
||||
board.COL7,
|
||||
)
|
||||
row_pins = (
|
||||
board.ROW0,
|
||||
board.ROW1,
|
||||
board.ROW2,
|
||||
board.ROW3,
|
||||
board.ROW4,
|
||||
board.ROW5,
|
||||
board.ROW6,
|
||||
board.ROW7,
|
||||
board.ROW8,
|
||||
board.ROW9,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.LED
|
||||
rgb_num_pixels = 70
|
||||
|
||||
coord_mapping = [
|
||||
0,
|
||||
8,
|
||||
1,
|
||||
9,
|
||||
2,
|
||||
10,
|
||||
3,
|
||||
11,
|
||||
4,
|
||||
12,
|
||||
5,
|
||||
13,
|
||||
6,
|
||||
14,
|
||||
7,
|
||||
15,
|
||||
24,
|
||||
17,
|
||||
25,
|
||||
18,
|
||||
26,
|
||||
19,
|
||||
27,
|
||||
20,
|
||||
28,
|
||||
21,
|
||||
29,
|
||||
22,
|
||||
23,
|
||||
31,
|
||||
40,
|
||||
33,
|
||||
41,
|
||||
34,
|
||||
42,
|
||||
35,
|
||||
43,
|
||||
36,
|
||||
44,
|
||||
37,
|
||||
45,
|
||||
38,
|
||||
46,
|
||||
39,
|
||||
47,
|
||||
56,
|
||||
49,
|
||||
57,
|
||||
50,
|
||||
58,
|
||||
51,
|
||||
59,
|
||||
52,
|
||||
60,
|
||||
53,
|
||||
61,
|
||||
54,
|
||||
55,
|
||||
63,
|
||||
72,
|
||||
65,
|
||||
73,
|
||||
74,
|
||||
75,
|
||||
76,
|
||||
69,
|
||||
77,
|
||||
78,
|
||||
71,
|
||||
79,
|
||||
]
|
10
boards/anavi/knob1/README.md
Normal file
10
boards/anavi/knob1/README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# ANAVI Knob 1
|
||||
|
||||
ANAVI Knob 1 is an open source, programmable mechanical keyboard with a single rotary encoder and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Knob 1 is open source hardware designed with KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/AnaviTechnology/anavi-knob-1) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/encoder.md) Twist control for all the things
|
||||
- [RGB](/docs/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
0
boards/anavi/knob1/__init__.py
Normal file
0
boards/anavi/knob1/__init__.py
Normal file
36
boards/anavi/knob1/code.py
Normal file
36
boards/anavi/knob1/code.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
knob = KMKKeyboard()
|
||||
knob.matrix = KeysScanner([])
|
||||
|
||||
media_keys = MediaKeys()
|
||||
knob.extensions.append(media_keys)
|
||||
|
||||
# Rotary encoder that also acts as a key
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = ((board.D1, board.D2, board.D0),)
|
||||
encoder_handler.map = (((KC.VOLD, KC.VOLU, KC.MUTE),),)
|
||||
knob.modules.append(encoder_handler)
|
||||
|
||||
print('ANAVI Knob 1')
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
knob.extensions.append(rgb_ext)
|
||||
|
||||
knob.keymap = [[KC.MUTE]]
|
||||
|
||||
if __name__ == '__main__':
|
||||
knob.go()
|
10
boards/anavi/knobs3/README.md
Normal file
10
boards/anavi/knobs3/README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# ANAVI Knobs 3
|
||||
|
||||
ANAVI Knobs 3 is an open source, programmable mechanical keyboard with 3 rotary encoders and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Knobs 3 is open source hardware designed with KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/AnaviTechnology/anavi-knobs-3) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/encoder.md) Twist control for all the things
|
||||
- [RGB](/docs/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
0
boards/anavi/knobs3/__init__.py
Normal file
0
boards/anavi/knobs3/__init__.py
Normal file
42
boards/anavi/knobs3/code.py
Normal file
42
boards/anavi/knobs3/code.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
knob = KMKKeyboard()
|
||||
knob.matrix = KeysScanner([])
|
||||
|
||||
media_keys = MediaKeys()
|
||||
knob.extensions.append(media_keys)
|
||||
|
||||
# Rotary encoders that also acts as keys
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = (
|
||||
(board.D1, board.D2, board.D0),
|
||||
(board.D9, board.D10, board.D3),
|
||||
(board.D7, board.D8, board.D6),
|
||||
)
|
||||
encoder_handler.map = (
|
||||
((KC.VOLD, KC.VOLU, KC.MUTE), (KC.UP, KC.DOWN, KC.A), (KC.RIGHT, KC.LEFT, KC.B)),
|
||||
)
|
||||
knob.modules.append(encoder_handler)
|
||||
|
||||
print('ANAVI Knobs 3')
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
knob.extensions.append(rgb_ext)
|
||||
|
||||
knob.keymap = [[KC.MUTE]]
|
||||
|
||||
if __name__ == '__main__':
|
||||
knob.go()
|
11
boards/anavi/macro-pad-10/README.md
Normal file
11
boards/anavi/macro-pad-10/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# ANAVI Macro Pad 10
|
||||
|
||||
ANAVI Macro Pad 10 is an open source, programmable mechanical keyboard with 9 hot-swappable mechanical switches, RGB WS2812B underlighting and yellow backlit a rotary encoder and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Macro Pad 10 has been designed with the cross platform and open source electronics design automation suite KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/anavitechnology/anavi-macro-pad-10) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/encoder.md) Twist control for all the things
|
||||
- [LED](/docs/led.md) Light your keys up (for backlit)
|
||||
- [RGB](/docs/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
86
boards/anavi/macro-pad-10/code.py
Normal file
86
boards/anavi/macro-pad-10/code.py
Normal file
@@ -0,0 +1,86 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
print('ANAVI Macro Pad 10')
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
led_ext = LED(
|
||||
led_pin=[
|
||||
board.D0,
|
||||
],
|
||||
brightness=100,
|
||||
brightness_step=5,
|
||||
brightness_limit=100,
|
||||
breathe_center=1.5,
|
||||
animation_mode=AnimationModes.STATIC,
|
||||
animation_speed=1,
|
||||
user_animation=None,
|
||||
val=100,
|
||||
)
|
||||
keyboard.extensions.append(led_ext)
|
||||
|
||||
# WS2812B LED strips on the back
|
||||
underglow = RGB(
|
||||
pixel_pin=board.D10,
|
||||
num_pixels=4,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(underglow)
|
||||
|
||||
# Neopixel on XIAO RP2040
|
||||
frontglow = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(frontglow)
|
||||
|
||||
keyboard.col_pins = (
|
||||
board.D4,
|
||||
board.D5,
|
||||
board.D6,
|
||||
)
|
||||
keyboard.row_pins = (
|
||||
board.D3,
|
||||
board.D2,
|
||||
board.D1,
|
||||
)
|
||||
keyboard.diode_orientation = DiodeOrientation.COL2ROW
|
||||
|
||||
media_keys = MediaKeys()
|
||||
keyboard.extensions.append(media_keys)
|
||||
|
||||
# Matrix 3x3 keymap, 9 keys in total
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.N1,
|
||||
KC.N2,
|
||||
KC.N3,
|
||||
KC.N4,
|
||||
KC.N5,
|
||||
KC.N6,
|
||||
KC.N7,
|
||||
KC.N8,
|
||||
KC.N9,
|
||||
]
|
||||
]
|
||||
|
||||
# Rotary encoder that also acts as a key
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = ((board.D8, board.D7, board.D9),)
|
||||
encoder_handler.map = (((KC.VOLD, KC.VOLU, KC.MUTE),),)
|
||||
keyboard.modules.append(encoder_handler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
@@ -10,7 +10,7 @@ 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
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [Encoder](/docs/encoder.md) Twist control for all the things
|
||||
|
||||
|
@@ -1,9 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
|
||||
# from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -20,28 +20,13 @@ Zoom_out = KC.LCTRL(KC.MINUS)
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
# for use in the encoder extension
|
||||
encoder_map = [
|
||||
[
|
||||
(
|
||||
KC.VOLU,
|
||||
KC.VOLD,
|
||||
2,
|
||||
), # Only 1 encoder is being used, so only one tuple per layer is required
|
||||
],
|
||||
[
|
||||
(Zoom_in, Zoom_out, 1),
|
||||
],
|
||||
[
|
||||
(_______, _______, 1), # no action taken by the encoder on this layer
|
||||
],
|
||||
]
|
||||
|
||||
layers_ext = Layers()
|
||||
|
||||
encoder_ext = EncoderHandler([board.D40], [board.D41], encoder_map)
|
||||
encoder_ext.encoders[0].is_inverted = True
|
||||
|
||||
# 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
|
||||
@@ -216,5 +201,23 @@ keyboard.keymap = [
|
||||
],
|
||||
]
|
||||
|
||||
|
||||
# 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()
|
||||
|
@@ -10,4 +10,4 @@ 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.
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
|
@@ -14,8 +14,8 @@ 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
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/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
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
@@ -14,8 +14,8 @@ 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
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/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
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
21
boards/boardsource/Lulu/README.md
Normal file
21
boards/boardsource/Lulu/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Lulu
|
||||
|
||||

|
||||
|
||||
Based on the form factor of the Lily58, but with new features. The Lulu is a 58 key split keyboard design by Boardsource, featuring a 6x4 columnar stagger and 4 thumb cluster keys on each hand. The Lulu 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, and a premium case avaliable.
|
||||
|
||||
Hardware Availability: [PCB & Case Source](https://boardsource.xyz/store/5ec9df84c6b834480de6c3d0)
|
||||
kb.py is designed to work with the PCBA version directly from them.
|
||||
|
||||
Retailers (USA)
|
||||
[Boardsource](https://boardsource.xyz/store/5ec9df84c6b834480de6c3d0)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Split](/docs/split.md) Connects halves using a wire.
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [PEG_RGB](/docs/peg_rgb_matrix.md) Light it up!
|
||||
- [PEG_OLED](/docs/peg_oled_display.md) Screens to see things on of course.
|
||||
|
||||
Common Extensions
|
||||
- [Power](/docs/power.md) Powersaving features for battery life.
|
||||
- [BLE_Split](/docs/split.md) Connects halves without wires (For the DIY version)
|
73
boards/boardsource/Lulu/kb.py
Normal file
73
boards/boardsource/Lulu/kb.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners.encoder import RotaryioEncoder
|
||||
from kmk.scanners.keypad import MatrixScanner
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
def __init__(self):
|
||||
# create and register the scanner
|
||||
self.matrix = [
|
||||
MatrixScanner(
|
||||
# required arguments:
|
||||
column_pins = self.col_pins,
|
||||
row_pins = self.row_pins,
|
||||
# optional arguments with defaults:
|
||||
columns_to_anodes=DiodeOrientation.COL2ROW,
|
||||
interval=0.02,
|
||||
max_events=64
|
||||
),
|
||||
RotaryioEncoder(
|
||||
pin_a=board.GP08,
|
||||
pin_b=board.GP09,
|
||||
# optional
|
||||
divisor=4,
|
||||
)
|
||||
]
|
||||
col_pins = (
|
||||
board.GP02,
|
||||
board.GP03,
|
||||
board.GP04,
|
||||
board.GP05,
|
||||
board.GP06,
|
||||
board.GP07,
|
||||
)
|
||||
row_pins = (board.GP14, board.GP15, board.GP16, board.GP17, board.GP18)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rx = board.RX
|
||||
tx = board.TX
|
||||
rgb_pixel_pin = board.GP29
|
||||
i2c = board.I2C
|
||||
data_pin = board.RX
|
||||
rgb_pixel_pin = board.GP29
|
||||
i2c = board.I2C
|
||||
SCL=board.SCL
|
||||
SDA=board.SDA
|
||||
encoder_a=board.GP08
|
||||
encoder_b=board.GP09
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
led_key_pos =[11,10,9 ,8 ,7 ,6 , 41,42,43,44,45,46,
|
||||
12,13,14,15,16,17, 52,51,50,49,48,47,
|
||||
23,22,21,20,19,18, 53,54,55,56,57,58,
|
||||
24,25,26,27,28,29,30,65,64,63,62,61,60,59,
|
||||
34,33,32,31,66,67,68,69,
|
||||
3 ,4 ,5 , 40,39,38,
|
||||
2 ,1 ,0 , 35,36,37
|
||||
]
|
||||
brightness_limit = 0.5
|
||||
num_pixels = 70
|
||||
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 37, 36, 35, 34, 33, 32,
|
||||
6, 7, 8, 9, 10, 11, 43, 42, 41, 40, 39, 38,
|
||||
12, 13, 14, 15, 16, 17, 49, 48, 47, 46, 45, 44,
|
||||
18, 19, 20, 21, 22, 23, 29, 61, 55, 54, 53, 52, 51, 50,
|
||||
25,26, 27, 28, 60, 59, 58, 57,
|
||||
30,31, 62,63
|
||||
]
|
||||
|
230
boards/boardsource/Lulu/main.py
Normal file
230
boards/boardsource/Lulu/main.py
Normal file
@@ -0,0 +1,230 @@
|
||||
import supervisor
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.peg_oled_Display import (
|
||||
Oled,
|
||||
OledData,
|
||||
OledDisplayMode,
|
||||
OledReactionType,
|
||||
)
|
||||
from kmk.extensions.peg_rgb_matrix import Rgb_matrix
|
||||
from kmk.handlers.sequences import send_string
|
||||
from kmk.hid import HIDModes
|
||||
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
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
modtap = ModTap()
|
||||
layers_ext = Layers()
|
||||
keyboard.modules.append(layers_ext)
|
||||
keyboard.modules.append(modtap)
|
||||
|
||||
oled_ext = Oled(
|
||||
OledData(
|
||||
corner_one={0: OledReactionType.STATIC, 1: ['qwertyzzzz']},
|
||||
corner_two={
|
||||
0: OledReactionType.LAYER,
|
||||
1: ['1', '2', '3', '4', '5', '6', '7', '8'],
|
||||
},
|
||||
corner_three={
|
||||
0: OledReactionType.LAYER,
|
||||
1: ['base', 'raise', 'lower', 'adjust', '5', '6', '7', '8'],
|
||||
},
|
||||
corner_four={
|
||||
0: OledReactionType.LAYER,
|
||||
1: ['qwertyzzz', 'nums', 'shifted', 'leds', '5', '6', '7', '8'],
|
||||
},
|
||||
),
|
||||
toDisplay=OledDisplayMode.TXT,
|
||||
flip=False,
|
||||
)
|
||||
keyboard.extensions.append(oled_ext)
|
||||
|
||||
# Default RGB matrix colours
|
||||
rgb_ext = Rgb_matrix(
|
||||
ledDisplay=[
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
],
|
||||
split=True,
|
||||
rightSide=False,
|
||||
disable_auto_write=True,
|
||||
)
|
||||
keyboard.extensions.append(rgb_ext)
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
# split_side = SplitSide.RIGHT
|
||||
split = Split(data_pin=keyboard.rx, data_pin2=keyboard.tx, uart_flip=False)
|
||||
keyboard.modules.append(split)
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
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.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.LBRC, KC.RBRC, KC.N, KC.M, KC.COMMA, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.LGUI, KC.MO(1), KC.LCTL, KC.SPC, KC.ENT, KC.MO(2), KC.BSPC, KC.RGUI,
|
||||
# Encoders
|
||||
KC.AUDIO_VOL_UP,
|
||||
KC.AUDIO_VOL_DOWN,
|
||||
KC.MEDIA_PREV_TRACK,
|
||||
KC.MEDIA_NEXT_TRACK,
|
||||
],
|
||||
[
|
||||
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.TRNS, KC.TRNS, KC.UP, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.EQL, KC.TRNS,
|
||||
KC.TRNS, KC.LEFT, KC.DOWN, KC.RGHT, 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.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.DEL, KC.TRNS,
|
||||
# Encoders
|
||||
KC.AUDIO_VOL_UP,
|
||||
KC.AUDIO_VOL_DOWN,
|
||||
KC.MEDIA_PREV_TRACK,
|
||||
KC.MEDIA_NEXT_TRACK,
|
||||
],
|
||||
[
|
||||
KC.N2, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.TILD,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PLUS, KC.UNDS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.COLN, KC.DQT,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.LCBR, KC.RCBR, KC.TRNS, KC.TRNS, KC.LABK, KC.RABK, KC.QUES, KC.TRNS,
|
||||
KC.LGUI, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.AUDIO_VOL_UP,
|
||||
KC.AUDIO_VOL_DOWN,
|
||||
KC.MEDIA_PREV_TRACK,
|
||||
KC.MEDIA_NEXT_TRACK,
|
||||
],
|
||||
[
|
||||
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.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.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
# Encoders
|
||||
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.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.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,
|
||||
# Encoders
|
||||
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.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.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,
|
||||
# Encoders
|
||||
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.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.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,
|
||||
# Encoders
|
||||
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.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.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,
|
||||
# Encoders
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
],
|
||||
]
|
||||
if __name__ == '__main__':
|
||||
keyboard.go(hid_type=HIDModes.USB)
|
@@ -10,10 +10,10 @@ Retailers (USA)
|
||||
[Boardsource](https://boardsource.xyz/store/5f2e7e4a2902de7151494f92)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
|
||||
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [BLE_Split](/docs/split_keyboards.md) Connects halves without wires
|
||||
- [ModTap](/docs/modtap.md) Allows mod keys to act as different keys when tapped.
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
- [Split](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -15,10 +14,11 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
i2c = board.I2C
|
||||
powersave_pin = board.P0_13
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(10))
|
||||
coord_mapping.extend(ic(1, x) for x in range(10))
|
||||
coord_mapping.extend(ic(2, x) for x in range(10))
|
||||
|
||||
# And now, to handle R3, which at this point is down to just six keys
|
||||
coord_mapping.extend(ic(3, x) for x in range(3, 9))
|
||||
# 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,
|
||||
]
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
@@ -18,10 +18,10 @@ Corne LP
|
||||
[Boardsource](https://boardsource.xyz/store/5f2efc462902de7151495057)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/split_keyboards.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
|
||||
- [Split](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -21,10 +20,11 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
i2c = board.I2C
|
||||
powersave_pin = board.P0_13
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x) for x in range(12))
|
||||
# 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,
|
||||
]
|
||||
|
||||
# And now, to handle R3, which at this point is down to just six keys
|
||||
coord_mapping.extend(ic(3, x) for x in range(3, 9))
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -20,10 +19,10 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
rgb_pixel_pin = board.D0
|
||||
i2c = board.I2C
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x) for x in range(12))
|
||||
|
||||
# And now, to handle R3, which at this point is down to just six keys
|
||||
coord_mapping.extend(ic(3, x) for x in range(3, 9))
|
||||
# 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,
|
||||
]
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
8
boards/crowboard/README.md
Normal file
8
boards/crowboard/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Crowboard
|
||||

|
||||
Single Board 34/36 Key Keyboard Based on Raspberry pi Pico
|
||||
|
||||
[Link to the Github repo](https://github.com/doesntfazer/CrowBoard)
|
||||
|
||||
|
||||
You can Buy this keyboard at KeyboardDweebs.net
|
26
boards/crowboard/kb.py
Normal file
26
boards/crowboard/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.GP6,
|
||||
board.GP7,
|
||||
board.GP8,
|
||||
board.GP9,
|
||||
board.GP10,
|
||||
board.GP18,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
)
|
||||
row_pins = (
|
||||
board.GP14,
|
||||
board.GP15,
|
||||
board.GP16,
|
||||
board.GP17,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
92
boards/crowboard/main.py
Normal file
92
boards/crowboard/main.py
Normal file
@@ -0,0 +1,92 @@
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.modtap import ModTap
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
keyboard.modules.append(Layers())
|
||||
|
||||
modtap = ModTap()
|
||||
keyboard.modules.append(modtap)
|
||||
|
||||
|
||||
NONE = KC.NO
|
||||
QWERTY = KC.MO(0)
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
ADJUST = KC.MO(3)
|
||||
CAE = KC.LCTL(KC.LALT(KC.END))
|
||||
CAD = KC.LCTL(KC.LALT(KC.DEL))
|
||||
|
||||
|
||||
|
||||
ZSFT = KC.MT(KC.Z, KC.LSFT, prefer_hold=True, tap_interrupted=False, tap_time=3000)
|
||||
SLSHSFT = KC.MT(KC.SLSH, KC.LSFT, prefer_hold=True, tap_interrupted=False, tap_time=3000)
|
||||
ALCTL = KC.MT(KC.A, KC.LCTRL, prefer_hold=False, tap_interrupted=False, tap_time=150)
|
||||
|
||||
# flake8: noqa: E261
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,
|
||||
ALCTL, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.QUOT,
|
||||
ZSFT, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, SLSHSFT,
|
||||
NONE, NONE, KC.LCTL, LOWER, KC.SPACE, KC.BSPC, RAISE, KC.RALT, NONE, NONE,
|
||||
|
||||
],
|
||||
[ # LOWER
|
||||
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.RIGHT, KC.TRNS, KC.MINUS, KC.EQUAL, KC.LBRC, KC.RBRC,
|
||||
KC.LCTL, KC.GRAVE, KC.LGUI, KC.LALT, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.BSLS, KC.SCLN,
|
||||
KC.NO, KC.NO, KC.TRNS, KC.TRNS, KC.TRNS, KC.ENTER, ADJUST, KC.TRNS, KC.NO, KC.NO,
|
||||
|
||||
],
|
||||
[ # RAISE
|
||||
KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN,
|
||||
KC.ESC, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR,
|
||||
KC.CAPS, KC.TILDE, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PIPE, KC.COLN,
|
||||
KC.NO, KC.NO, KC.TRNS, ADJUST, KC.TRNS, KC.ENTER, KC.TRNS, KC.DEL, KC.NO, KC.NO,
|
||||
|
||||
],
|
||||
[ # ADJUST
|
||||
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.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, CAE, CAD, CAD,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.NO, KC.NO, KC.TRNS, KC.TRNS, KC.TRNS, KC.ENTER, KC.TRNS, KC.TRNS, KC.NO, KC.NO,
|
||||
|
||||
]
|
||||
]
|
||||
|
||||
# Uncomment for Trackball
|
||||
# from kmk.modules.pimoroni_trackball import Trackball, TrackballMode
|
||||
# import busio as io
|
||||
|
||||
# i2c1 = io.I2C(scl=board.GP3, sda=board.GP2)
|
||||
# trackball = Trackball(i2c1, mode=TrackballMode.MOUSE_MODE)
|
||||
# keyboard.modules.append(trackball)
|
||||
# trackball.set_rgbw(255, 255, 255, 30)
|
||||
# trackball.set_red(20)
|
||||
# trackball.set_green(100)
|
||||
# trackball.set_blue(100)
|
||||
# trackball.set_white(40)
|
||||
|
||||
# uncomment for Encoders
|
||||
# from kmk.modules.encoder import EncoderHandler
|
||||
# encoder_handler = EncoderHandler()
|
||||
# keyboard.modules = [encoder_handler]
|
||||
# encoder_handler.pins = ((board.GP12, board.GP13, None, False), (board.GP27, board.GP26, None, False),)
|
||||
|
||||
# encoder_handler.map = [(( KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 1
|
||||
# ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 2
|
||||
# ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 3
|
||||
# ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 4
|
||||
# ]
|
||||
|
||||
# keyboard.debug_enabled = True
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
@@ -9,13 +9,16 @@ 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)
|
||||
[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.md) Connects halves without wires
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [BLE_Split](/docs/split_keyboards.md) Connects halves without wires
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
- [Split](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -24,10 +23,11 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
i2c = board.I2C
|
||||
powersave_pin = board.P0_13
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(14))
|
||||
coord_mapping.extend(ic(1, x) for x in range(14))
|
||||
coord_mapping.extend(ic(2, x) for x in range(14))
|
||||
|
||||
# And now, to handle R3, which at this point is down to just six keys
|
||||
coord_mapping.extend(ic(3, x) for x in range(3, 12))
|
||||
# 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,
|
||||
]
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
13
boards/fingerpunch/ffkb/README.md
Normal file
13
boards/fingerpunch/ffkb/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Faux Fox Keyboard (ffkb)
|
||||
|
||||

|
||||
|
||||
A 36 or 42 key keyboard with support for per key LEDs, 2 rotary encoders (EC11 or evqwgd001), and a feature in the center (EC11, OLED (128x64), or pimoroni trackball). KMK support is available for the BYO MCU option only.
|
||||
|
||||
Use `kb2040/kb.py` when using a KB2040 MCU.
|
||||
|
||||
Use `nice_nano/kb.py` when using a Nice!Nano v2 MCU.
|
||||
|
||||
> Note: The Nice!Nano doesn't have a lot of ROM, so there are a couple of extra steps. See guidance [over here](../../docs/Officially_Supported_Microcontrollers.md#nicenano).
|
||||
|
||||
An example `main.py` file is included for each MCU.
|
38
boards/fingerpunch/ffkb/kb2040/kb.py
Normal file
38
boards/fingerpunch/ffkb/kb2040/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.D9,
|
||||
board.D8,
|
||||
board.D7,
|
||||
board.D6,
|
||||
board.D5,
|
||||
board.D4,
|
||||
board.MOSI,
|
||||
board.MISO,
|
||||
)
|
||||
row_pins = (
|
||||
board.D1,
|
||||
board.A3,
|
||||
board.A2,
|
||||
board.A1,
|
||||
board.A0,
|
||||
board.SCK,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rgb_pixel_pin = board.D0
|
||||
rgb_num_pixels = 42
|
||||
i2c = board.I2C
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
ic(0, 0), ic(0, 1), ic(0, 2), ic(0, 3), ic(0, 4), ic(0, 5), ic(0, 6), ic(0, 7), ic(4, 3), ic(3, 4), ic(4, 5), ic(3, 7),
|
||||
ic(1, 0), ic(1, 1), ic(1, 2), ic(1, 3), ic(1, 4), ic(1, 5), ic(4, 1), ic(1, 6), ic(1, 7), ic(3, 2), ic(4, 4), ic(3, 5), ic(4, 7),
|
||||
ic(2, 0), ic(2, 1), ic(2, 2), ic(2, 3), ic(2, 4), ic(2, 5), ic(2, 6), ic(2, 7), ic(4, 2), ic(3, 3), ic(3, 6), ic(4, 6),
|
||||
ic(5, 1), ic(5, 3), ic(5, 4), ic(5, 5), ic(5, 6), ic(5, 7), ic(5, 2), ic(5, 0)
|
||||
]
|
140
boards/fingerpunch/ffkb/kb2040/main.py
Normal file
140
boards/fingerpunch/ffkb/kb2040/main.py
Normal file
@@ -0,0 +1,140 @@
|
||||
import board
|
||||
|
||||
from kb_kb2040 import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.rgb import RGB
|
||||
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.mouse_keys import MouseKeys
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.tap_time = 150
|
||||
keyboard.debug_enabled = False
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
# Adding extensions
|
||||
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels, val_limit=50, hue_default=190, sat_default=100, val_default=5)
|
||||
|
||||
modtap = ModTap()
|
||||
layers = Layers()
|
||||
media_keys = MediaKeys()
|
||||
|
||||
encoder_handler = EncoderHandler()
|
||||
|
||||
keyboard.modules = [layers, modtap] #, encoder_handler]
|
||||
keyboard.modules.append(MouseKeys())
|
||||
keyboard.extensions = [rgb, media_keys]
|
||||
|
||||
|
||||
encoder_handler.pins = ((board.D3, board.D2, board.D10, False))
|
||||
|
||||
ZOOM_IN = KC.LCTRL(KC.EQUAL)
|
||||
ZOOM_OUT = KC.LCTRL(KC.MINUS)
|
||||
|
||||
LYR_BASE, LYR_NAV, LYR_SYM, LYR_SNAV, LYR_MEDIA, LYR_MOUSE = 0, 1, 2, 3, 4, 5
|
||||
|
||||
NAV_ENT = KC.LT(LYR_NAV, KC.ENT)
|
||||
SYM_SPC = KC.LT(LYR_SYM, KC.SPC)
|
||||
SNAV_TAB = KC.LT(LYR_SNAV, KC.TAB)
|
||||
MEDIA_BSPC = KC.LT(LYR_MEDIA, KC.BSPC)
|
||||
MOUSE_M = KC.LT(LYR_MOUSE, KC.M)
|
||||
|
||||
# HOMEROW MODS
|
||||
LCTL_A = KC.MT(KC.A, KC.LCTRL)
|
||||
LGUI_R = KC.MT(KC.R, KC.LGUI)
|
||||
LALT_S = KC.MT(KC.S, KC.LALT)
|
||||
LSFT_T = KC.MT(KC.T, KC.LSFT)
|
||||
RSFT_N = KC.MT(KC.N, KC.RSFT)
|
||||
RALT_E = KC.MT(KC.E, KC.RALT)
|
||||
RGUI_I = KC.MT(KC.I, KC.RGUI)
|
||||
RCTL_O = KC.MT(KC.O, KC.RCTRL)
|
||||
|
||||
# OTHER SHORTCUTS
|
||||
BRWSR_LFT = KC.LCTRL(KC.LSFT(KC.TAB))
|
||||
BRWSR_RGHT = KC.LCTRL(KC.TAB)
|
||||
DESK_LEFT = KC.LCTRL(KC.LGUI(KC.LEFT))
|
||||
DESK_RIGHT = KC.LCTRL(KC.LGUI(KC.RIGHT))
|
||||
CAPSWORD = _______ # TODO: IMPLEMENT THIS
|
||||
|
||||
# SHIFT NAV
|
||||
SFT_PGUP = KC.LSFT(KC.PGUP)
|
||||
SFT_PGDN = KC.LSFT(KC.PGDN)
|
||||
SFT_HOME = KC.LSFT(KC.HOME)
|
||||
SFT_END = KC.LSFT(KC.END)
|
||||
SFT_UP = KC.LSFT(KC.UP)
|
||||
SFT_DOWN = KC.LSFT(KC.DOWN)
|
||||
SFT_LEFT = KC.LSFT(KC.LEFT)
|
||||
SFT_RGHT = KC.LSFT(KC.RIGHT)
|
||||
|
||||
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
|
||||
RGB_ANI = KC.RGB_ANI
|
||||
RGB_AND = KC.RGB_AND
|
||||
RGB_M_P = KC.RGB_MODE_PLAIN
|
||||
RGB_M_B = KC.RGB_MODE_BREATHE
|
||||
RGB_M_R = KC.RGB_MODE_RAINBOW
|
||||
RGB_M_BR = KC.RGB_MODE_BREATHE_RAINBOW
|
||||
RGB_M_K = KC.RGB_MODE_KNIGHT
|
||||
RGB_M_S = KC.RGB_MODE_SWIRL
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #COLEMAK-DH
|
||||
KC.ESC, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
|
||||
KC.CAPS, LCTL_A, LGUI_R, LALT_S, LSFT_T, KC.G, KC.MUTE, MOUSE_M, RSFT_N, RALT_E, RGUI_I, RCTL_O, KC.QUOT,
|
||||
KC.SPC, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.MUTE, KC.DEL, NAV_ENT, SNAV_TAB, MEDIA_BSPC, SYM_SPC, KC.QUOT, KC.LCTRL(KC.BSPC)
|
||||
],
|
||||
[ #NAVIGATION
|
||||
_______, KC.ESC, KC.PGUP, KC.UP, KC.PGDN, _______, KC.ASTR, KC.N7, KC.N8, KC.N9, KC.PLUS, _______,
|
||||
_______, KC.HOME, KC.LEFT, KC.DOWN, KC.RIGHT, KC.END, _______, KC.SLSH, KC.N4, KC.N5, KC.N6, KC.MINS, _______,
|
||||
_______, _______, _______, _______, _______, _______, KC.EQL, KC.N1, KC.N2, KC.N3, KC.N0, _______,
|
||||
_______, _______, _______, _______, KC.BKSP, KC.SPC, KC.DOT, _______,
|
||||
],
|
||||
[ #SYMBOLS
|
||||
_______, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.UNDS, KC.EQL, _______,
|
||||
_______, KC.MINS, KC.LBRC, KC.LCBR, KC.LPRN, KC.LABK, _______, KC.RABK, KC.RPRN, KC.RCBR, KC.RBRC, KC.PLUS, _______,
|
||||
_______, KC.CAPS, KC.GRV, BRWSR_LFT, DESK_LEFT, CAPSWORD, _______, DESK_RIGHT, BRWSR_RGHT, _______, KC.BSLS, _______,
|
||||
_______, _______, KC.ENT, KC.TAB, _______, _______, _______, _______,
|
||||
],
|
||||
[ #SHIFT NAVIGATION
|
||||
_______, _______, SFT_PGUP, SFT_UP, SFT_PGDN, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, SFT_HOME, SFT_LEFT, SFT_DOWN, SFT_RGHT, SFT_END, _______, KC.VOLU, KC.MPLY, KC.MSTP, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, KC.MUTE, KC.VOLD, KC.MPRV, KC.MNXT, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
[ #MEDIA
|
||||
_______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_ANI, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_BR, RGB_M_K, _______,
|
||||
_______, _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_AND, RGB_M_S, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
[ #MOUSE
|
||||
_______, KC.RESET, KC.MW_UP, KC.MS_UP, KC.MW_DN, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, KC.MS_LT, KC.MS_DN, KC.MS_RT, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
]
|
||||
|
||||
encoder_handler.map = [
|
||||
((KC.VOLD, KC.VOLU, KC.MUTE)), # Layer 1
|
||||
((ZOOM_OUT, ZOOM_IN, _______)), # Layer 2
|
||||
((_______, _______, _______)), # Layer 3
|
||||
((_______, _______, _______)), # Layer 4
|
||||
((_______, _______, _______)), # Layer 5
|
||||
((_______, _______, _______)), # Layer 6
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
39
boards/fingerpunch/ffkb/nice_nano/kb.py
Normal file
39
boards/fingerpunch/ffkb/nice_nano/kb.py
Normal file
@@ -0,0 +1,39 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.P1_06,
|
||||
board.P1_04,
|
||||
board.P0_11,
|
||||
board.P1_00,
|
||||
board.P0_24,
|
||||
board.P0_22,
|
||||
board.MOSI,
|
||||
board.MISO,
|
||||
)
|
||||
row_pins = (
|
||||
board.P0_08,
|
||||
board.P0_31,
|
||||
board.P0_29,
|
||||
board.P0_02,
|
||||
board.P1_15,
|
||||
board.SCK,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rgb_pixel_pin = board.P0_06
|
||||
rgb_num_pixels = 42
|
||||
i2c = board.I2C
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 35, 28, 37, 31,
|
||||
8, 9, 10, 11, 12, 13, 33, 14, 15, 26, 36, 29, 39,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 34, 27, 30, 38,
|
||||
41, 43, 44, 45, 46, 47, 42, 40,
|
||||
]
|
||||
|
||||
encoder_pins = ((board.P0_20, board.P0_17, board.P0_09, False))
|
70
boards/fingerpunch/ffkb/nice_nano/main.py
Normal file
70
boards/fingerpunch/ffkb/nice_nano/main.py
Normal file
@@ -0,0 +1,70 @@
|
||||
import board
|
||||
|
||||
import kb
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.combos import Combos, Sequence
|
||||
from kmk.modules.dynamic_sequences import DynamicSequences
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.oneshot import OneShot
|
||||
|
||||
combos = Combos()
|
||||
dyn_seq = DynamicSequences(
|
||||
slots=1, # The number of sequence slots to use
|
||||
timeout=60000, # Maximum time to spend in record or config mode before stopping automatically, milliseconds
|
||||
key_interval=20, # Milliseconds between key events while playing
|
||||
use_recorded_speed=False, # Whether to play the sequence at the speed it was typed
|
||||
)
|
||||
layers = Layers()
|
||||
oneshot = OneShot()
|
||||
|
||||
keyboard = kb.KMKKeyboard()
|
||||
keyboard.modules = [combos, dyn_seq, layers, oneshot]
|
||||
keyboard.debug_enabled = False
|
||||
|
||||
# Convenience variables for the Keymap
|
||||
_______ = KC.TRNS
|
||||
xxxxxxx = KC.NO
|
||||
|
||||
L1_TAB = KC.LT(1, KC.TAB, prefer_hold=True)
|
||||
L2_ENT = KC.LT(2, KC.ENT, prefer_hold=True)
|
||||
|
||||
OS_LSFT = KC.OS(KC.LSFT)
|
||||
|
||||
SEQ_REC = KC.RECORD_SEQUENCE()
|
||||
SEQ_STP = KC.STOP_SEQUENCE()
|
||||
SEQ_PLY = KC.PLAY_SEQUENCE()
|
||||
|
||||
combos.combos = [
|
||||
Sequence((KC.LEADER, KC.A), KC.LCTL(KC.A)), # select All
|
||||
Sequence((KC.LEADER, KC.T), KC.LCTL(KC.X)), # cuT
|
||||
Sequence((KC.LEADER, KC.C), KC.LCTL(KC.C)), # Copy
|
||||
Sequence((KC.LEADER, KC.P), KC.LCTL(KC.V)), # Paste
|
||||
Sequence((KC.LEADER, KC.U), KC.LCTL(KC.Z)), # Undo
|
||||
Sequence((KC.LEADER, KC.Y), KC.LCTL(KC.Y)), # redo
|
||||
]
|
||||
|
||||
# flake8: noqa
|
||||
keyboard.keymap = [
|
||||
[ # 0: Colemak-DH letters
|
||||
KC.ESC, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.LEADER,
|
||||
KC.LCTL, KC.A, KC.R, KC.S, KC.T, KC.G, xxxxxxx, KC.M, KC.N, KC.E, KC.I, KC.O, KC.QUOT,
|
||||
KC.LALT, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.BSLS,
|
||||
xxxxxxx, KC.LGUI, OS_LSFT, KC.BSPC, L1_TAB, KC.SPACE,L2_ENT, xxxxxxx,
|
||||
],
|
||||
[ # 1: Nav & Numbers
|
||||
KC.TAB, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
_______, KC.LPRN, KC.LEFT, KC.UP, KC.RIGHT,KC.RPRN, _______, KC.GRV, KC.PLUS, KC.EQL, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
_______, KC.LBRC, KC.LCBR, KC.DOWN, KC.RCBR, KC.RBRC, KC.TILD, KC.MINS, KC.UNDS, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
_______, _______, _______, KC.DEL, _______, _______, _______, _______,
|
||||
],
|
||||
[ # 2: F-row & Board Functions
|
||||
KC.F12, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
|
||||
_______, SEQ_REC, SEQ_PLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, SEQ_STP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
@@ -9,9 +9,9 @@ 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
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [ModTap](/docs/modtap.md) Allows mod keys to act as different keys when tapped.
|
||||
- [LED](/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
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.led import LED
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
@@ -5,14 +5,14 @@
|
||||
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)
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/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
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) RGB underglow
|
||||
- [LED](/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
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.led import LED
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
|
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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [MediaKeys](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [MediaKeys](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [MediaKeys](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [MediaKeys](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [MediaKeys](/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
|
@@ -3,13 +3,13 @@
|
||||
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)
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/hardware)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/split_keyboards.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
|
||||
- [Split](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -23,23 +22,11 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
data_pin = board.P0_20
|
||||
powersave_pin = board.P0_13
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x) for x in range(12))
|
||||
|
||||
# Buckle up friends, the bottom row of this keyboard is wild, and making
|
||||
# our layouts match, visually, what the keyboard looks like, requires some
|
||||
# surgery on the bottom two rows of coords
|
||||
|
||||
# Row index 3 is actually perfectly sane and we _could_ expose it
|
||||
# just like the above three rows, however, visually speaking, the
|
||||
# top-right thumb cluster button (when looking at the left-half PCB)
|
||||
# is more inline with R3, so we'll jam that key (and its mirror) in here
|
||||
coord_mapping.extend(ic(3, x) for x in range(6))
|
||||
coord_mapping.append(ic(4, 2))
|
||||
coord_mapping.append(ic(4, 9))
|
||||
coord_mapping.extend(ic(3, x) for x in range(6, 12)) # Now, the rest of R3
|
||||
|
||||
# And now, to handle R4, which at this point is down to just six keys
|
||||
coord_mapping.extend(ic(4, x) for x in range(3, 9))
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 35, 34, 33, 32, 31, 30,
|
||||
6, 7, 8, 9, 10, 11, 41, 40, 39, 38, 37, 36,
|
||||
12, 13, 14, 15, 16, 17, 47, 46, 45, 44, 43, 42,
|
||||
18, 19, 20, 21, 22, 23, 26, 56, 53, 52, 51, 50, 49, 48,
|
||||
27, 28, 29, 59, 58, 57,
|
||||
]
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -14,7 +13,7 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
split_flip = True
|
||||
split_offsets = (6, 6, 6, 6, 6)
|
||||
split_offset = (6, 6, 6, 6, 6)
|
||||
split_type = 'UART'
|
||||
data_pin = board.SCL
|
||||
data_pin2 = board.SDA
|
||||
@@ -23,11 +22,6 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
rgb_pixel_pin = board.TX
|
||||
led_pin = board.D7
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x) for x in range(12))
|
||||
|
||||
# Buckle up friends, the bottom row of this keyboard is wild, and making
|
||||
# our layouts match, visually, what the keyboard looks like, requires some
|
||||
# surgery on the bottom two rows of coords
|
||||
@@ -36,10 +30,11 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
# just like the above three rows, however, visually speaking, the
|
||||
# top-right thumb cluster button (when looking at the left-half PCB)
|
||||
# is more inline with R3, so we'll jam that key (and its mirror) in here
|
||||
coord_mapping.extend(ic(3, x) for x in range(6))
|
||||
coord_mapping.append(ic(4, 2))
|
||||
coord_mapping.append(ic(4, 9))
|
||||
coord_mapping.extend(ic(3, x) for x in range(6, 12)) # Now, the rest of R3
|
||||
|
||||
# And now, to handle R4, which at this point is down to just six keys
|
||||
coord_mapping.extend(ic(4, x) for x in range(3, 9))
|
||||
# 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,
|
||||
]
|
||||
|
@@ -1,4 +1,5 @@
|
||||
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
|
||||
|
@@ -3,13 +3,13 @@
|
||||
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)
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/hardware)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/split_keyboards.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
|
||||
- [Split](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
@@ -3,14 +3,14 @@
|
||||
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)
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/hardware)
|
||||
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/split_keyboards.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
|
||||
- [Split](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
@@ -1,9 +1,9 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.modules.layers import Layers
|
||||
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
|
||||
@@ -37,10 +37,10 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x) for x in range(12))
|
||||
coord_mapping.extend(ic(3, r3_swap(x)) for x in range(12))
|
||||
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](/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Layers](/docs/layers.md) Do you need more keys than switches? Use
|
||||
layers.
|
||||
- [ModTap](/docs/modtap.md) Enable press/hold double binding of keys
|
||||
- [MediaKeys](/docs/media_keys.md) Common media controls
|
||||
|
||||
Also uncomment right section to enable samples of following:
|
||||
|
||||
- [RGB](/docs/rgb.md) Turn on the backlight (**requires neopixel.py
|
||||
library to work**)
|
||||
- [Encoder](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()
|
@@ -11,10 +11,10 @@ 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
|
||||
- [Layers](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up
|
||||
- [BLE_Split](/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
|
||||
- [Split](/docs/split.md) Connects halves using a wire
|
||||
- [Power](/docs/power.md) Powersaving features for battery life
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.matrix import intify_coordinate as ic
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
@@ -22,11 +21,11 @@ class KMKKeyboard(_KMKKeyboard):
|
||||
i2c = board.I2C
|
||||
powersave_pin = board.P0_13
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x) for x in range(12))
|
||||
coord_mapping.extend(ic(1, x) for x in range(12))
|
||||
coord_mapping.extend(ic(2, x) for x in range(12))
|
||||
coord_mapping.extend(ic(3, x) for x in range(12))
|
||||
|
||||
# And now, to handle R4, which at this point is down to just ten keys
|
||||
coord_mapping.extend(ic(4, x) for x in range(1, 11))
|
||||
# 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,
|
||||
]
|
||||
|
@@ -1,4 +1,5 @@
|
||||
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
|
||||
@@ -37,27 +38,31 @@ 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, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
|
||||
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,\
|
||||
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, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
|
||||
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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
]
|
||||
]
|
||||
|
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,
|
||||
]
|
122
boards/lunakey_pico/main.py
Normal file
122
boards/lunakey_pico/main.py
Normal file
@@ -0,0 +1,122 @@
|
||||
import board
|
||||
import digitalio
|
||||
|
||||
import pwmio
|
||||
import time
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
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(MediaKeys())
|
||||
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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Power](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Power](/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](/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/rgb.md) Light it up (Keybow only so far)
|
||||
- [MediaKeys](/docs/media_keys.md) Control volume and other media functions
|
0
boards/pimoroni/__init__.py
Normal file
0
boards/pimoroni/__init__.py
Normal file
0
boards/pimoroni/keybow/__init__.py
Normal file
0
boards/pimoroni/keybow/__init__.py
Normal file
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()
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user