Compare commits
240 Commits
klardotsh/
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d297e6ab2 | ||
|
|
1700aff408 | ||
|
|
63973e4a6e | ||
|
|
f7dac9e96e | ||
|
|
7ff77b97bb | ||
|
|
c7490087b6 | ||
|
|
a210c2bf62 | ||
|
|
c8df1d10ad | ||
|
|
d2e87b3e70 | ||
|
|
b3ec37e274 | ||
|
|
ec8e167996 | ||
|
|
175f0c6a97 | ||
|
|
e395e89864 | ||
|
|
8ac497d99b | ||
|
|
c880c02ad5 | ||
|
|
89351fc203 | ||
|
|
4b03ba846a | ||
|
|
87d1b0c6b9 | ||
|
|
be308d516f | ||
|
|
c950785385 | ||
|
|
74fa1fb52e | ||
|
|
7431192e95 | ||
|
|
142a15e175 | ||
|
|
0cb69651c8 | ||
|
|
6002ad33e1 | ||
|
|
3f0283422d | ||
|
|
cca5b91be2 | ||
|
|
f1d229c7ff | ||
|
|
08df52e90d | ||
|
|
529e6101ab | ||
|
|
ca773d0633 | ||
|
|
cc82433f74 | ||
|
|
7b92596937 | ||
|
|
e5f89963cf | ||
|
|
cc70c8f4a8 | ||
|
|
2a53bd8b64 | ||
|
|
07a485b04d | ||
|
|
d4e72b98c9 | ||
|
|
ea19f5bb30 | ||
|
|
24d0587ac6 | ||
|
|
d12f9a18f1 | ||
|
|
1a7d1d53f6 | ||
|
|
9539f2dc74 | ||
|
|
3687212ed7 | ||
|
|
d47143463b | ||
|
|
55a75cb9b3 | ||
|
|
9684e0d5f7 | ||
|
|
4f7f3dcc3c | ||
|
|
1863543428 | ||
|
|
58ea87dcc2 | ||
|
|
2a560cf3f3 | ||
|
|
275e61832f | ||
|
|
b2c7da2058 | ||
|
|
dc171360f6 | ||
|
|
32bafcdc46 | ||
|
|
5c33fd3a9f | ||
|
|
a8e7f43e59 | ||
|
|
c46d18ecb7 | ||
|
|
603833dbb7 | ||
|
|
2d005048cc | ||
|
|
cbaf995e33 | ||
|
|
3442a21835 | ||
|
|
4d1f9e487e | ||
|
|
e52af4f58a | ||
|
|
de1d602b25 | ||
|
|
e2f2c228d1 | ||
|
|
8dbbc42496 | ||
|
|
067b7d2e5f | ||
|
|
201d127348 | ||
|
|
c11fffea2c | ||
|
|
b3c8245365 | ||
|
|
9f2142d706 | ||
|
|
54ae022846 | ||
|
|
2008e0ab3f | ||
|
|
8cec85e3ec | ||
|
|
b7e3e4ea8c | ||
|
|
d54fff883d | ||
|
|
aae476b59f | ||
|
|
2fce09986e | ||
|
|
ef7b29bd43 | ||
|
|
ab7e0d3eb6 | ||
|
|
d26d397f10 | ||
|
|
ecc8b46a2c | ||
|
|
fd30b7a8d8 | ||
|
|
57ba0fe8b2 | ||
|
|
e7d306cf30 | ||
|
|
2d4db12c46 | ||
|
|
fb783c302c | ||
|
|
2096f1a950 | ||
|
|
a34272dd18 | ||
|
|
7f5ea97bba | ||
|
|
7f7eaafbf3 | ||
|
|
8e4ab1d733 | ||
|
|
0e029ebf72 | ||
|
|
f02ff1463a | ||
|
|
3c4e74d50e | ||
|
|
ba7b5ce15c | ||
|
|
671aa60838 | ||
|
|
dc4fc646aa | ||
|
|
6840330f50 | ||
|
|
da3e87ee2d | ||
|
|
7519a97eaa | ||
|
|
083f2e143d | ||
|
|
8c0f8ccbc3 | ||
|
|
fdf8e9f78c | ||
|
|
f4807f341e | ||
|
|
ee4cce32cb | ||
|
|
eb3a7bbf1e | ||
|
|
481c69b212 | ||
|
|
1c6b25517a | ||
|
|
a685618480 | ||
|
|
5cae17c9f3 | ||
|
|
7573556f33 | ||
|
|
f30206c7d5 | ||
|
|
21c058aaa8 | ||
|
|
0f7afe5b2c | ||
|
|
119ab3d80a | ||
|
|
7fba42f28c | ||
|
|
827862b34b | ||
|
|
f2aabd87cd | ||
|
|
91562abde9 | ||
|
|
65f48b53a4 | ||
|
|
cd4ba26e95 | ||
|
|
967046587b | ||
|
|
4a83e6de85 | ||
|
|
9e8b8376c5 | ||
|
|
aa01da7e1d | ||
|
|
1387cb2660 | ||
|
|
fa0062326b | ||
|
|
be2bbce21a | ||
|
|
1c82f7d387 | ||
|
|
9f373b4be0 | ||
|
|
2874d49d20 | ||
|
|
6ecb7807c2 | ||
|
|
99a9c6fd80 | ||
|
|
25fd205c3e | ||
|
|
a627102b52 | ||
|
|
3e3255ffea | ||
|
|
55a6636741 | ||
|
|
46152ae8d9 | ||
|
|
7fbda871c2 | ||
|
|
c09cd48218 | ||
|
|
bff1bdf6d9 | ||
|
|
f90de872d8 | ||
|
|
b6201d43d4 | ||
|
|
e70ce5f431 | ||
|
|
328a29c439 | ||
|
|
0bebdd6d27 | ||
|
|
af55acd584 | ||
|
|
245f7912b6 | ||
|
|
8419ed789c | ||
|
|
a62d39a252 | ||
|
|
10f8c74ad9 | ||
|
|
ef3d38f8ec | ||
|
|
61de548acb | ||
|
|
2527542379 | ||
|
|
14fd494cd4 | ||
|
|
c37170da56 | ||
|
|
3258e76ba4 | ||
|
|
7f207062e9 | ||
|
|
410cf7af07 | ||
|
|
8063898eb2 | ||
|
|
5fcd31b97c | ||
|
|
e1300ba767 | ||
|
|
a8b2bf75ad | ||
|
|
a7a560bbca | ||
|
|
dc364a77fb | ||
|
|
5073a29501 | ||
|
|
11ff03523b | ||
|
|
f7c0bd962b | ||
|
|
08b41fda69 | ||
|
|
797cdfe38a | ||
|
|
841f990481 | ||
|
|
85fe8fef12 | ||
|
|
f9dd03f207 | ||
|
|
9aa3a21900 | ||
|
|
899b95e586 | ||
|
|
0a81876eae | ||
|
|
1aa4db1dd3 | ||
|
|
235560bf72 | ||
|
|
72943a8fe1 | ||
|
|
9dbecbcb86 | ||
|
|
a2e26055a6 | ||
|
|
d8445c1262 | ||
|
|
3bbadece8d | ||
|
|
27104cc28d | ||
|
|
b2dae8175e | ||
|
|
b3d4ffde0a | ||
|
|
2da3b1f5f4 | ||
|
|
14c1cacf02 | ||
|
|
997f4651ee | ||
|
|
8d01908468 | ||
|
|
e92e122588 | ||
|
|
09dd2be1bc | ||
|
|
634d53b987 | ||
|
|
aa95412a0e | ||
|
|
b4fd94e911 | ||
|
|
7ce2827da7 | ||
|
|
0b43a3de38 | ||
|
|
7427531494 | ||
|
|
4a8b95ce93 | ||
|
|
6fce4c996c | ||
|
|
3e91f63c88 | ||
|
|
5aa123b550 | ||
|
|
4165e25ff5 | ||
|
|
997ddfc119 | ||
|
|
5f1b9d2b14 | ||
|
|
f381761507 | ||
|
|
4c73be5236 | ||
|
|
dffaec9f03 | ||
|
|
6c13c97e83 | ||
|
|
74186f20a1 | ||
|
|
b2db921a5b | ||
|
|
ed68ddb79d | ||
|
|
d9fb351448 | ||
|
|
0f6e183235 | ||
|
|
484bcc4d22 | ||
|
|
7993a4e415 | ||
|
|
2384550af4 | ||
|
|
1222477866 | ||
|
|
a6606c6957 | ||
|
|
dea2abb81a | ||
|
|
2d3b2e95c6 | ||
|
|
5572fabf8d | ||
|
|
6357141165 | ||
|
|
edfd127148 | ||
|
|
04b720da5b | ||
|
|
d2b34097f2 | ||
|
|
0bc6fe0c97 | ||
|
|
d114a28f9e | ||
|
|
6a38b3cb0a | ||
|
|
e3c1c86a0b | ||
|
|
0d27901b0d | ||
|
|
45e4356630 | ||
|
|
3069608e56 | ||
|
|
48ab6767e4 | ||
|
|
fb34038911 | ||
|
|
dac457d94c | ||
|
|
fc69245c57 | ||
|
|
7586df8de9 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -121,6 +121,9 @@ venv.bak/
|
||||
mnt/
|
||||
mnt2/
|
||||
|
||||
# Mac
|
||||
.DS_Store
|
||||
|
||||
# build artifacts
|
||||
kmk/release_info.py
|
||||
kmk/release_info.mpy
|
||||
|
||||
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)"
|
||||
|
||||
4
Pipfile
4
Pipfile
@ -20,7 +20,3 @@ s3cmd = "*"
|
||||
black = "==21.6b0"
|
||||
flake8-quotes = "*"
|
||||
flake8-black = "*"
|
||||
circuitpython-stubs = "==7.0.0a6.dev195"
|
||||
pyright = "*"
|
||||
typing = "*"
|
||||
mypy = "*"
|
||||
|
||||
460
Pipfile.lock
generated
460
Pipfile.lock
generated
@ -1,7 +1,7 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "cee0eeba8c8dad66dccffe0935656829132f7ca928569e3aa957f278e6e92da6"
|
||||
"sha256": "0a04ec24d4aef6828e4f5eefa0a7d2c312f21f2b2f18c42c7004cdbe0c02bd53"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {},
|
||||
@ -45,28 +45,21 @@
|
||||
"index": "pypi",
|
||||
"version": "==21.6b0"
|
||||
},
|
||||
"circuitpython-stubs": {
|
||||
"hashes": [
|
||||
"sha256:5963ef6b41b03e97049d48142cb23778f3e4ca841620296d7e13b00025522569"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==7.0.0a6.dev195"
|
||||
},
|
||||
"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": [
|
||||
@ -78,11 +71,11 @@
|
||||
},
|
||||
"flake8-black": {
|
||||
"hashes": [
|
||||
"sha256:c199844bc1b559d91195ebe8620216f21ed67f2cc1ff6884294c91a0d2492684",
|
||||
"sha256:cc080ba5b3773b69ba102b6617a00cc4ecbad8914109690cfda4d565ea435d96"
|
||||
"sha256:941514149cb8b489cb17a4bb1cf18d84375db3b34381bb018de83509437931a0",
|
||||
"sha256:f26651bc10db786c03f4093414f7c9ea982ed8a244cec323c984feeffdf4c118"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.2.3"
|
||||
"version": "==0.2.1"
|
||||
},
|
||||
"flake8-commas": {
|
||||
"hashes": [
|
||||
@ -94,11 +87,11 @@
|
||||
},
|
||||
"flake8-comprehensions": {
|
||||
"hashes": [
|
||||
"sha256:4888de89248b7f7535159189ff693c77f8354f6d37a02619fa28c9921a913aa0",
|
||||
"sha256:e9a010b99aa90c05790d45281ad9953df44a4a08a1a8f6cd41f98b4fc6a268a0"
|
||||
"sha256:b07aef3277623db32310aa241a1cec67212b53c1d18e767d7e26d4d83aa05bf7",
|
||||
"sha256:f24be9032587127f7a5bc6d066bf755b6e66834f694383adb8a673e229c1f559"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.6.1"
|
||||
"version": "==3.5.0"
|
||||
},
|
||||
"flake8-isort": {
|
||||
"hashes": [
|
||||
@ -110,66 +103,71 @@
|
||||
},
|
||||
"flake8-quotes": {
|
||||
"hashes": [
|
||||
"sha256:f1dd87830ed77ff2ce47fc0ee0fd87ae20e8f045355354ffbf4dcaa18d528217"
|
||||
"sha256:3f1116e985ef437c130431ac92f9b3155f8f652fda7405ac22ffdfd7a9d1055e"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.3.0"
|
||||
"version": "==3.2.0"
|
||||
},
|
||||
"greenlet": {
|
||||
"hashes": [
|
||||
"sha256:04e1849c88aa56584d4a0a6e36af5ec7cc37993fdc1fda72b56aa1394a92ded3",
|
||||
"sha256:05e72db813c28906cdc59bd0da7c325d9b82aa0b0543014059c34c8c4ad20e16",
|
||||
"sha256:07e6d88242e09b399682b39f8dfa1e7e6eca66b305de1ff74ed9eb1a7d8e539c",
|
||||
"sha256:090126004c8ab9cd0787e2acf63d79e80ab41a18f57d6448225bbfcba475034f",
|
||||
"sha256:1796f2c283faab2b71c67e9b9aefb3f201fdfbee5cb55001f5ffce9125f63a45",
|
||||
"sha256:2f89d74b4f423e756a018832cd7a0a571e0a31b9ca59323b77ce5f15a437629b",
|
||||
"sha256:34e6675167a238bede724ee60fe0550709e95adaff6a36bcc97006c365290384",
|
||||
"sha256:3e594015a2349ec6dcceda9aca29da8dc89e85b56825b7d1f138a3f6bb79dd4c",
|
||||
"sha256:3f8fc59bc5d64fa41f58b0029794f474223693fd00016b29f4e176b3ee2cfd9f",
|
||||
"sha256:3fc6a447735749d651d8919da49aab03c434a300e9f0af1c886d560405840fd1",
|
||||
"sha256:40abb7fec4f6294225d2b5464bb6d9552050ded14a7516588d6f010e7e366dcc",
|
||||
"sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68",
|
||||
"sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142",
|
||||
"sha256:4870b018ca685ff573edd56b93f00a122f279640732bb52ce3a62b73ee5c4a92",
|
||||
"sha256:4adaf53ace289ced90797d92d767d37e7cdc29f13bd3830c3f0a561277a4ae83",
|
||||
"sha256:4eae94de9924bbb4d24960185363e614b1b62ff797c23dc3c8a7c75bbb8d187e",
|
||||
"sha256:5317701c7ce167205c0569c10abc4bd01c7f4cf93f642c39f2ce975fa9b78a3c",
|
||||
"sha256:5c3b735ccf8fc8048664ee415f8af5a3a018cc92010a0d7195395059b4b39b7d",
|
||||
"sha256:5cde7ee190196cbdc078511f4df0be367af85636b84d8be32230f4871b960687",
|
||||
"sha256:655ab836324a473d4cd8cf231a2d6f283ed71ed77037679da554e38e606a7117",
|
||||
"sha256:6ce9d0784c3c79f3e5c5c9c9517bbb6c7e8aa12372a5ea95197b8a99402aa0e6",
|
||||
"sha256:6e0696525500bc8aa12eae654095d2260db4dc95d5c35af2b486eae1bf914ccd",
|
||||
"sha256:75ff270fd05125dce3303e9216ccddc541a9e072d4fc764a9276d44dee87242b",
|
||||
"sha256:8039f5fe8030c43cd1732d9a234fdcbf4916fcc32e21745ca62e75023e4d4649",
|
||||
"sha256:84488516639c3c5e5c0e52f311fff94ebc45b56788c2a3bfe9cf8e75670f4de3",
|
||||
"sha256:84782c80a433d87530ae3f4b9ed58d4a57317d9918dfcc6a59115fa2d8731f2c",
|
||||
"sha256:8ddb38fb6ad96c2ef7468ff73ba5c6876b63b664eebb2c919c224261ae5e8378",
|
||||
"sha256:98b491976ed656be9445b79bc57ed21decf08a01aaaf5fdabf07c98c108111f6",
|
||||
"sha256:990e0f5e64bcbc6bdbd03774ecb72496224d13b664aa03afd1f9b171a3269272",
|
||||
"sha256:9b02e6039eafd75e029d8c58b7b1f3e450ca563ef1fe21c7e3e40b9936c8d03e",
|
||||
"sha256:a11b6199a0b9dc868990456a2667167d0ba096c5224f6258e452bfbe5a9742c5",
|
||||
"sha256:a414f8e14aa7bacfe1578f17c11d977e637d25383b6210587c29210af995ef04",
|
||||
"sha256:a91ee268f059583176c2c8b012a9fce7e49ca6b333a12bbc2dd01fc1a9783885",
|
||||
"sha256:ac991947ca6533ada4ce7095f0e28fe25d5b2f3266ad5b983ed4201e61596acf",
|
||||
"sha256:b050dbb96216db273b56f0e5960959c2b4cb679fe1e58a0c3906fa0a60c00662",
|
||||
"sha256:b97a807437b81f90f85022a9dcfd527deea38368a3979ccb49d93c9198b2c722",
|
||||
"sha256:bad269e442f1b7ffa3fa8820b3c3aa66f02a9f9455b5ba2db5a6f9eea96f56de",
|
||||
"sha256:bf3725d79b1ceb19e83fb1aed44095518c0fcff88fba06a76c0891cfd1f36837",
|
||||
"sha256:c0f22774cd8294078bdf7392ac73cf00bfa1e5e0ed644bd064fdabc5f2a2f481",
|
||||
"sha256:c1862f9f1031b1dee3ff00f1027fcd098ffc82120f43041fe67804b464bbd8a7",
|
||||
"sha256:c8d4ed48eed7414ccb2aaaecbc733ed2a84c299714eae3f0f48db085342d5629",
|
||||
"sha256:cf31e894dabb077a35bbe6963285d4515a387ff657bd25b0530c7168e48f167f",
|
||||
"sha256:d15cb6f8706678dc47fb4e4f8b339937b04eda48a0af1cca95f180db552e7663",
|
||||
"sha256:dfcb5a4056e161307d103bc013478892cfd919f1262c2bb8703220adcb986362",
|
||||
"sha256:e02780da03f84a671bb4205c5968c120f18df081236d7b5462b380fd4f0b497b",
|
||||
"sha256:e2002a59453858c7f3404690ae80f10c924a39f45f6095f18a985a1234c37334",
|
||||
"sha256:e22a82d2b416d9227a500c6860cf13e74060cf10e7daf6695cbf4e6a94e0eee4",
|
||||
"sha256:e41f72f225192d5d4df81dad2974a8943b0f2d664a2a5cfccdf5a01506f5523c",
|
||||
"sha256:f253dad38605486a4590f9368ecbace95865fea0f2b66615d121ac91fd1a1563",
|
||||
"sha256:fddfb31aa2ac550b938d952bca8a87f1db0f8dc930ffa14ce05b5c08d27e7fd1"
|
||||
"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.1"
|
||||
"version": "==1.1.2"
|
||||
},
|
||||
"ipdb": {
|
||||
"hashes": [
|
||||
@ -180,42 +178,35 @@
|
||||
},
|
||||
"ipython": {
|
||||
"hashes": [
|
||||
"sha256:0cff04bb042800129348701f7bd68a430a844e8fb193979c08f6c99f28bb735e",
|
||||
"sha256:892743b65c21ed72b806a3a602cca408520b3200b89d1924f4b3d2cdb3692362"
|
||||
"sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874",
|
||||
"sha256:b5548ec5329a4bcf054a5deed5099b0f9622eb9ea51aaa7104d215fece201d8c"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==7.26.0"
|
||||
},
|
||||
"ipython-genutils": {
|
||||
"hashes": [
|
||||
"sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
|
||||
"sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
|
||||
],
|
||||
"version": "==0.2.0"
|
||||
"version": "==7.31.1"
|
||||
},
|
||||
"isort": {
|
||||
"hashes": [
|
||||
"sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899",
|
||||
"sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"
|
||||
"sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6",
|
||||
"sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==5.9.3"
|
||||
"version": "==5.8.0"
|
||||
},
|
||||
"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": [
|
||||
@ -226,65 +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"
|
||||
},
|
||||
"mypy": {
|
||||
"hashes": [
|
||||
"sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9",
|
||||
"sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a",
|
||||
"sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9",
|
||||
"sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e",
|
||||
"sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2",
|
||||
"sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212",
|
||||
"sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b",
|
||||
"sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885",
|
||||
"sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150",
|
||||
"sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703",
|
||||
"sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072",
|
||||
"sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457",
|
||||
"sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e",
|
||||
"sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0",
|
||||
"sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb",
|
||||
"sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97",
|
||||
"sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8",
|
||||
"sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811",
|
||||
"sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6",
|
||||
"sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de",
|
||||
"sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504",
|
||||
"sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921",
|
||||
"sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.910"
|
||||
"version": "==1.0.3"
|
||||
},
|
||||
"mypy-extensions": {
|
||||
"hashes": [
|
||||
@ -300,20 +268,13 @@
|
||||
"index": "pypi",
|
||||
"version": "==0.3.1"
|
||||
},
|
||||
"nodeenv": {
|
||||
"hashes": [
|
||||
"sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b",
|
||||
"sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"
|
||||
],
|
||||
"version": "==1.6.0"
|
||||
},
|
||||
"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": [
|
||||
@ -339,11 +300,11 @@
|
||||
},
|
||||
"prompt-toolkit": {
|
||||
"hashes": [
|
||||
"sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c",
|
||||
"sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"
|
||||
"sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6",
|
||||
"sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.2'",
|
||||
"version": "==3.0.20"
|
||||
"version": "==3.0.24"
|
||||
},
|
||||
"ptyprocess": {
|
||||
"hashes": [
|
||||
@ -370,11 +331,11 @@
|
||||
},
|
||||
"pygments": {
|
||||
"hashes": [
|
||||
"sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
|
||||
"sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
|
||||
"sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65",
|
||||
"sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==2.10.0"
|
||||
"version": "==2.11.2"
|
||||
},
|
||||
"pynvim": {
|
||||
"hashes": [
|
||||
@ -382,14 +343,6 @@
|
||||
],
|
||||
"version": "==0.4.3"
|
||||
},
|
||||
"pyright": {
|
||||
"hashes": [
|
||||
"sha256:dd8e18c54321340be44a708b6037c0b967486c32b3f492741fffdc205cb82f15",
|
||||
"sha256:e2668730cddf580e696d4a11946e740e2f5647df1eb45f7c55b7029376eac5a1"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.0.9"
|
||||
},
|
||||
"pyserial": {
|
||||
"hashes": [
|
||||
"sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb",
|
||||
@ -407,11 +360,11 @@
|
||||
},
|
||||
"python-dotenv": {
|
||||
"hashes": [
|
||||
"sha256:aae25dc1ebe97c420f50b81fb0e5c949659af713f31fdb63c749ca68748f34b1",
|
||||
"sha256:f521bc2ac9a8e03c736f62911605c5d83970021e3fa95b37d769e2bbbe9b6172"
|
||||
"sha256:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3",
|
||||
"sha256:a5de49a31e953b45ff2d2fd434bbc2670e8db5273606c1e737cc6b93eff3655f"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.19.0"
|
||||
"version": "==0.19.2"
|
||||
},
|
||||
"python-magic": {
|
||||
"hashes": [
|
||||
@ -423,49 +376,82 @@
|
||||
},
|
||||
"regex": {
|
||||
"hashes": [
|
||||
"sha256:0696eb934dee723e3292056a2c046ddb1e4dd3887685783a9f4af638e85dee76",
|
||||
"sha256:105122fa63da98d8456d5026bc6ac5a1399fd82fa6bad22c6ea641b1572c9142",
|
||||
"sha256:116c277774f84266044e889501fe79cfd293a8b4336b7a5e89b9f20f1e5a9f21",
|
||||
"sha256:12eaf0bbe568bd62e6cade7937e0bf01a2a4cef49a82f4fd204401e78409e158",
|
||||
"sha256:1401cfa4320691cbd91191ec678735c727dee674d0997b0902a5a38ad482faf5",
|
||||
"sha256:19acdb8831a4e3b03b23369db43178d8fee1f17b99c83af6cd907886f76bd9d4",
|
||||
"sha256:208851a2f8dd31e468f0b5aa6c94433975bd67a107a4e7da3bdda947c9f85e25",
|
||||
"sha256:24d68499a27b2d93831fde4a9b84ea5b19e0ab141425fbc9ab1e5b4dad179df7",
|
||||
"sha256:2778c6cb379d804e429cc8e627392909e60db5152b42c695c37ae5757aae50ae",
|
||||
"sha256:2a0a5e323cf86760784ce2b91d8ab5ea09d0865d6ef4da0151e03d15d097b24e",
|
||||
"sha256:2d9cbe0c755ab8b6f583169c0783f7278fc6b195e423b09c5a8da6f858025e96",
|
||||
"sha256:2de1429e4eeab799c168a4f6e6eecdf30fcaa389bba4039cc8a065d6b7aad647",
|
||||
"sha256:32753eda8d413ce4f208cfe01dd61171a78068a6f5d5f38ccd751e00585cdf1d",
|
||||
"sha256:3ee8ad16a35c45a5bab098e39020ecb6fec3b0e700a9d88983d35cbabcee79c8",
|
||||
"sha256:4f03fc0a25122cdcbf39136510d4ea7627f732206892db522adf510bc03b8c67",
|
||||
"sha256:4f3e36086d6631ceaf468503f96a3be0d247caef0660c9452fb1b0c055783851",
|
||||
"sha256:503c1ba0920a46a1844363725215ef44d59fcac2bd2c03ae3c59aa9d08d29bd6",
|
||||
"sha256:507861cf3d97a86fbe26ea6cc04660ae028b9e4080b8290e28b99547b4e15d89",
|
||||
"sha256:56ae6e3cf0506ec0c40b466e31f41ee7a7149a2b505ae0ee50edd9043b423d27",
|
||||
"sha256:6530b7b9505123cdea40a2301225183ca65f389bc6129f0c225b9b41680268d8",
|
||||
"sha256:6729914dd73483cd1c8aaace3ac082436fc98b0072743ac136eaea0b3811d42f",
|
||||
"sha256:7406dd2e44c7cfb4680c0a45a03264381802c67890cf506c147288f04c67177d",
|
||||
"sha256:7684016b73938ca12d160d2907d141f06b7597bd17d854e32bb7588be01afa1d",
|
||||
"sha256:7db58ad61f3f6ea393aaf124d774ee0c58806320bc85c06dc9480f5c7219c250",
|
||||
"sha256:83946ca9278b304728b637bc8d8200ab1663a79de85e47724594917aeed0e892",
|
||||
"sha256:84057cfae5676f456b03970eb78b7e182fddc80c2daafd83465a3d6ca9ff8dbf",
|
||||
"sha256:862b6164e9a38b5c495be2c2854e75fd8af12c5be4c61dc9b42d255980d7e907",
|
||||
"sha256:8ddb4f9ce6bb388ecc97b4b3eb37e786f05d7d5815e8822e0d87a3dbd7100649",
|
||||
"sha256:92eb03f47427fea452ff6956d11f5d5a3f22a048c90a0f34fa223e6badab6c85",
|
||||
"sha256:a5f3bc727fea58f21d99c22e6d4fca652dc11dbc2a1e7cfc4838cd53b2e3691f",
|
||||
"sha256:a6180dbf5945b27e9420e1b58c3cacfc79ad5278bdad3ea35109f5680fbe16d1",
|
||||
"sha256:b158f673ae6a6523f13704f70aa7e4ce875f91e379bece4362c89db18db189d5",
|
||||
"sha256:cd45b4542134de63e7b9dd653e0a2d7d47ffed9615e3637c27ca5f6b78ea68bb",
|
||||
"sha256:d2404336fd16788ea757d4218a2580de60adb052d9888031e765320be8884309",
|
||||
"sha256:db888d4fb33a2fd54b57ac55d5015e51fa849f0d8592bd799b4e47f83bd04e00",
|
||||
"sha256:dde0ac721c7c5bfa5f9fc285e811274dec3c392f2c1225f7d07ca98a8187ca84",
|
||||
"sha256:de0d06ccbc06af5bf93bddec10f4f80275c5d74ea6d28b456931f3955f58bc8c",
|
||||
"sha256:e02dad60e3e8442eefd28095e99b2ac98f2b8667167493ac6a2f3aadb5d84a17",
|
||||
"sha256:e960fe211496333b2f7e36badf4c22a919d740386681f79139ee346b403d1ca1",
|
||||
"sha256:e9700c52749cb3e90c98efd72b730c97b7e4962992fca5fbcaf1363be8e3b849",
|
||||
"sha256:ee318974a1fdacba1701bc9e552e9015788d6345416364af6fa987424ff8df53"
|
||||
"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.8.27"
|
||||
"version": "==2022.1.18"
|
||||
},
|
||||
"s3cmd": {
|
||||
"hashes": [
|
||||
@ -475,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",
|
||||
@ -485,10 +479,10 @@
|
||||
},
|
||||
"testfixtures": {
|
||||
"hashes": [
|
||||
"sha256:0a6422737f6d89b45cdef1e2df5576f52ad0f507956002ce1020daa9f44211d6",
|
||||
"sha256:486be7b01eb71326029811878a3317b7e7994324621c0ec633c8e24499d8d5b3"
|
||||
"sha256:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d",
|
||||
"sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"
|
||||
],
|
||||
"version": "==6.18.1"
|
||||
"version": "==6.18.3"
|
||||
},
|
||||
"toml": {
|
||||
"hashes": [
|
||||
@ -500,27 +494,11 @@
|
||||
},
|
||||
"traitlets": {
|
||||
"hashes": [
|
||||
"sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396",
|
||||
"sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"
|
||||
"sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7",
|
||||
"sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==5.0.5"
|
||||
},
|
||||
"typing": {
|
||||
"hashes": [
|
||||
"sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9",
|
||||
"sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.7.4.3"
|
||||
},
|
||||
"typing-extensions": {
|
||||
"hashes": [
|
||||
"sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
|
||||
"sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
|
||||
"sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
|
||||
],
|
||||
"version": "==3.10.0.0"
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"wcwidth": {
|
||||
"hashes": [
|
||||
|
||||
37
README.md
37
README.md
@ -12,23 +12,18 @@ https://img.shields.io/discord/493256121075761173?logo=Discord
|
||||
|
||||
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
|
||||
@ -58,10 +53,11 @@ Our getting started guide can be found
|
||||
|
||||
## 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,10 +76,17 @@ 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
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -11,9 +11,9 @@ Retailers (USA)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
|
||||
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
|
||||
@ -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
|
||||
|
||||
@ -20,8 +20,8 @@ Corne LP
|
||||
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
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
23
boards/jpconstantineau/Batreus44/kb_BlueMicro840.py
Normal file
23
boards/jpconstantineau/Batreus44/kb_BlueMicro840.py
Normal file
@ -0,0 +1,23 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.P0_15,
|
||||
board.P0_17,
|
||||
board.P0_20,
|
||||
board.P0_13,
|
||||
board.P0_24,
|
||||
board.P0_09,
|
||||
board.P0_03,
|
||||
board.P1_13,
|
||||
board.P0_02,
|
||||
board.P0_29,
|
||||
board.P0_26,
|
||||
board.P0_30,
|
||||
)
|
||||
row_pins = (board.P0_28, board.P1_11, board.P0_10, board.P1_06)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
15
boards/jpconstantineau/PyKey60/README.md
Normal file
15
boards/jpconstantineau/PyKey60/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# JPConstantineau's PyKey60
|
||||
|
||||

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

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

|
||||
|
||||
|
||||
44 Keys RGB Keyboard inspired from Keyboardio's Atreus with a Raspberry Pi Pico
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/44-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
24
boards/jpconstantineau/vcolmx44/kb.py
Normal file
24
boards/jpconstantineau/vcolmx44/kb.py
Normal file
@ -0,0 +1,24 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP20,
|
||||
board.GP19,
|
||||
board.GP18,
|
||||
board.GP17,
|
||||
board.GP16,
|
||||
board.GP5,
|
||||
board.GP4,
|
||||
board.GP3,
|
||||
board.GP2,
|
||||
board.GP1,
|
||||
board.GP0,
|
||||
)
|
||||
row_pins = (board.GP22, board.GP21, board.GP14, board.GP15)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.GP28
|
||||
rgb_num_pixels = 44
|
||||
@ -8,8 +8,8 @@ kb_converter.py is designed to work with an itsybitsy with converter board found
|
||||
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
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
|
||||
@ -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,11 +22,6 @@ 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
|
||||
@ -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,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
|
||||
|
||||
@ -8,8 +8,8 @@ kb_converter.py is designed to work with an itsybitsy with converter board found
|
||||
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
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
|
||||
@ -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
|
||||
|
||||
@ -9,8 +9,8 @@ kb_converter.py is designed to work with an itsybitsy with converter board found
|
||||
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
|
||||
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
|
||||
@ -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](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Do you need more keys than switches? Use
|
||||
layers.
|
||||
- [ModTap](https://github.com/KMKfw/kmk_firmware/blob/master/docs/modtap.md) Enable press/hold double binding of keys
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/blob/master/docs/media_keys.md) Common media controls
|
||||
|
||||
Also uncomment right section to enable samples of following:
|
||||
|
||||
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Turn on the backlight (**requires neopixel.py
|
||||
library to work**)
|
||||
- [Encoder](https://github.com/KMKfw/kmk_firmware/blob/master/docs/encoder.md) Make the knobs do something
|
||||
|
||||
## More steps required during install
|
||||
|
||||
In order to mitigate lack of one-wire protocol, KMK use its UART implementation but with special low-level PIO
|
||||
subprogram available only on RP2040. It allows using other pins for UART than on-board RX and TX.
|
||||
|
||||
Because of the above, besides of normal installation steps, you have to also:
|
||||
|
||||
- install Circuit Python in 7.2+ version
|
||||
- add `adafruit_pioasm.mpy` library to lib or root folder of a board
|
||||
34
boards/kyria/kyria_v1_kb2040.py
Normal file
34
boards/kyria/kyria_v1_kb2040.py
Normal file
@ -0,0 +1,34 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners import intify_coordinate as ic
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.A3,
|
||||
board.A2,
|
||||
board.A1,
|
||||
board.A0,
|
||||
board.SCK,
|
||||
board.MISO,
|
||||
board.MOSI,
|
||||
board.D10,
|
||||
)
|
||||
row_pins = (board.D8, board.D7, board.D6, board.D4)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
data_pin = board.D1
|
||||
rgb_pixel_pin = board.D0
|
||||
encoder_pin_0 = board.D9
|
||||
encoder_pin_1 = board.D5
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(4, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(1, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(5, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(2, x, 8) for x in range(8))
|
||||
coord_mapping.extend(ic(6, x, 8) for x in range(7, -1, -1))
|
||||
coord_mapping.extend(ic(3, x, 8) for x in range(3, 8))
|
||||
coord_mapping.extend(ic(7, x, 8) for x in range(7, 2, -1))
|
||||
34
boards/kyria/kyria_v1_rp2040.py
Normal file
34
boards/kyria/kyria_v1_rp2040.py
Normal file
@ -0,0 +1,34 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners import intify_coordinate as ic
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.D29,
|
||||
board.D28,
|
||||
board.D27,
|
||||
board.D26,
|
||||
board.D22,
|
||||
board.D20,
|
||||
board.D23,
|
||||
board.D21,
|
||||
)
|
||||
row_pins = (board.D8, board.D7, board.D6, board.D4)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
data_pin = board.RX
|
||||
rgb_pixel_pin = board.D0
|
||||
encoder_pin_0 = board.D9
|
||||
encoder_pin_1 = board.D5
|
||||
|
||||
coord_mapping = []
|
||||
coord_mapping.extend(ic(0, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(4, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(1, x, 8) for x in range(6))
|
||||
coord_mapping.extend(ic(5, x, 8) for x in range(5, -1, -1))
|
||||
coord_mapping.extend(ic(2, x, 8) for x in range(8))
|
||||
coord_mapping.extend(ic(6, x, 8) for x in range(7, -1, -1))
|
||||
coord_mapping.extend(ic(3, x, 8) for x in range(3, 8))
|
||||
coord_mapping.extend(ic(7, x, 8) for x in range(7, 2, -1))
|
||||
99
boards/kyria/main.py
Normal file
99
boards/kyria/main.py
Normal file
@ -0,0 +1,99 @@
|
||||
from kyria_v1_rp2040 import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.rgb import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.modtap import ModTap
|
||||
from kmk.modules.split import Split, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.debug_enabled = True
|
||||
|
||||
keyboard.modules.append(Layers())
|
||||
keyboard.modules.append(ModTap())
|
||||
keyboard.extensions.append(MediaKeys())
|
||||
|
||||
# Using drive names (KYRIAL, KYRIAR) to recognize sides; use split_side arg if you're not doing it
|
||||
split = Split(split_type=SplitType.UART, use_pio=True)
|
||||
keyboard.modules.append(split)
|
||||
|
||||
# Uncomment below if you're using encoder
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = ((keyboard.encoder_pin_0, keyboard.encoder_pin_1, None, False),)
|
||||
|
||||
# Uncomment below if you're having RGB
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=keyboard.rgb_pixel_pin,
|
||||
num_pixels=10,
|
||||
animation_mode=AnimationModes.BREATHING_RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(rgb_ext)
|
||||
|
||||
# Edit your layout below
|
||||
# Currently, that's a default QMK Kyria Layout - https://config.qmk.fm/#/splitkb/kyria/rev1/LAYOUT
|
||||
ESC_LCTL = KC.MT(KC.ESC, KC.LCTL)
|
||||
QUOTE_RCTL = KC.MT(KC.QUOTE, KC.RCTL)
|
||||
ENT_LALT = KC.MT(KC.ENT, KC.LALT)
|
||||
MINUS_RCTL = KC.MT(KC.MINUS, KC.RCTL)
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
|
||||
ESC_LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, QUOTE_RCTL,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
|
||||
],
|
||||
[
|
||||
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC,
|
||||
ESC_LCTL, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, MINUS_RCTL,
|
||||
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.RSFT,
|
||||
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
|
||||
],
|
||||
[
|
||||
KC.TAB, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
|
||||
ESC_LCTL, KC.A, KC.R, KC.S, KC.T, KC.G, KC.M, KC.N, KC.E, KC.I, KC.O, QUOTE_RCTL,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PGUP, KC.HOME, KC.UP, KC.END, KC.VOLU, KC.DEL,
|
||||
KC.TRNS, KC.LGUI, KC.LALT, KC.LCTL, KC.LSFT, KC.TRNS, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.VOLD, KC.INS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.SLCK, KC.TRNS, KC.TRNS, KC.PAUS, KC.MPRV, KC.MPLY, KC.MNXT, KC.MUTE, KC.PSCR,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.EQL,
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.PLUS,
|
||||
KC.PIPE, KC.BSLS, KC.COLN, KC.SCLN, KC.MINS, KC.LBRC, KC.LCBR, KC.TRNS, KC.TRNS, KC.RCBR, KC.RBRC, KC.UNDS, KC.COMM, KC.DOT, KC.SLSH, KC.QUES,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.F9, KC.F10, KC.F11, KC.F12, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.F5, KC.F6, KC.F7, KC.F8, KC.TRNS, KC.TRNS, KC.RSFT, KC.RCTL, KC.LALT, KC.RGUI, KC.TRNS,
|
||||
KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F4, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(0), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(1), KC.TRNS, KC.TRNS, KC.RGB_TOG, KC.RGB_SAI, KC.RGB_HUI, KC.RGB_VAI, KC.RGB_M_P, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(2), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.RGB_SAD, KC.RGB_HUD, KC.RGB_VAD, KC.RGB_M_P, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
],
|
||||
]
|
||||
|
||||
# Uncomment below if using an encoder
|
||||
# Edit your encoder layout below
|
||||
encoder_handler.map = (
|
||||
((KC.VOLD, KC.VOLU),),
|
||||
((KC.VOLD, KC.VOLU),),
|
||||
((KC.VOLD, KC.VOLU),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
((KC.MPRV, KC.MNXT),),
|
||||
)
|
||||
keyboard.modules.append(encoder_handler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
@ -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,
|
||||
]
|
||||
120
boards/lunakey_pico/main.py
Normal file
120
boards/lunakey_pico/main.py
Normal file
@ -0,0 +1,120 @@
|
||||
import board
|
||||
import digitalio
|
||||
|
||||
import pwmio
|
||||
import time
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.modtap import ModTap
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
led = digitalio.DigitalInOut(board.GP25)
|
||||
led.direction = digitalio.Direction.OUTPUT
|
||||
led.value = True
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.tap_time = 100
|
||||
|
||||
layers_ext = Layers()
|
||||
modtap_ext = ModTap()
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
|
||||
data_pin = board.GP1 if split_side == SplitSide.LEFT else board.GP0
|
||||
data_pin2 = board.GP0 if split_side == SplitSide.LEFT else board.GP1
|
||||
|
||||
split = Split(
|
||||
split_side=split_side,
|
||||
split_type=SplitType.UART,
|
||||
split_flip=True,
|
||||
data_pin=data_pin,
|
||||
data_pin2=data_pin2
|
||||
)
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=board.GP6,
|
||||
num_pixels=6,
|
||||
animation_mode=AnimationModes.BREATHING_RAINBOW
|
||||
)
|
||||
|
||||
keyboard.modules = [layers_ext, modtap_ext, split]
|
||||
keyboard.extensions.append(rgb_ext)
|
||||
|
||||
if split_side == SplitSide.LEFT:
|
||||
buzzer = pwmio.PWMOut(board.GP8, variable_frequency=True)
|
||||
OFF = 0
|
||||
ON = 2**15
|
||||
buzzer.duty_cycle = ON
|
||||
buzzer.frequency = 2000
|
||||
time.sleep(0.2)
|
||||
buzzer.frequency = 1000
|
||||
time.sleep(0.2)
|
||||
buzzer.duty_cycle = OFF
|
||||
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
ADJUST = KC.MO(3)
|
||||
CT_TAB = KC.MT(KC.TAB, KC.LCTRL)
|
||||
CT_QUOT = KC.MT(KC.QUOT, KC.LCTRL)
|
||||
SF_MINS = KC.MT(KC.MINS, KC.LSHIFT)
|
||||
SG_PSCR = KC.LSFT(KC.LGUI(KC.PSCR))
|
||||
SF_PSCR = KC.LSFT(KC.PSCR)
|
||||
CG_RGHT = KC.LCTRL(KC.LGUI(KC.RGHT))
|
||||
RESET = KC.RESET
|
||||
LANG1 = KC.LANG1
|
||||
LANG2 = KC.LANG2
|
||||
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.GESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
CT_TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, CT_QUOT,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, SF_MINS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.LALT, LANG2, LOWER, KC.SPC, KC.ENT, RAISE, LANG1, KC.RALT
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
],
|
||||
[ # LOWER
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.BSLS, KC.CIRC, KC.EXLM, KC.AMPR, KC.PIPE, KC.DLR, KC.AT, KC.ASTR, KC.PLUS, KC.EQL, KC.PERC, KC.BSPC,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DQT,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.COLN, KC.LABK, KC.RABK, KC.QUES, KC.UNDS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.LGUI, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, ADJUST, KC.TRNS, KC.LGUI
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
],
|
||||
[ # RAISE
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.BSLS, KC.CIRC, KC.EXLM, KC.AMPR, KC.PIPE, KC.DLR, KC.AT, KC.ASTR, KC.PLUS, KC.EQL, KC.PERC, KC.BSPC,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.HASH, KC.GRV, KC.LBRC, KC.RBRC, KC.LPRN, KC.RPRN, KC.PGUP, KC.HOME, KC.UP, KC.END, KC.TRNS, KC.DQT,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TILD, KC.TRNS, KC.TRNS, KC.LCBR, KC.RCBR, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.TRNS, KC.TRNS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.LGUI, KC.TRNS, ADJUST, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.LGUI
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
],
|
||||
[ # ADJUST
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, RESET, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12,\
|
||||
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.VOLD, KC.VOLU, KC.MUTE, KC.TRNS, SG_PSCR, SF_PSCR, KC.CAPS, KC.TRNS, CG_RGHT, KC.TRNS,\
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS
|
||||
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
17
boards/may_pad/README.md
Normal file
17
boards/may_pad/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# May Pad
|
||||
|
||||

|
||||
|
||||
A through hole kit using a pro micro footprint and through hole diodes! Can be a 20 key macropad or a numpad!
|
||||
|
||||
kb.py is designed to work with the Adafruit KB2040
|
||||
|
||||
Retailers (USA)
|
||||
[KeyHive](https://keyhive.xyz/shop/may-pad)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
16
boards/may_pad/kb.py
Normal file
16
boards/may_pad/kb.py
Normal file
@ -0,0 +1,16 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (board.D5, board.D6, board.D7, board.D8, board.D9)
|
||||
col_pins = (
|
||||
board.A1,
|
||||
board.A0,
|
||||
board.SCK,
|
||||
board.MISO,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
||||
30
boards/may_pad/main.py
Normal file
30
boards/may_pad/main.py
Normal file
@ -0,0 +1,30 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
media = MediaKeys()
|
||||
layers_ext = Layers()
|
||||
|
||||
keyboard.extensions = [media]
|
||||
keyboard.modules = [layers_ext]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.NLCK, KC.PSLS, KC.PAST, KC.PMNS,
|
||||
KC.P7, KC.P8, KC.P9, _______,
|
||||
KC.P4, KC.P5, KC.P6, KC.PPLS,
|
||||
KC.P1, KC.P2, KC.P3, _______,
|
||||
_______, KC.P0, KC.PDOT, KC.PENT,
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
17
boards/navi10/README.md
Normal file
17
boards/navi10/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Navi10 / ナビ10
|
||||
|
||||

|
||||
|
||||
A simple and fun navigation cluster macropad with exposed components.
|
||||
|
||||
kb.py is designed to work with the Adafruit KB2040
|
||||
|
||||
Retailers (USA)
|
||||
[KeyHive](https://keyhive.xyz/shop/navi10)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life
|
||||
19
boards/navi10/kb.py
Normal file
19
boards/navi10/kb.py
Normal file
@ -0,0 +1,19 @@
|
||||
import board
|
||||
import digitalio
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
led = digitalio.DigitalInOut(board.D9)
|
||||
led.direction = digitalio.Direction.OUTPUT
|
||||
led.value = False
|
||||
row_pins = (board.D10, board.MOSI, board.MISO, board.D8)
|
||||
col_pins = (
|
||||
board.D4,
|
||||
board.D7,
|
||||
board.SCK,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
||||
41
boards/navi10/main.py
Normal file
41
boards/navi10/main.py
Normal file
@ -0,0 +1,41 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
media = MediaKeys()
|
||||
layers_ext = Layers()
|
||||
|
||||
keyboard.extensions = [media]
|
||||
keyboard.modules = [layers_ext]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #Nav Keys
|
||||
KC.INSERT, KC.HOME, KC.PGUP,
|
||||
KC.DELETE, KC.END, KC.PGDOWN,
|
||||
XXXXXXX, KC.UP, XXXXXXX,
|
||||
KC.LEFT, KC.DOWN, KC.RIGHT
|
||||
],
|
||||
[ #I3
|
||||
KC.LGUI(KC.L), KC.LGUI(KC.LSHIFT(KC.UP)), KC.LGUI(KC.LSHIFT(KC.P)),
|
||||
KC.LGUI(KC.LSHIFT(KC.LEFT)), KC.LGUI(KC.LSHIFT(KC.DOWN)), KC.LGUI(KC.LSHIFT(KC.RIGHT)),
|
||||
XXXXXXX, KC.LGUI(KC.UP), XXXXXXX,
|
||||
KC.LGUI(KC.LEFT), KC.LGUI(KC.DOWN), KC.LGUI(KC.RIGHT)
|
||||
],
|
||||
[ #Media keys
|
||||
KC.MUTE, KC.MPLY, KC.MSTP,
|
||||
KC.MRWD, XXXXXXX, KC.MFFD,
|
||||
XXXXXXX, KC.VOLU, XXXXXXX,
|
||||
KC.MPRV, KC.VOLD, KC.MNXT
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
28
boards/pimoroni/README.md
Normal file
28
boards/pimoroni/README.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Pimoroni Keybow family
|
||||
|
||||
A family of macro pads based on raspberry pi hardware:
|
||||

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

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

|
||||
|
||||
"Sofle is 6×4+5 keys column-staggered split keyboard with encoder support. Based on Lily58, Corne and Helix keyboards."
|
||||
|
||||
Hardware Availability: [PCB & Case Source](https://github.com/josefadamcik/SofleKeyboard)
|
||||
|
||||
`kb.py` is designed to work with the [SparkFun Pro Micro RP2040](https://www.sparkfun.com/products/18288).
|
||||
|
||||
Retailers
|
||||
[beekeeb (Hong Kong)](https://shop.beekeeb.com/product/sofle-v2-soflekeyboard-v2-0-1-split-ergonomic-diy-mechanical-keyboard-pcb-kit/)
|
||||
[Ergomech Store (Vietnam)](https://ergomech.store/shop/product/sofle-v2-2#attr=5,23)
|
||||
|
||||
Extentions enabled by default
|
||||
- [Layers](https://github.com/KMKfw/kmk_firmware/blob/master/docs/layers.md) "Layers module adds keys for accessing other layers."
|
||||
- [Split](https://github.com/KMKfw/kmk_firmware/blob/master/docs/split_keyboards.md) Connects halves with or without wires (currently uses wires)
|
||||
- You must add the `adafruit_pioasm.mpy` to the `lib` folder on the RP2040 for this code to work. More about this is described [here](https://github.com/KMKfw/kmk_firmware/blob/master/docs/split_keyboards.md#rp2040-pio-implementation).
|
||||
- [Encoder](https://github.com/KMKfw/kmk_firmware/blob/master/docs/encoder.md) "Add twist control to your keyboard!"
|
||||
|
||||
## Notes
|
||||
|
||||
- This keymap I used the [default used by QMK for Sofle](https://github.com/qmk/qmk_firmware/blob/master/keyboards/sofle/keymaps/default/keymap.c) (I only used QWERTY, RAISE and LOWER)
|
||||
- As of 2022-04-05: Only one encoder will work at the moment. The side that is plugged in will work and the way I wrote it is designed to work with the left plugged in. If the right is plugged in the encoder will work but the encoder will work backwards.
|
||||
- It is possible that the KMK code used for the Sofle V2 could be used on the Sofle V1 or the Sofle RGB or the Sofle Choc. These would each need to be tested to see if they work.
|
||||
21
boards/sofle/sofleV2/kb.py
Normal file
21
boards/sofle/sofleV2/kb.py
Normal file
@ -0,0 +1,21 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (board.A1, board.A0, board.SCK, board.MISO, board.MOSI, board.D21)
|
||||
row_pins = (board.D5, board.D6, board.D7, board.D8, board.D9)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
encoder_pin_0 = board.A2
|
||||
encoder_pin_1 = board.A3
|
||||
# NOQA
|
||||
# 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, 53, 52, 51, 50, 49, 48,
|
||||
24, 25, 26, 27, 28, 29, 59, 58, 57, 56, 55, 54
|
||||
]
|
||||
77
boards/sofle/sofleV2/main.py
Normal file
77
boards/sofle/sofleV2/main.py
Normal file
@ -0,0 +1,77 @@
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
layers_ext = Layers()
|
||||
|
||||
split = Split(
|
||||
split_flip=True, # If both halves are the same, but flipped, set this True
|
||||
split_type=SplitType.UART, # Defaults to UART
|
||||
uart_interval=20, # Sets the uarts delay. Lower numbers draw more power
|
||||
data_pin=board.RX, # The primary data pin to talk to the secondary device with
|
||||
data_pin2=board.TX, # Second uart pin to allow 2 way communication
|
||||
use_pio=True, # allows for UART to be used with PIO
|
||||
)
|
||||
|
||||
keyboard.modules = [layers_ext, split]
|
||||
|
||||
# Cleaner key names
|
||||
XXXXXXX = KC.NO
|
||||
UNDO = KC.LCTL(KC.Z)
|
||||
CUT = KC.LCTL(KC.X)
|
||||
COPY = KC.LCTL(KC.C)
|
||||
PASTE = KC.LCTL(KC.V)
|
||||
LSTRT = KC.LCTL(KC.HOME)
|
||||
LEND = KC.LCTL(KC.END)
|
||||
BACK = KC.LALT(KC.LEFT)
|
||||
NEXT = KC.LALT(KC.RGHT)
|
||||
LBSPC = KC.LCTL(KC.BSPC)
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----#ENCODER--#ENCODER--# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.GRV,
|
||||
KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
|
||||
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.LGUI, KC.LALT, KC.LCTL, LOWER, KC.ENT, KC.MUTE, KC.MPLY, KC.SPC, RAISE, KC.RCTL, KC.RALT, KC.RGUI,
|
||||
],
|
||||
[ #LOWER
|
||||
# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----#ENCODER--#ENCODER--# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----
|
||||
XXXXXXX, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.F12,
|
||||
XXXXXXX, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.PIPE,
|
||||
XXXXXXX, KC.EQL, KC.MINS, KC.PLUS, KC.LCBR, KC.RCBR, KC.LBRC, KC.RBRC, KC.SCLN, KC.COLN, KC.BSLS, XXXXXXX,
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
],
|
||||
[ #RAISE
|
||||
# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----#ENCODER--#ENCODER--# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
XXXXXXX, KC.INS, KC.PSCR, KC.APP, XXXXXXX, XXXXXXX, KC.PGUP, BACK, KC.UP, NEXT, LBSPC, KC.BSPC,
|
||||
XXXXXXX, KC.LALT, KC.LCTL, KC.LSFT, XXXXXXX, KC.CAPS, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.DEL, KC.BSPC,
|
||||
XXXXXXX, UNDO, CUT, COPY, PASTE, XXXXXXX, XXXXXXX, LSTRT, XXXXXXX, LEND, XXXXXXX, XXXXXXX,
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
]
|
||||
]
|
||||
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = ((keyboard.encoder_pin_1, keyboard.encoder_pin_0, None, False),)
|
||||
encoder_handler.map = (
|
||||
((KC.VOLD, KC.VOLU),), # base layer
|
||||
((KC.VOLD, KC.VOLU),), # Raise
|
||||
((KC.VOLD, KC.VOLU),), # Lower
|
||||
)
|
||||
|
||||
keyboard.modules.append(encoder_handler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
@ -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
|
||||
|
||||
@ -4,8 +4,6 @@
|
||||
KMK is a keyboard focused layer that sits on top of [CircuitPython](https://circuitpython.org/). As such, it should work with most [boards that support CircuitPython](https://circuitpython.org/downloads). It is best to use the last stable version (>5.0).
|
||||
Known working and recommended devices can be found [here](Officially_Supported_Microcontrollers.md)
|
||||
|
||||
We are also providing a keyboard optimized version of CircuitPython (simplified to cope with memory limits of certain boards and with a selection of preinstalled relevant modules). If you're wondering why use KMKPython rather than barebone CircuitPython, we tried to compare both approaches [here](kmkpython_vs_circuitpython.md)
|
||||
|
||||
<br>
|
||||
|
||||
## TL;DR Quick start guide
|
||||
@ -15,11 +13,8 @@ We are also providing a keyboard optimized version of CircuitPython (simplified
|
||||
3. Unzip it and copy the KMK folder and the boot.py file at the root of the USB drive corresponding to your board (often appearing as CIRCUITPY)
|
||||
4. Create a new *code.py* or *main.py* file in the same root directory (same level as boot.py) with the example content hereunder:
|
||||
|
||||
|
||||
|
||||
***IMPORTANT:*** adapt the GP0 / GP1 pins to your specific board ! <br>
|
||||
|
||||
|
||||
```
|
||||
print("Starting")
|
||||
|
||||
@ -27,12 +22,12 @@ import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.keys import KC
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
keyboard.col_pins = (board.GP0,)
|
||||
keyboard.row_pins = (board.GP1,)
|
||||
keyboard.col_pins = (board.GP0,) # try D5 on Feather, keeboar
|
||||
keyboard.row_pins = (board.GP1,) # try D6 on Feather, keeboar
|
||||
keyboard.diode_orientation = DiodeOrientation.COL2ROW
|
||||
|
||||
keyboard.keymap = [
|
||||
@ -43,9 +38,12 @@ if __name__ == '__main__':
|
||||
keyboard.go()
|
||||
```
|
||||
|
||||
5. With a wire / paperclip / whatever, connect GPIO 0 & GPIO 1 together (or the pins you chose for your boards)
|
||||
|
||||
6. If it prints a "A" (or a "Q" or ... depending on your keyboard layout), you're done!
|
||||
5. With a wire / paperclip / whatever, connect the pins you selected for col_pin and row_pin together.
|
||||
|
||||

|
||||
|
||||
6. If it prints the letter "a" (or a "Q" or ... depending on your keyboard layout), you're done!
|
||||
|
||||
<br>
|
||||
|
||||
@ -54,8 +52,7 @@ if __name__ == '__main__':
|
||||
> This is your last chance. After this, there is no turning back. You take the blue pill—the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill—you stay in Wonderland, and I show you how deep the rabbit hole goes. Remember: all I'm offering is the truth. Nothing more.
|
||||
|
||||
### You're extremely lucky and you have a fully supported keyboard
|
||||
If your keyboard and microcontroller are officially supported, simply visit the page for your files, and dropping them on the root of the "flash drive". Those pages can be found [here](https://github.com/KMKfw/boards). You will need the `kb.py` and `main.py`. More advanced instructions can be found [here](config_and_keymap.md).
|
||||
Please note that we recommend using [KMKPython](https://github.com/KMKfw/kmkpython) for these boards as it is optimized for them. If using Circuitpython and NOT KMKPython, you will also need [boot.py](https://github.com/KMKfw/kmk_firmware/blob/master/boot.py)
|
||||
If your keyboard and microcontroller are officially supported, simply visit the page for your files, and dropping them on the root of the "flash drive". Those pages can be found [here](https://github.com/KMKfw/kmk_firmware/tree/master/boards). You will need the `kb.py` and `main.py`. More advanced instructions can be found [here](config_and_keymap.md).
|
||||
|
||||
### You've got another, maybe DIY, board and want to customise KMK for it
|
||||
First, be sure to understand how your device work, and particularly its specific matrix configuration. You can have a look [here](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) or read the [guide](https://docs.qmk.fm/#/hand_wire) provided by the QMK team for handwired keyboards
|
||||
@ -67,10 +64,10 @@ First, be sure to understand how your device work, and particularly its specific
|
||||
And to go even further:
|
||||
- [Sequences](sequences.md) are used for sending multiple keystrokes in a single action
|
||||
- [Layers](layers.md) can transform the whole way your keyboard is behaving with a single touch
|
||||
- [ModTap](modtap.md) allow you tu customize the way a key behaves wether it is tapped or hold, and [TapDance](tapdance.md) depending on the number of times it is pressed
|
||||
- [ModTap](modtap.md) allow you to customize the way a key behaves wether it is tapped or hold, and [TapDance](tapdance.md) depending on the number of times it is pressed
|
||||
|
||||
Want to have fun features such as RGB, split keyboards and more? Check out what builtin [modules](modules.md) and [extensions](extensions.md) can do!
|
||||
You can also get ideas from the various [user examples](https://github.com/KMKfw/user_keymaps) that we provide and dig into our [documentation](https://github.com/KMKfw/kmk_firmware/tree/master/docs)
|
||||
You can also get ideas from the various [user examples](https://github.com/KMKfw/kmk_firmware/tree/master/user_keymaps) that we provide and dig into our [documentation](README.md).
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
@ -13,6 +13,10 @@ Features include
|
||||
Downsides
|
||||
- $25 USD per microcontroller at most retailers
|
||||
|
||||
### Pre-compiling KMK for Nice!Nano
|
||||
Nice!Nano has limited flash memory which does not fit CircuitPython, adafruit-ble, and KMK by default. You will need to use pre-compiled KMK to get it to fit. Grab [compatible mpy-cross](https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/mpy-cross/) and run `make compile` to generate `.mpy` version of KMK files before copying them over.
|
||||
|
||||
|
||||
Common Retailers
|
||||
[Boardsource](https://boardsource.xyz/store/5f4a1733bbaa5c635b83ed67)
|
||||
[NiceKeyboards](https://nicekeyboards.com/collections/group-buy/products/nice-nano-v1-0).
|
||||
@ -57,6 +61,6 @@ Common Retailers
|
||||
|
||||
## Other microcontrollers
|
||||
What you'll need to have at minimum
|
||||
- CircuitPython/KMKpython
|
||||
- CircuitPython
|
||||
- 256KB of flash storage
|
||||
- HID over USB and/or Bluetooth.
|
||||
|
||||
53
docs/README.md
Normal file
53
docs/README.md
Normal file
@ -0,0 +1,53 @@
|
||||
# Documentation index
|
||||
|
||||
> Before you look further, you probably want to start with our [getting started guide](https://github.com/KMKfw/kmk_firmware/blob/master/docs/Getting_Started.md)
|
||||
|
||||
## Basics
|
||||
|
||||
- [Getting Started](Getting_Started.md)
|
||||
- [Bluetooth HID](ble_hid.md): Connect keyboard to PC or mobile device using BLE
|
||||
- [Configuring KMK](config_and_keymap.md)
|
||||
- [Porting to KMK](porting_to_kmk.md): Creating a `kb.py` file for a board
|
||||
- [Debugging](debugging.md)
|
||||
- [Keycodes](keycodes.md): List of all available keycodes
|
||||
- [Officially supported microcontrollers](Officially_Supported_Microcontrollers.md)
|
||||
- [Support](support.md)
|
||||
- [Contributing](contributing.md)
|
||||
|
||||
## Advanced
|
||||
|
||||
- [Flashing instructions](flashing.md)
|
||||
- [Handwiring](handwiring.md): Resources helpful when handwiring a keyboard circuit
|
||||
- [Keys](keys.md): Technical explanation of key handling
|
||||
- [Scanners](scanners.md): Setting up non-default key reading
|
||||
|
||||
## [Modules](modules.md)
|
||||
|
||||
- [Combos](combos.md): Adds chords and sequences
|
||||
- [Layers](layers.md): Adds layer support (Fn key) to allow many more keys to be put on your keyboard
|
||||
- [ModTap](modtap.md): Adds support for augmented modifier keys to act as one key when tapped, and modifier when held.
|
||||
- [Mouse keys](mouse_keys.md): Adds mouse keycodes
|
||||
- [OneShot](oneshot.md): Adds support for oneshot/sticky keys.
|
||||
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
|
||||
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!
|
||||
- [TapDance](tapdance.md): Different key actions depending on how often it is pressed.
|
||||
|
||||
### Peripherals
|
||||
|
||||
- [ADNS9800](adns9800.md): Controlling ADNS9800 optical sensor
|
||||
- [Encoder](encoder.md): Handling rotary encoders
|
||||
- [Pimoroni trackball](pimoroni_trackball.md): Handling a small I2C trackball made by Pimoroni
|
||||
|
||||
## [Extensions](extensions.md)
|
||||
|
||||
- [International](international.md): Adds international keycodes
|
||||
- [LED](led.md): Adds backlight support. This is for monocolor backlight, not RGB
|
||||
- [LockStatus](lock_status.md): Exposes host-side locks like caps or num lock.
|
||||
- [MediaKeys](media_keys.md): Adds support for media keys such as volume
|
||||
- [RGB](rgb.md): RGB lighting for underglow. Will work on most matrix RGB as will be treated the same as underglow.
|
||||
- [Status LED](extension_statusled.md): Indicates which layer you are on with an array of single leds.
|
||||
|
||||
## Language versions
|
||||
|
||||
- [Japanese getting started](ja/Getting_Started.md)
|
||||
- [Brazilian Portuguese](https://github.com/KMKfw/kmk_firmware/tree/master/docs/ptBR)
|
||||
62
docs/boot.md
Normal file
62
docs/boot.md
Normal file
@ -0,0 +1,62 @@
|
||||
# boot.py
|
||||
`boot.py` lives in the root of your keyboard when mounted as a storage device.
|
||||
There is a more detailed explanation in the [circuit python docs](https://docs.circuitpython.org/en/latest/README.html),
|
||||
however there are some common use cases for your keyboard listed here.
|
||||
|
||||
## Hiding device storage
|
||||
You can hide your device from showing up as a usb storage by default (this can be overridden
|
||||
at startup if desired, per the example code further down this page).
|
||||
|
||||
```python
|
||||
storage.disable_usb_drive()
|
||||
```
|
||||
|
||||
## Using your keyboard before the OS loads
|
||||
You can make your keyboard work in your computer's BIOS and bootloader (useful if you dual-boot).
|
||||
|
||||
```python
|
||||
usb_hid.enable(boot_device=1)
|
||||
```
|
||||
|
||||
## Disabling serial communication
|
||||
By default, you can connect to your board's serial console, which can be useful for debugging,
|
||||
but may not be desired for everyday use.
|
||||
|
||||
```python
|
||||
# Equivalent to usb_cdc.enable(console=False, data=False)
|
||||
usb_cdc.disable()
|
||||
```
|
||||
|
||||
## Example code
|
||||
Below is a fully working example, which disables usb storage, cdc and enables BIOS mode.
|
||||
|
||||
```python
|
||||
import supervisor
|
||||
import board
|
||||
import digitalio
|
||||
import storage
|
||||
import usb_cdc
|
||||
import usb_hid
|
||||
|
||||
# This is from the base kmk boot.py
|
||||
supervisor.set_next_stack_limit(4096 + 4096)
|
||||
|
||||
# If this key is held during boot, don't run the code which hides the storage and disables serial
|
||||
# To use another key just count its row and column and use those pins
|
||||
# You can also use any other pins not already used in the matrix and make a button just for accesing your storage
|
||||
col = digitalio.DigitalInOut(board.GP2)
|
||||
row = digitalio.DigitalInOut(board.GP13)
|
||||
|
||||
# TODO: If your diode orientation is ROW2COL, then make row the output and col the input
|
||||
col.switch_to_output(value=True)
|
||||
row.switch_to_input(pull=digitalio.Pull.DOWN)
|
||||
|
||||
if not row.value:
|
||||
storage.disable_usb_drive()
|
||||
# Equivalent to usb_cdc.enable(console=False, data=False)
|
||||
usb_cdc.disable()
|
||||
usb_hid.enable(boot_device=1)
|
||||
|
||||
row.deinit()
|
||||
col.deinit()
|
||||
```
|
||||
27
docs/capsword.md
Normal file
27
docs/capsword.md
Normal file
@ -0,0 +1,27 @@
|
||||
# CapsWord
|
||||
The capsword module functions similar to caps lock but will deactive automatically when its encounters a key that breaks the word or after inactivity timeout.
|
||||
By default it will not deactive capsword on numbers, alphabets, underscore, modifiers, minus, backspace and other keys like modtap, layers, etc.
|
||||
Add it to your keyboard's modules list with:
|
||||
|
||||
```python
|
||||
from kmk.modules.capsword import CapsWord
|
||||
# default inactivity timeout is 8s
|
||||
caps_word=CapsWord()
|
||||
# change inactivity timeout
|
||||
# caps_word=CapsWord(timeout=5000)
|
||||
# for no inactivity timeout
|
||||
# caps_word=CapsWord(timeout=0)
|
||||
# add additional ignored keys
|
||||
# caps_word.keys_ignored.append(KC.COMMA)
|
||||
keyboard.modules.append(caps_word)
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.CW,
|
||||
],
|
||||
]
|
||||
```
|
||||
## Keycodes
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|-----------------------|--------------------|-----------------------------------------------|
|
||||
|`KC.CW` |`KC.CAPSWORD` |Enables/disables capsword |
|
||||
21
docs/cg_swap.md
Normal file
21
docs/cg_swap.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Ctrl Gui Swap
|
||||
This module allows to swap Ctrl with Gui and vice versa. This will reset on restart to the default implementation
|
||||
|
||||
## Enabling the module
|
||||
```python
|
||||
from kmk.module.cg_swap import CgSwap
|
||||
# cg_swap disabled on startup
|
||||
cg_swap = CgSwap()
|
||||
# cg_swap enabled on startup
|
||||
# cg_swap = CgSwap(cg_swap_enable=True)
|
||||
keyboard.modules.append(cg_swap)
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.CG_SWAP, # swap ctrl and gui
|
||||
KC.CG_NORM, # unswap ctrl and gui
|
||||
KC.CG_TOGG, # toggles ctrl and gui swap
|
||||
],
|
||||
]
|
||||
```
|
||||
|
||||
45
docs/combos.md
Normal file
45
docs/combos.md
Normal file
@ -0,0 +1,45 @@
|
||||
# Combos
|
||||
Combos allow you to assign special functionality to combinations of key presses.
|
||||
The two default behaviors are:
|
||||
* Chords: match keys in random order, all pressed within 50ms.
|
||||
* Sequences: match keys in order, pressed within 1s of one another.
|
||||
|
||||
You can define combos to listen to any valid KMK key, even internal or
|
||||
functional keys, like HoldTap. When using internal KMK keys, be aware that the
|
||||
order of modules matters.
|
||||
|
||||
The result of a combo is another key being pressed/released; if the desired
|
||||
action isn't covered by KMK keys: create your own with `make_key` and attach
|
||||
corresponding handlers.
|
||||
|
||||
Combos may overlap, i.e. share match keys amongst each other.
|
||||
|
||||
The optional arguments `timeout` and `per_key_timeout` define the time window
|
||||
within which the match has to happen and wether the timeout is renewed after
|
||||
each key press, respectively. These can be customized for every combo
|
||||
individually.
|
||||
|
||||
## Keycodes
|
||||
|New Keycode |Description |
|
||||
|------------|----------------------------------------------------|
|
||||
|`KC.LEADER` | a dummy / convenience key for leader key sequences |
|
||||
|
||||
## Example Code
|
||||
```python
|
||||
from kmk.keys import KC, make_key
|
||||
from kmk.modules.combos import Combos, Chord, Sequence
|
||||
combos = Combos()
|
||||
keyboard.modules.append(combos)
|
||||
|
||||
make_key(
|
||||
names=('MYKEY',),
|
||||
on_press=lambda: print('I pressed MYKEY'),
|
||||
)
|
||||
|
||||
combos.combos = [
|
||||
Chord((KC.A, KC.B), KC.LSFT)
|
||||
Chord((KC.A, KC.B, KC.C), KC.LALT)
|
||||
Sequence((KC.LEADER, KC.A, KC.B), KC.C)
|
||||
Sequence((KC.E, KC.F) KC.MYKEY, timeout=500, per_key_timeout=False)
|
||||
]
|
||||
```
|
||||
@ -35,7 +35,7 @@ if __name__ == '__main__':
|
||||
```python
|
||||
import board
|
||||
|
||||
from kmk.matrix import DiodeOrientation
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
col_pins = (board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4)
|
||||
row_pins = (board.D10, board.D11, board.D12, board.D13, board.D9, board.D6, board.D5, board.SCL)
|
||||
|
||||
68
docs/contributing.md
Normal file
68
docs/contributing.md
Normal file
@ -0,0 +1,68 @@
|
||||
# Contributing
|
||||
KMK is a community effort and welcomes contributions of code and documentation from people
|
||||
of all backgrounds and levels of technical skill. As such, these guidelines should serve
|
||||
to make contributing as easy as possible for everyone while maintaining a consistent style.
|
||||
|
||||
## Contributing Code
|
||||
The following guidelines should ensure that any code contributed can be merged in as
|
||||
painlessly as possible. If you're unsure how to set up your development environment,
|
||||
feel free to join the chat, [#kmkfw:klar.sh on Matrix](https://matrix.to/#/#kmkfw:klar.sh).
|
||||
This channel is bridged to Discord [here](https://discord.gg/QBHUUpeGUd) for convenience.
|
||||
|
||||
### Code Style
|
||||
|
||||
KMK uses [Black](https://github.com/psf/black) with a Python 3.6 target and,
|
||||
[(controversially?)](https://github.com/psf/black/issues/594) single quotes.
|
||||
Further code styling is enforced with isort and flake8 with several plugins.
|
||||
|
||||
**NOTE:** before committing code, run `make fix-isort fix-formatting test` to
|
||||
reduce workload for the project's maintainers and prevent the CI pipeline from
|
||||
failing.
|
||||
|
||||
There are some limited exceptions to the code formatting rules, which can be
|
||||
found in `setup.cfg`, notably around `user_keymaps` (which are also not subject
|
||||
to Black formatting as documented in `pyproject.toml`)
|
||||
|
||||
### Tests
|
||||
|
||||
Unit tests within the `tests` folder mock various CicuitPython modules to allow
|
||||
them to be executed in a desktop development environment.
|
||||
|
||||
Execute tests using the command `python -m unittest`.
|
||||
|
||||
## Contriburing Documentation
|
||||
While KMK welcomes documentation from anyone with and understanding of the issues
|
||||
and a willingness to write them up, it's a good idea to familiarize yourself with
|
||||
the docs. Documentation should be informative but concise.
|
||||
|
||||
### Styling
|
||||
Docs are written and rendered in GitHub Markdown. A comprehensive guide to GitHub's
|
||||
Markdown can be found [here](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax).
|
||||
|
||||
In particular, KMK's docs should include a title, demarcated with `#`, and subheadings
|
||||
should be demarcated with `##`, `###`, and so on. Headings should be short and specific.
|
||||
|
||||
### Example Code
|
||||
Where possible, practical code examples should be included in documentation to help
|
||||
new users understand how to implement features. In general, it's better to have a code-
|
||||
block with comments inside it rather than multiple blocks of code broken up with
|
||||
explanation.
|
||||
|
||||
Code blocks should be formatted as Python code as follows:
|
||||
````
|
||||
```python
|
||||
print('Hello, world!')
|
||||
```
|
||||
````
|
||||
|
||||
Inline code, indicated with `` `backticks` ``, should be used when calling out specific
|
||||
functions or Python keywords within the body of paragraphs or in lists.
|
||||
|
||||
## 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)).
|
||||
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.
|
||||
25
docs/easypoint.md
Normal file
25
docs/easypoint.md
Normal file
@ -0,0 +1,25 @@
|
||||
# AS5013 (aka. 'EasyPoint')
|
||||
|
||||
Module handles the AM5013 Two-dimensional magnetic position sensor with digital coordinates output
|
||||
|
||||
Product page: https://www.mouser.dk/ProductDetail/ams/AS5013-IQFT?qs=abmNkq9no6D3ApA%252BrWSMNQ%3D%3D
|
||||
|
||||
### Usage
|
||||
|
||||
Declare I2C bus and add this module in your main class.
|
||||
|
||||
```python
|
||||
from kmk.modules.easypoint import Easypoint
|
||||
import busio as io
|
||||
|
||||
i2c = busio.I2C(scl=board.GP1, sda=board.GP0)
|
||||
|
||||
easypoint = Easypoint(i2c, address=0x40)
|
||||
keyboard.modules.append(easypoint)
|
||||
```
|
||||
|
||||
Further configuring the AS5013 involved x/y-offset, and deadzone.
|
||||
|
||||
```python
|
||||
easypoint = Easypoint(i2c, address=0x40, y_offset=Y_OFFSET, x_offset=X_OFFSET, dead_x=DEAD_X, dead_y=DEAD_Y)
|
||||
```
|
||||
224
docs/encoder.md
224
docs/encoder.md
@ -1,59 +1,165 @@
|
||||
# Encoder
|
||||
Add twist control to your keyboard! Volume, zoom, anything you want.
|
||||
|
||||
## Enabling the extension
|
||||
The constructor(`EncoderHandler` class) takes a minimum of 3 arguments: a list of pad_a pins, a list of pad_b pins,
|
||||
and an encoder_map. The encoder_map is modeled after the keymap and works the
|
||||
same way. It should have as many layers as your keymap, and use KC.NO keys for
|
||||
layers that you don't require any action. The encoder supports a velocity mode
|
||||
if you desire to make something for video or sound editing. The direction of
|
||||
increment/decrement can be changed to make sense for the direction the knob is
|
||||
turning by setting the is_inverted flag.
|
||||
|
||||
## Configuration
|
||||
|
||||
There is a complete example in the Atreus62 [main.py](/boards/atreus62/main.py)
|
||||
|
||||
Create the encoder_map.
|
||||
|
||||
> Anatomy of an encoder_map tuple: (increment_key, decrement_key, keys presses per encoder click)
|
||||
> `encoder_map` is a Nested List with a Tuple as the list element (`List[List[Tuple(Key,Key,Int)]]`)
|
||||
|
||||
```python
|
||||
from kmk.modules.encoder import EncoderHandler # import the Encoder module
|
||||
|
||||
Zoom_in = KC.LCTRL(KC.EQUAL)
|
||||
Zoom_out = KC.LCTRL(KC.MINUS)
|
||||
|
||||
# create the encoder map, modeled after the keymap
|
||||
encoder_map = [
|
||||
[
|
||||
# Only 1 encoder is being used, so only one tuple per layer is required
|
||||
# Increment key is volume up, decrement key is volume down, and sends 2
|
||||
# key presses for every "click" felt while turning the encoder.
|
||||
(KC.VOLU,KC.VOLD,2),
|
||||
],
|
||||
[
|
||||
# only one key press sent per encoder click
|
||||
(Zoom_in, Zoom_out,1),
|
||||
],
|
||||
[
|
||||
# No action keys sent here, the resolution is a dummy number, to be
|
||||
# removed in the future.
|
||||
(_______,_______,1),#
|
||||
]
|
||||
]
|
||||
|
||||
# create the encoder instance, and pass in a list of pad_a pins, a list of pad_b
|
||||
# pins, and the encoder map created above
|
||||
encoder_ext = EncoderHandler([board.D40],[board.D41], encoder_map)
|
||||
|
||||
# if desired, you can flip the incrfement/decrement direction of the knob by
|
||||
# setting the is_inerted flag to True. If you turn the knob to the right and
|
||||
# the volume goes down, setting this flag will make it go up. It's default
|
||||
# setting is False
|
||||
encoder_ext.encoders[0].is_inverted = True
|
||||
|
||||
# Make sure to add the encoder_ext to the modules list
|
||||
keyboard.modules = [encoder_ext]
|
||||
```
|
||||
# Encoder module
|
||||
Add twist control to your keyboard! Volume, zoom, anything you want
|
||||
|
||||
I2C encoder type has been tested with the Adafruit I2C QT Rotary Encoder with NeoPixel
|
||||
|
||||
## Enabling the extension
|
||||
The constructor(`EncoderHandler` class) takes a list of encoder, each one defined as either:
|
||||
|
||||
* a list of pad_a pin, pad_b pin, button_pin and optionnally a flag set to True is you want it to be reversed
|
||||
* a `busio.I2C`, address and optionally a flag set to True if you want it to be reversed
|
||||
|
||||
The encoder_map is modeled after the keymap and works the same way. It should have as many layers (key pressed on "turned left", key pressed on "turned right", key pressed on "knob pressed") as your keymap, and use KC.NO keys for layers that you don't require any action.
|
||||
The encoder supports a velocity mode if you desire to make something for video or sound editing.
|
||||
|
||||
|
||||
|
||||
## How to use
|
||||
How to use this module in your main / code file
|
||||
|
||||
1. load the module
|
||||
```python
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
encoder_handler = EncoderHandler()
|
||||
keyboard.modules = [layers, modtap, encoder_handler]
|
||||
```
|
||||
|
||||
2. Define the pins for each encoder (pin_a, pin_b, pin_button [or `None` if the encoder's button is handled differently or not at all], True for an inversed encoder)
|
||||
```python
|
||||
#GPIO Encoder
|
||||
encoder_handler.pins = ((board.GP17, board.GP15, board.GP14, False), (encoder 2 definition), etc. )
|
||||
```
|
||||
|
||||
OR
|
||||
|
||||
```python
|
||||
# I2C Encoder
|
||||
|
||||
# Setup i2c
|
||||
SDA = board.GP0
|
||||
SCL = board.GP1
|
||||
i2c = busio.I2C(SCL, SDA)
|
||||
|
||||
encoder_handler.pins = ((i2c, 0x36, False),)
|
||||
```
|
||||
|
||||
|
||||
3. Define the mapping of keys to be called (1 / layer)
|
||||
```python
|
||||
# You can optionally predefine combo keys as for your layout
|
||||
Zoom_in = KC.LCTRL(KC.EQUAL)
|
||||
Zoom_out = KC.LCTRL(KC.MINUS)
|
||||
|
||||
|
||||
encoder_handler.map = [(( KC.VOLD, KC.VOLU, KC.MUTE),(encoder 2 definition), etc. ), # Layer 1
|
||||
((KC.Zoom_out, KC.Zoom_in, KC.NO),(encoder 2 definition), etc. ), # Layer 2
|
||||
((KC.A, KC.Z, KC.N1),(encoder 2 definition), etc. ), # Layer 3
|
||||
((KC.NO, KC.NO, KC.NO),(encoder 2 definition), etc. ), # Layer 4
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
|
||||
4. Encoder methods on_move_do and on_button_do can be overwritten for complex use cases
|
||||
|
||||
## Full example (with 1 encoder)
|
||||
|
||||
```python
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.consts import UnicodeMode
|
||||
from kmk.keys import KC
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
layers = Layers()
|
||||
encoder_handler = EncoderHandler()
|
||||
keyboard.modules = [layers, encoder_handler]
|
||||
|
||||
|
||||
keyboard.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,
|
||||
)
|
||||
keyboard.row_pins = (board.GP28, board.GP27, board.GP22, board.GP26, board.GP21)
|
||||
keyboard.diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
# I2C example
|
||||
#import busio
|
||||
#SDA = board.GP0
|
||||
#SCL = board.GP1
|
||||
#i2c = busio.I2C(SCL, SDA)
|
||||
#encoder_handler.i2c = ((i2c, 0x36, False),)
|
||||
|
||||
encoder_handler.pins = ((board.GP17, board.GP15, board.GP14, False),)
|
||||
|
||||
keyboard.tap_time = 250
|
||||
keyboard.debug_enabled = False
|
||||
|
||||
|
||||
# Filler keys
|
||||
_______ = KC.TRNS
|
||||
xxxxxxx = KC.NO
|
||||
tbdtbd = KC.A
|
||||
|
||||
|
||||
# Layers
|
||||
LYR_STD, LYR_EXT, LYR_NUM, LYR_GAME = 0, 1, 2, 3
|
||||
|
||||
TO_STD = KC.DF(LYR_STD)
|
||||
MT_EXT = KC.MO(LYR_EXT)
|
||||
TO_NUM = KC.MO(LYR_NUM)
|
||||
TO_GAME = KC.DF(LYR_GAME)
|
||||
|
||||
|
||||
# Keymap
|
||||
|
||||
keyboard.keymap = [
|
||||
# Standard (ISO) Layer
|
||||
[
|
||||
KC.ESC , KC.N1 , KC.N2 , KC.N3 , KC.N4 , KC.N5 , KC.N6 , KC.N7 , KC.N8 , KC.N9 , KC.N0 , KC.MINS, KC.EQL , KC.BSPC,
|
||||
KC.TAB , KC.Q , KC.W , KC.E , KC.R , KC.T , KC.Y , KC.U , KC.I , KC.O , KC.P , KC.LBRC, KC.RBRC, KC.DEL ,
|
||||
xxxxxxx, KC.A , KC.S , KC.D , KC.F , KC.G , KC.H , KC.J , KC.K , KC.L , KC.SCLN, KC.QUOT, KC.NUHS, xxxxxxx,
|
||||
KC.LSFT, KC.NUBS, KC.Z , KC.X , KC.C , KC.V , KC.B , KC.N , KC.M , KC.COMM, KC.DOT , KC.SLSH, KC.UP , KC.ENT ,
|
||||
KC.LCTL, KC.LGUI, xxxxxxx, KC.LALT, MT_EXT , xxxxxxx, KC.SPC , xxxxxxx, KC.RALT, TO_NUM , KC.RSFT, KC.LEFT, KC.DOWN, KC.RGHT,
|
||||
],
|
||||
# Extra Keys Layer
|
||||
[
|
||||
TO_STD , 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.RESET,
|
||||
_______, KC.N1 , KC.N2 , KC.N3 , KC.N4 , KC.N5 , KC.N6 , KC.N7 , KC.N8 , KC.N9 , KC.N0 , KC.MINS, KC.EQL , _______,
|
||||
xxxxxxx, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, xxxxxxx,
|
||||
KC.LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC.PGUP, _______,
|
||||
KC.LCTL, KC.LGUI, xxxxxxx, KC.LALT, MT_EXT , xxxxxxx, _______, xxxxxxx, _______, TO_NUM , _______, KC.HOME, KC.PGDN, KC.END ,
|
||||
],
|
||||
# NumPad Layer
|
||||
[
|
||||
TO_STD , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.P7 , KC.P8 , KC.P9 , KC.PSLS, xxxxxxx, xxxxxxx, KC.BSPC,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.P4 , KC.P5 , KC.P6 , KC.PAST, xxxxxxx, xxxxxxx, KC.DEL ,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.LPRN, KC.P1 , KC.P2 , KC.P3 , KC.PPLS, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.RPRN, KC.P0 , KC.PDOT, _______, KC.PMNS, xxxxxxx, xxxxxxx, KC.PENT,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, MT_EXT , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, TO_NUM , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
],
|
||||
# Gaming Layer
|
||||
[
|
||||
TO_STD , 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, 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, MT_EXT , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, TO_NUM , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
],
|
||||
]
|
||||
|
||||
# Rotary Encoder (1 encoder / 1 definition per layer)
|
||||
encoder_handler.map = ( ((KC.UP, KC.DOWN, KC.MUTE),), # Standard
|
||||
((KC.VOLD, KC.VOLU, KC.MUTE),), # Extra
|
||||
((KC.A, KC.Z, KC.N1),), # NumPad not yet properly configured
|
||||
((KC.A, KC.Z, KC.N1),), # Gaming not yet properly configured
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
keyboard.go()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user