Compare commits
982 Commits
topic-slav
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
b84cd0bdab | ||
|
d15569611e | ||
|
3c4e064201 | ||
|
bc5fb9dc9e | ||
|
0992bfb962 | ||
|
f532a57e9a | ||
|
5448cb4479 | ||
|
23d7c2d670 | ||
|
20ba48b623 | ||
|
76e6feda6f | ||
|
3e13c8c321 | ||
|
ba06d3c8a5 | ||
|
26bf630608 | ||
|
878fe0deca | ||
|
adff02e88a | ||
|
55b3a3a9b1 | ||
|
3c796c16f8 | ||
|
b9c85c02e2 | ||
|
bff7584fe0 | ||
|
47fe859e11 | ||
|
fd700cff44 | ||
|
2ccad46e26 | ||
|
94c042fec5 | ||
|
013046b44d | ||
|
18687e5278 | ||
|
20be6e9072 | ||
|
e40fd90d5c | ||
|
301ce3c025 | ||
|
6532497bb2 | ||
|
deb941b196 | ||
|
88c3616b6a | ||
|
6ab4154ad5 | ||
|
db2082f1c6 | ||
|
317f6407d6 | ||
|
08c255b6e4 | ||
|
61cf527370 | ||
|
38acda77b4 | ||
|
7ef2c2c2d3 | ||
|
1f751d8374 | ||
|
d4fe745e71 | ||
|
1674ff4ed7 | ||
|
a90d569690 | ||
|
449aab7dcb | ||
|
dc9b5f4512 | ||
|
cbaddef9a6 | ||
|
804b5ec575 | ||
|
a28df47199 | ||
|
9e5d2c24e1 | ||
|
ca800331de | ||
|
1ca27dab58 | ||
|
fc8d5edd52 | ||
|
e84bbd0d75 | ||
|
69d47343e8 | ||
|
470f16c97f | ||
|
27f101d139 | ||
|
2852420ea8 | ||
|
5a38af6632 | ||
|
fa7d72b175 | ||
|
d7e9cfbc5b | ||
|
408f2f487e | ||
|
5af52addf8 | ||
|
705d3eb032 | ||
|
638d64af72 | ||
|
e7427ff53b | ||
|
62d6bf16df | ||
|
47c242a2c9 | ||
|
4d52afa086 | ||
|
1935f05ccb | ||
|
83110c5f80 | ||
|
d98dd47b1b | ||
|
3cca939e0b | ||
|
a72796e85c | ||
|
83a597bc65 | ||
|
15d3cd706b | ||
|
407de4c429 | ||
|
d8867004ff | ||
|
945072bf6c | ||
|
dd61c3705b | ||
|
a309aa52f3 | ||
|
b109cc2c4a | ||
|
3238857e1e | ||
|
7c3d2752bf | ||
|
6edd3b1d50 | ||
|
cb6c2da5cc | ||
|
99542b0493 | ||
|
7115774633 | ||
|
afd4982925 | ||
|
d51f0c4498 | ||
|
f2e4195023 | ||
|
c8f5669e4c | ||
|
e1fcfc8e46 | ||
|
8563c4737d | ||
|
472b957317 | ||
|
dc845c55a2 | ||
|
5f68881e11 | ||
|
b54083cb70 | ||
|
225087c117 | ||
|
0477b56616 | ||
|
e2681a253a | ||
|
feb5c0392c | ||
|
5032f1ee12 | ||
|
296e4a31b8 | ||
|
b9c6e5bfea | ||
|
9841d3c402 | ||
|
afd184f019 | ||
|
0ab6887fbe | ||
|
885359a8f4 | ||
|
76f33149ef | ||
|
091395691d | ||
|
178afdfeb1 | ||
|
72735e0b5d | ||
|
91565b02ba | ||
|
2af4bc9e67 | ||
|
6c7d57ca2a | ||
|
60e8f35eca | ||
|
9842035834 | ||
|
17f2961c0b | ||
|
0fbba96026 | ||
|
2f0134eed3 | ||
|
75f535c977 | ||
|
af3febc469 | ||
|
9431ce5ec1 | ||
|
03c8a61ed0 | ||
|
711114ad30 | ||
|
d965a5c3e8 | ||
|
218c15e322 | ||
|
565ec8353b | ||
|
5efd2688d7 | ||
|
91032e123f | ||
|
54a1d61a06 | ||
|
a97e655d08 | ||
|
f2fb4eecf4 | ||
|
63fd4d9574 | ||
|
002a57b3b1 | ||
|
dd488686c7 | ||
|
891cd1a67f | ||
|
ea3f59340d | ||
|
85b5aba679 | ||
|
44233bbb01 | ||
|
0909c6767d | ||
|
a21bf761ba | ||
|
01cd9d4a7c | ||
|
3ab11179e1 | ||
|
352bf25c0d | ||
|
9c85ea9b6b | ||
|
5f09ba7c0a | ||
|
0b4b98f5fb | ||
|
1cb4bddce4 | ||
|
dafc969bf5 | ||
|
a1450de137 | ||
|
f418762874 | ||
|
f9203dbb85 | ||
|
fdb07dd82b | ||
|
473d54a83f | ||
|
87955f7b5f | ||
|
194dd58d16 | ||
|
0b23f36b5d | ||
|
b3dd790f9d | ||
|
6ac68f5358 | ||
|
4b48547155 | ||
|
a91e379a79 | ||
|
a4ae43138a | ||
|
46cf7030a1 | ||
|
737973c334 | ||
|
aee793a300 | ||
|
ea94e9ba19 | ||
|
57c61ced85 | ||
|
c95efbe8ea | ||
|
e71d1fcb6e | ||
|
9d555209b8 | ||
|
f62d32157a | ||
|
b4363c73a7 | ||
|
6d6ccbc240 | ||
|
838263d409 | ||
|
bca11489d0 | ||
|
6d255a24f5 | ||
|
47601b730a | ||
|
5e7738fe87 | ||
|
5fcce6785c | ||
|
34f4264362 | ||
|
9c7b14e865 | ||
|
7f1e7a2708 | ||
|
ad3c261c1a | ||
|
0b23da551a | ||
|
ad6f4e5f05 | ||
|
23fd3a9bed | ||
|
ed38227276 | ||
|
f0544465c7 | ||
|
5d2a42d9a9 | ||
|
b676afe075 | ||
|
ce0e29b02f | ||
|
857c2c1162 | ||
|
a6825b6a3c | ||
|
6d132ba4b4 | ||
|
d9b0c9100c | ||
|
3d80e4aba8 | ||
|
4c93720a2f | ||
|
cb83df25f0 | ||
|
bfd5e2b262 | ||
|
5ba865e4c6 | ||
|
f674ac6b13 | ||
|
ecfbca82a6 | ||
|
2016848cb2 | ||
|
fbe593eb80 | ||
|
6c71538aa9 | ||
|
a1d8a990f1 | ||
|
5a85c6cfb3 | ||
|
e0ca1124fb | ||
|
2a7654f852 | ||
|
637991cedc | ||
|
606780ee1c | ||
|
fe6510baec | ||
|
74563368c5 | ||
|
3f3bd93109 | ||
|
3f826267b4 | ||
|
914f449699 | ||
|
84f1b2ae06 | ||
|
f086a78864 | ||
|
47ccd56c30 | ||
|
4d6983da11 | ||
|
d830ff7293 | ||
|
fd73292da0 | ||
|
bff8d3d7c5 | ||
|
d584b1f506 | ||
|
682731bfe1 | ||
|
ed94ad06da | ||
|
f46e3d59e6 | ||
|
25a86df5c1 | ||
|
688c2f0572 | ||
|
ca719faa29 | ||
|
c2a3a1895f | ||
|
8ab67052cf | ||
|
c49f409fb4 | ||
|
521f991f2d | ||
|
664a557483 | ||
|
50279f88fb | ||
|
82a68b0fe5 | ||
|
e064796016 | ||
|
3db84528f2 | ||
|
f33e4d1870 | ||
|
ab75b2bca3 | ||
|
81f4f7ccf0 | ||
|
103e51eb7f | ||
|
a5dc665ddc | ||
|
d8ca20c73c | ||
|
d7d253b1ea | ||
|
ec1f84f9ea | ||
|
b17c73bac0 | ||
|
0392aa74e2 | ||
|
0e58bdc343 | ||
|
9a3524d363 | ||
|
ca2aca47d6 | ||
|
00700e373c | ||
|
20705e2150 | ||
|
db395a81e4 | ||
|
9e29f4c442 | ||
|
6fe2457d8e | ||
|
2e515d25b4 | ||
|
a22e9754c1 | ||
|
f83e3361e4 | ||
|
946a8a8652 | ||
|
1293863cc0 | ||
|
ed41f4cda5 | ||
|
6e8aaff050 | ||
|
61ef788dc6 | ||
|
58248a9631 | ||
|
1bc54a10a1 | ||
|
17e63a435d | ||
|
edb5bc336e | ||
|
c4f81e3bd6 | ||
|
e478fed927 | ||
|
9e71038853 | ||
|
e72ab5a958 | ||
|
aafa0d9c6a | ||
|
ed378c960f | ||
|
178acc0702 | ||
|
36703a1e0d | ||
|
ac8a696acb | ||
|
258e622bb4 | ||
|
64d9147615 | ||
|
9e1d9aa621 | ||
|
26b629cc45 | ||
|
357165c14b | ||
|
03d5f7ae10 | ||
|
d2eba7b4ef | ||
|
bb2ddc1e33 | ||
|
e829bc83de | ||
|
b25f325871 | ||
|
7886b374b6 | ||
|
c77bfc432a | ||
|
4707b92fd4 | ||
|
c5c927acf2 | ||
|
c6bbd49d05 | ||
|
6033dc91d0 | ||
|
b55942731d | ||
|
654127bac7 | ||
|
05d1a622dd | ||
|
17a8e39bfe | ||
|
e448e09e73 | ||
|
d5dfbf456f | ||
|
aa327e4557 | ||
|
37e67c7c44 | ||
|
8db4cbbf94 | ||
|
1f8d66ce8c | ||
|
c54f4fea6c | ||
|
333913a924 | ||
|
15c5e4415e | ||
|
63d54cd9b5 | ||
|
b7de9122c2 | ||
|
d8594f49e1 | ||
|
17aac3b901 | ||
|
d7bfb917f2 | ||
|
5c8f33fc3e | ||
|
10572d71f6 | ||
|
dde6efe6fe | ||
|
f816f24497 | ||
|
8083188b9e | ||
|
9f23d9048e | ||
|
9840569dc6 | ||
|
d70de71c5f | ||
|
0f9eb196c2 | ||
|
ffcfc9835d | ||
|
6068b60cac | ||
|
614961521d | ||
|
50b8554757 | ||
|
d1f23a668c | ||
|
b6a782e83c | ||
|
91f494846a | ||
|
8d7ae8b284 | ||
|
561896769c | ||
|
5bf33056bf | ||
|
f44c1a8c20 | ||
|
a58293600d | ||
|
9a1fc95f54 | ||
|
80660e4336 | ||
|
4b0e459d62 | ||
|
90c4ce99f3 | ||
|
f21fa5edb7 | ||
|
3ee701e986 | ||
|
80b44b5c1b | ||
|
35b1a5843f | ||
|
400042f799 | ||
|
229b7afcb0 | ||
|
8460c5abfe | ||
|
093d0329e6 | ||
|
b04b740f9a | ||
|
d6659cd1a3 | ||
|
645124dab6 | ||
|
55df583396 | ||
|
ff3f7234d4 | ||
|
b91974bce2 | ||
|
08d3386643 | ||
|
4a29530ad5 | ||
|
1771b76b19 | ||
|
b6146365b3 | ||
|
32f5520ec6 | ||
|
e4db502b9b | ||
|
fb1a51abdc | ||
|
4c1ee62273 | ||
|
c00e769868 | ||
|
ef04cdc07c | ||
|
9e3b9f6229 | ||
|
b57d672bc5 | ||
|
11e042c098 | ||
|
401ba51ba5 | ||
|
42221f4a28 | ||
|
d895da5a6a | ||
|
fb931ab2d3 | ||
|
d95b4344dd | ||
|
dade827c76 | ||
|
72d6fb9304 | ||
|
eb23ed0020 | ||
|
73e17d780a | ||
|
da0e987b68 | ||
|
0e051a904b | ||
|
8d0b835c9c | ||
|
a6e5ee1c08 | ||
|
9a211f091a | ||
|
55b06bba79 | ||
|
2de044469f | ||
|
664af4d4f2 | ||
|
719cef4945 | ||
|
9b34fcd7ef | ||
|
6970a6c786 | ||
|
7e760a2917 | ||
|
ad43377a5e | ||
|
44d27ef09a | ||
|
86e3b138b2 | ||
|
caab7a4a15 | ||
|
6ef20ee042 | ||
|
09583aa7f7 | ||
|
c183bebb58 | ||
|
bea0f6d75b | ||
|
12e7a1b42c | ||
|
73e95bfdde | ||
|
842537064f | ||
|
9f964aba36 | ||
|
a4d6a44a04 | ||
|
b97fca7c76 | ||
|
0f22ce071b | ||
|
14fb78c191 | ||
|
5dc1013d00 | ||
|
5f5c04b9c7 | ||
|
9898a1ed73 | ||
|
d0c60a7694 | ||
|
f119678ec7 | ||
|
8208194842 | ||
|
003bb7d96a | ||
|
f632aaddc3 | ||
|
809a62b64d | ||
|
34a7d47e49 | ||
|
52b0ff5ca1 | ||
|
9b1976ec3e | ||
|
8d066e578d | ||
|
f12a7e9e9d | ||
|
1040221762 | ||
|
239b09d94d | ||
|
256c0f1c55 | ||
|
51f07d8558 | ||
|
7af0e11f75 | ||
|
385263e0e6 | ||
|
00a484fa61 | ||
|
0751f6ca5f | ||
|
29abba63e7 | ||
|
f2b8c7106e | ||
|
30252099cd | ||
|
6c2d64843b | ||
|
609e275c03 | ||
|
660b751c87 | ||
|
a0efbb92d5 | ||
|
1b902b907c | ||
|
bce7959f66 | ||
|
bd87b278b8 | ||
|
62ff7c838d | ||
|
4419f13f1c | ||
|
8950e45325 | ||
|
7d46e701aa | ||
|
bb8dec907a | ||
|
bdc2bbb3cf | ||
|
6a7f5e285e | ||
|
5eeb88e2b7 | ||
|
88cbbc6a90 | ||
|
49b83305d9 | ||
|
e67a1a8cd7 | ||
|
da239e535e | ||
|
9e171abc69 | ||
|
9733c43d2a | ||
|
dfa73a8cca | ||
|
1985712637 | ||
|
09d0287800 | ||
|
c7eaeaf90c | ||
|
fb5ecf7e38 | ||
|
642790b2e7 | ||
|
e04a01c25e | ||
|
62013f1770 | ||
|
27a0bc1977 | ||
|
7a51ce576f | ||
|
651e203cb7 | ||
|
4d297e6ab2 | ||
|
1700aff408 | ||
|
63973e4a6e | ||
|
f7dac9e96e | ||
|
7ff77b97bb | ||
|
c7490087b6 | ||
|
a210c2bf62 | ||
|
c8df1d10ad | ||
|
d2e87b3e70 | ||
|
b3ec37e274 | ||
|
ec8e167996 | ||
|
175f0c6a97 | ||
|
e395e89864 | ||
|
8ac497d99b | ||
|
c880c02ad5 | ||
|
89351fc203 | ||
|
4b03ba846a | ||
|
87d1b0c6b9 | ||
|
be308d516f | ||
|
c950785385 | ||
|
74fa1fb52e | ||
|
7431192e95 | ||
|
142a15e175 | ||
|
0cb69651c8 | ||
|
6002ad33e1 | ||
|
3f0283422d | ||
|
cca5b91be2 | ||
|
f1d229c7ff | ||
|
08df52e90d | ||
|
529e6101ab | ||
|
ca773d0633 | ||
|
cc82433f74 | ||
|
7b92596937 | ||
|
e5f89963cf | ||
|
cc70c8f4a8 | ||
|
2a53bd8b64 | ||
|
07a485b04d | ||
|
d4e72b98c9 | ||
|
ea19f5bb30 | ||
|
24d0587ac6 | ||
|
d12f9a18f1 | ||
|
1a7d1d53f6 | ||
|
9539f2dc74 | ||
|
3687212ed7 | ||
|
d47143463b | ||
|
55a75cb9b3 | ||
|
9684e0d5f7 | ||
|
4f7f3dcc3c | ||
|
1863543428 | ||
|
58ea87dcc2 | ||
|
2a560cf3f3 | ||
|
275e61832f | ||
|
b2c7da2058 | ||
|
dc171360f6 | ||
|
32bafcdc46 | ||
|
5c33fd3a9f | ||
|
a8e7f43e59 | ||
|
c46d18ecb7 | ||
|
603833dbb7 | ||
|
2d005048cc | ||
|
cbaf995e33 | ||
|
3442a21835 | ||
|
4d1f9e487e | ||
|
e52af4f58a | ||
|
de1d602b25 | ||
|
e2f2c228d1 | ||
|
8dbbc42496 | ||
|
067b7d2e5f | ||
|
201d127348 | ||
|
c11fffea2c | ||
|
b3c8245365 | ||
|
9f2142d706 | ||
|
54ae022846 | ||
|
2008e0ab3f | ||
|
8cec85e3ec | ||
|
b7e3e4ea8c | ||
|
d54fff883d | ||
|
aae476b59f | ||
|
2fce09986e | ||
|
ef7b29bd43 | ||
|
ab7e0d3eb6 | ||
|
d26d397f10 | ||
|
ecc8b46a2c | ||
|
fd30b7a8d8 | ||
|
57ba0fe8b2 | ||
|
e7d306cf30 | ||
|
2d4db12c46 | ||
|
fb783c302c | ||
|
2096f1a950 | ||
|
a34272dd18 | ||
|
7f5ea97bba | ||
|
7f7eaafbf3 | ||
|
8e4ab1d733 | ||
|
0e029ebf72 | ||
|
f02ff1463a | ||
|
3c4e74d50e | ||
|
ba7b5ce15c | ||
|
671aa60838 | ||
|
dc4fc646aa | ||
|
6840330f50 | ||
|
da3e87ee2d | ||
|
7519a97eaa | ||
|
083f2e143d | ||
|
8c0f8ccbc3 | ||
|
fdf8e9f78c | ||
|
f4807f341e | ||
|
ee4cce32cb | ||
|
eb3a7bbf1e | ||
|
481c69b212 | ||
|
1c6b25517a | ||
|
a685618480 | ||
|
5cae17c9f3 | ||
|
7573556f33 | ||
|
f30206c7d5 | ||
|
21c058aaa8 | ||
|
0f7afe5b2c | ||
|
119ab3d80a | ||
|
7fba42f28c | ||
|
827862b34b | ||
|
f2aabd87cd | ||
|
91562abde9 | ||
|
65f48b53a4 | ||
|
cd4ba26e95 | ||
|
967046587b | ||
|
4a83e6de85 | ||
|
9e8b8376c5 | ||
|
aa01da7e1d | ||
|
1387cb2660 | ||
|
fa0062326b | ||
|
be2bbce21a | ||
|
1c82f7d387 | ||
|
9f373b4be0 | ||
|
2874d49d20 | ||
|
6ecb7807c2 | ||
|
99a9c6fd80 | ||
|
25fd205c3e | ||
|
a627102b52 | ||
|
3e3255ffea | ||
|
55a6636741 | ||
|
46152ae8d9 | ||
|
7fbda871c2 | ||
|
c09cd48218 | ||
|
bff1bdf6d9 | ||
|
f90de872d8 | ||
|
b6201d43d4 | ||
|
e70ce5f431 | ||
|
328a29c439 | ||
|
0bebdd6d27 | ||
|
af55acd584 | ||
|
245f7912b6 | ||
|
8419ed789c | ||
|
a62d39a252 | ||
|
10f8c74ad9 | ||
|
ef3d38f8ec | ||
|
61de548acb | ||
|
2527542379 | ||
|
14fd494cd4 | ||
|
c37170da56 | ||
|
3258e76ba4 | ||
|
7f207062e9 | ||
|
410cf7af07 | ||
|
8063898eb2 | ||
|
5fcd31b97c | ||
|
e1300ba767 | ||
|
a8b2bf75ad | ||
|
a7a560bbca | ||
|
dc364a77fb | ||
|
5073a29501 | ||
|
11ff03523b | ||
|
f7c0bd962b | ||
|
08b41fda69 | ||
|
797cdfe38a | ||
|
841f990481 | ||
|
85fe8fef12 | ||
|
f9dd03f207 | ||
|
9aa3a21900 | ||
|
899b95e586 | ||
|
0a81876eae | ||
|
1aa4db1dd3 | ||
|
235560bf72 | ||
|
72943a8fe1 | ||
|
9dbecbcb86 | ||
|
a2e26055a6 | ||
|
d8445c1262 | ||
|
3bbadece8d | ||
|
27104cc28d | ||
|
b2dae8175e | ||
|
b3d4ffde0a | ||
|
2da3b1f5f4 | ||
|
14c1cacf02 | ||
|
997f4651ee | ||
|
8d01908468 | ||
|
e92e122588 | ||
|
09dd2be1bc | ||
|
634d53b987 | ||
|
aa95412a0e | ||
|
b4fd94e911 | ||
|
7ce2827da7 | ||
|
0b43a3de38 | ||
|
7427531494 | ||
|
4a8b95ce93 | ||
|
6fce4c996c | ||
|
3e91f63c88 | ||
|
5aa123b550 | ||
|
4165e25ff5 | ||
|
997ddfc119 | ||
|
5f1b9d2b14 | ||
|
f381761507 | ||
|
4c73be5236 | ||
|
dffaec9f03 | ||
|
6c13c97e83 | ||
|
74186f20a1 | ||
|
b2db921a5b | ||
|
ed68ddb79d | ||
|
d9fb351448 | ||
|
0f6e183235 | ||
|
484bcc4d22 | ||
|
7993a4e415 | ||
|
2384550af4 | ||
|
1222477866 | ||
|
a6606c6957 | ||
|
dea2abb81a | ||
|
2d3b2e95c6 | ||
|
5572fabf8d | ||
|
6357141165 | ||
|
edfd127148 | ||
|
04b720da5b | ||
|
d2b34097f2 | ||
|
0bc6fe0c97 | ||
|
d114a28f9e | ||
|
6a38b3cb0a | ||
|
e3c1c86a0b | ||
|
0d27901b0d | ||
|
45e4356630 | ||
|
3069608e56 | ||
|
48ab6767e4 | ||
|
fb34038911 | ||
|
dac457d94c | ||
|
fc69245c57 | ||
|
7586df8de9 | ||
|
b8fd60e866 | ||
|
8167e0bc72 | ||
|
e5d7333e2e | ||
|
0a2f62a90b | ||
|
8650a6ea7c | ||
|
199ec1d914 | ||
|
abaafbd8c5 | ||
|
99577357f6 | ||
|
209acc94b2 | ||
|
4e938ef6b6 | ||
|
8a15378733 | ||
|
1a5e7fa54b | ||
|
9c46eaeb9c | ||
|
7b1d3f17c4 | ||
|
8199854b5e | ||
|
3bc038d0d8 | ||
|
0a61cbd4af | ||
|
5cd34bcfea | ||
|
a894d8d140 | ||
|
113e8eb867 | ||
|
0e528435a3 | ||
|
f36a18513b | ||
|
3ad2a00dc9 | ||
|
3c9c527a96 | ||
|
731f1b1030 | ||
|
27cf8e7d4d | ||
|
1ba8ea3728 | ||
|
e821acfca1 | ||
|
3d6e4fde41 | ||
|
584eee64c6 | ||
|
ea9625106c | ||
|
b287b2112c | ||
|
7601a6f21f | ||
|
d3b315d059 | ||
|
88e3fe45d4 | ||
|
09e26ae3a3 | ||
|
e77a0af23c | ||
|
02a9a088a0 | ||
|
aa55153a8e | ||
|
7991dc4609 | ||
|
dbe6e105e2 | ||
|
c9184477fb | ||
|
25015e54ca | ||
|
8ee368cfe4 | ||
|
2e75a89581 | ||
|
137df5a46c | ||
|
9a2918d85c | ||
|
bd31af0e14 | ||
|
c62b2e94f7 | ||
|
c023f368ba | ||
|
8d16cac06d | ||
|
b11fce321f | ||
|
d21aa772a7 | ||
|
9ad8233104 | ||
|
2b59ed7aec | ||
|
2c6ec8c5da | ||
|
ceb9f69a38 | ||
|
46206dabbf | ||
|
73b8542665 | ||
|
fd097c3924 | ||
|
586d1deb4e | ||
|
796b7733f5 | ||
|
9eb86d2069 | ||
|
a08ed5dc25 | ||
|
7e477e1aa8 | ||
|
3be9f9b9ad | ||
|
e0786e6118 | ||
|
9340579031 | ||
|
d43c712301 | ||
|
c75b52f94b | ||
|
3525a5f1a5 | ||
|
10a1447adc | ||
|
24a4a4da11 | ||
|
9aaebbcf54 | ||
|
081590f85d | ||
|
2db4682264 | ||
|
f256c49727 | ||
|
0247de4988 | ||
|
4139c97b22 | ||
|
917afe5f57 | ||
|
9e731bce1e | ||
|
3f10abc6fd | ||
|
4eba21a2fd | ||
|
15918db7ac | ||
|
eb5756f530 | ||
|
cd3e10ba13 | ||
|
083e4a701a | ||
|
ab6aa1838c | ||
|
270be1fa28 | ||
|
76e7ee4027 | ||
|
7310bdd780 | ||
|
a77fee7f04 | ||
|
e208dd64f3 | ||
|
7a30cc8cce | ||
|
1a348f1539 | ||
|
f79e508566 | ||
|
7400f43cf8 | ||
|
ece6441230 | ||
|
eb41d704b0 | ||
|
aeee945728 | ||
|
6f8eb425b1 | ||
|
6d5b99d78d | ||
|
66788c29ca | ||
|
33408dc228 | ||
|
581d8e269b | ||
|
9b5e35a5a8 | ||
|
ee7094e799 | ||
|
e72d2b8c34 | ||
|
9821f7bcc3 | ||
|
ea327f8f76 | ||
|
54f4644b5c | ||
|
3797797b43 | ||
|
6bfd5682f9 | ||
|
f1bce8fdbd | ||
|
01daa7a07e | ||
|
bf551a6de0 | ||
|
2d74fe7cb3 | ||
|
b8cb4bda98 | ||
|
8bb7c1f555 | ||
|
4afac426f0 | ||
|
4c06d8b626 | ||
|
015e0cdfd7 | ||
|
1b730cacf3 | ||
|
dc598ad439 | ||
|
ec16270006 | ||
|
1016dc552c | ||
|
5f4785f0ad | ||
|
6ed5d04af5 | ||
|
80d95816e4 | ||
|
1a4e81a2e5 | ||
|
6e10babfbe | ||
|
026308bbeb | ||
|
945fcca7b0 | ||
|
f3067099b2 | ||
|
a6d36d57a7 | ||
|
7bd2bdb35f | ||
|
69f7c3c8c2 | ||
|
7f1514e8de | ||
|
173ae842ca | ||
|
c4d057685b | ||
|
29373e9a37 | ||
|
e225d8b1d6 | ||
|
fba97fc364 | ||
|
73b7464ec1 | ||
|
b65a94972c | ||
|
d79a2c943c | ||
|
2cf64d8ce7 | ||
|
e5700eeb5f | ||
|
18eeb4eadc | ||
|
6844654d39 | ||
|
4d46653526 | ||
|
b082f26d9e | ||
|
ac9f4927c9 | ||
|
81c6b0ca5d | ||
|
d47665df50 | ||
|
ee83a32e87 | ||
|
5096bb7e30 | ||
|
2197dab6fa | ||
|
1bd84e49aa | ||
|
9fc4159c9a | ||
|
2244c95db6 | ||
|
b1c180ce78 | ||
|
afd924c8c4 | ||
|
7c81e01505 | ||
|
bec742bbf5 | ||
|
5ef37864de | ||
|
80004bb65f | ||
|
ed452084fe | ||
|
0ed40d3cef | ||
|
666c0a4f08 | ||
|
b03ae32e7d | ||
|
5da4555669 | ||
|
6baaf5e5d4 | ||
|
eb566b0f71 | ||
|
8c57844a22 | ||
|
86c8e006e0 | ||
|
17ba405bcc | ||
|
45cadc7e5a | ||
|
11a4604f88 | ||
|
38e8102532 | ||
|
02401e2ec0 | ||
|
1eaf0e2c79 | ||
|
ef1c69aa2c | ||
|
4bdf926360 | ||
|
6b73a5ec56 | ||
|
5a43bc291d | ||
|
64267bdc5b | ||
|
aaeaa74a0c | ||
|
5c0c13e8d0 | ||
|
8100b91dbc | ||
|
614883ef80 | ||
|
7197f7a3a4 | ||
|
5771a89433 | ||
|
55b07f330c | ||
|
39220beddb | ||
|
39e3a65955 | ||
|
cd7d8a2e4c | ||
|
8f5511327e | ||
|
ffe3fa3c64 | ||
|
a51d11f6e6 | ||
|
5c8bd45615 | ||
|
d0d1608350 | ||
|
ea62d08d2c | ||
|
1e9625ae0e | ||
|
e8c3b5ac70 | ||
|
b3e9a14e71 | ||
|
3b6286b480 | ||
|
3a1ce093ee | ||
|
6f3273a6f8 | ||
|
fc51f84045 | ||
|
241cf69979 | ||
|
ef09454d2e | ||
|
d15aa65cc6 | ||
|
056efa8ca5 | ||
|
004f40e7d2 | ||
|
b6af43ef90 | ||
|
c11984135a | ||
|
76087749fb | ||
|
d07560513f | ||
|
d34e8ce9d2 | ||
|
f6a39acd26 | ||
|
350c2438ad | ||
|
17094a2988 | ||
|
2947f81489 | ||
|
1fe80fec92 | ||
|
edcb681169 | ||
|
5b069a0104 | ||
|
7bff667a2b | ||
|
c16e2c51aa | ||
|
5532ffdcbf | ||
|
39b0b1e7f2 | ||
|
5158094549 | ||
|
3f8c6e7648 | ||
|
9d8682c866 | ||
|
86b8c4ffb0 | ||
|
bb198709f2 | ||
|
fa28b3afba | ||
|
efb642c374 | ||
|
1a06e0ed72 | ||
|
7ebf8d623f | ||
|
ec1a62e52d | ||
|
0a06e733d2 | ||
|
e2413a3c25 | ||
|
a882ef2c38 | ||
|
373ca8355e | ||
|
54d63037bf | ||
|
f7a1d54752 | ||
|
7ebfaa3bf7 | ||
|
f65ea1e841 | ||
|
5c8c2e97fd | ||
|
3ae7432de0 | ||
|
9fbad17ed4 | ||
|
1751cce299 | ||
|
ad3430eeb6 | ||
|
5334e7e0be | ||
|
2ad1fe8a9c | ||
|
31983a0873 | ||
|
0ba5911f8f | ||
|
7a58ac041f | ||
|
4b033857b1 | ||
|
e332804dc9 | ||
|
dabed0061d | ||
|
fa0421c5b9 | ||
|
c3ffb7b1ac | ||
|
9bb82d009c | ||
|
41dc58e428 | ||
|
0b364cf7f1 | ||
|
d70c2ccc17 | ||
|
7fcd36f2fb | ||
|
cf5ee5d4b2 | ||
|
7297bc4521 | ||
|
85ba57f9b0 | ||
|
9dce78370e | ||
|
f073b7568b | ||
|
f9b56d82f7 | ||
|
9c4a136989 | ||
|
b494857f21 | ||
|
0016ac8aa3 | ||
|
8bb55c84cd | ||
|
7e06b143e1 | ||
|
298f9489c2 | ||
|
a2cfa92f2f | ||
|
e792524b63 | ||
|
fc8ddba6cb |
@ -1,28 +0,0 @@
|
||||
version: 2
|
||||
jobs:
|
||||
test:
|
||||
docker:
|
||||
- image: 'kmkfw/base'
|
||||
|
||||
environment:
|
||||
KMK_TEST: 1
|
||||
PIPENV_VENV_IN_PROJECT: 1
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v2-kmk-venv-{{ checksum "Pipfile.lock" }}
|
||||
|
||||
- run: make test
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
build-deploy:
|
||||
jobs:
|
||||
- test:
|
||||
filters:
|
||||
branches:
|
||||
only: /.*/
|
||||
tags:
|
||||
only: /.*/
|
27
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
27
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[BUG] Title"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
* Setup and configuration of the affected parts of the firmware (avoid copy-pasting the entire configuration if possible)
|
||||
* Setup and configuration of peripherals
|
||||
* Input: keys pressed, ...
|
||||
(Choose which are applicable.)
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Debug output**
|
||||
If applicable, add debug output from the serial console to help explain your problem.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[Enhancement] Title"
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
16
.github/workflows/test.yml
vendored
Normal file
16
.github/workflows/test.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
# This is a basic workflow to help you get started with Actions
|
||||
|
||||
name: Test
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.9' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
- run: python -m pip install --upgrade pipenv wheel
|
||||
- run: make test
|
89
.gitignore
vendored
89
.gitignore
vendored
@ -1,3 +1,25 @@
|
||||
# KMK Specific
|
||||
.compiled/
|
||||
.ampy
|
||||
.submodules
|
||||
.circuitpy-deps
|
||||
.micropython-deps
|
||||
.devdeps
|
||||
.docker_base
|
||||
.dist
|
||||
|
||||
# Personal dev scripts
|
||||
.scripts
|
||||
|
||||
# Mountpoints
|
||||
mnt/
|
||||
mnt2/
|
||||
|
||||
# VSCode
|
||||
.vscode/
|
||||
|
||||
# Everything below is from https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
@ -20,6 +42,7 @@ parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
@ -38,14 +61,17 @@ pip-delete-this-directory.txt
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
@ -55,6 +81,7 @@ coverage.xml
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
@ -67,16 +94,47 @@ instance/
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/#use-with-ide
|
||||
#.pdm.toml
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
@ -102,16 +160,25 @@ venv.bak/
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.compiled/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
.ampy
|
||||
.submodules
|
||||
.circuitpy-deps
|
||||
.micropython-deps
|
||||
.devdeps
|
||||
.docker_base
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# Pycharms cruft
|
||||
.idea
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Personal dev scripts
|
||||
.scripts
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
.idea/
|
||||
|
||||
# Mac Finder
|
||||
.DS_Store
|
||||
|
81
.s3cfg
Normal file
81
.s3cfg
Normal file
@ -0,0 +1,81 @@
|
||||
[default]
|
||||
access_key =
|
||||
access_token =
|
||||
add_encoding_exts =
|
||||
add_headers =
|
||||
bucket_location = US
|
||||
ca_certs_file =
|
||||
cache_file =
|
||||
check_ssl_certificate = True
|
||||
check_ssl_hostname = True
|
||||
cloudfront_host = cloudfront.amazonaws.com
|
||||
content_disposition =
|
||||
content_type =
|
||||
default_mime_type = binary/octet-stream
|
||||
delay_updates = False
|
||||
delete_after = False
|
||||
delete_after_fetch = False
|
||||
delete_removed = False
|
||||
dry_run = False
|
||||
enable_multipart = True
|
||||
encoding = UTF-8
|
||||
encrypt = False
|
||||
expiry_date =
|
||||
expiry_days =
|
||||
expiry_prefix =
|
||||
follow_symlinks = False
|
||||
force = False
|
||||
get_continue = False
|
||||
gpg_command = /usr/bin/gpg
|
||||
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
|
||||
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
|
||||
gpg_passphrase =
|
||||
guess_mime_type = True
|
||||
host_base = sfo2.digitaloceanspaces.com
|
||||
host_bucket = %(bucket)s.sfo2.digitaloceanspaces.com
|
||||
human_readable_sizes = False
|
||||
invalidate_default_index_on_cf = False
|
||||
invalidate_default_index_root_on_cf = True
|
||||
invalidate_on_cf = False
|
||||
kms_key =
|
||||
limit = -1
|
||||
limitrate = 0
|
||||
list_md5 = False
|
||||
log_target_prefix =
|
||||
long_listing = False
|
||||
max_delete = -1
|
||||
mime_type =
|
||||
multipart_chunk_size_mb = 15
|
||||
multipart_max_chunks = 10000
|
||||
preserve_attrs = True
|
||||
progress_meter = True
|
||||
proxy_host =
|
||||
proxy_port = 0
|
||||
put_continue = False
|
||||
recursive = False
|
||||
recv_chunk = 65536
|
||||
reduced_redundancy = False
|
||||
requester_pays = False
|
||||
restore_days = 1
|
||||
restore_priority = Standard
|
||||
secret_key =
|
||||
send_chunk = 65536
|
||||
server_side_encryption = False
|
||||
signature_v2 = False
|
||||
signurl_use_https = False
|
||||
simpledb_host = sdb.amazonaws.com
|
||||
skip_existing = False
|
||||
socket_timeout = 300
|
||||
stats = False
|
||||
stop_on_error = False
|
||||
storage_class =
|
||||
throttle_max = 100
|
||||
upload_id =
|
||||
urlencoding_mode = normal
|
||||
use_http_expect = False
|
||||
use_https = True
|
||||
use_mime_magic = True
|
||||
verbosity = WARNING
|
||||
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
|
||||
website_error =
|
||||
website_index = index.html
|
39
Dockerfile
Normal file
39
Dockerfile
Normal file
@ -0,0 +1,39 @@
|
||||
FROM python:3.9-slim-buster
|
||||
|
||||
ARG KMKPY_REF
|
||||
ARG KMKPY_URL
|
||||
|
||||
ENV KMKPY_REF ${KMKPY_REF}
|
||||
ENV KMKPY_URL ${KMKPY_URL}
|
||||
|
||||
RUN mkdir -p /app /dist
|
||||
WORKDIR /app
|
||||
|
||||
RUN apt-get update && apt-get install -y build-essential curl gettext git git-lfs rsync wget zip lbzip2
|
||||
RUN pip install pipenv
|
||||
|
||||
# Pull CircuitPython-designated ARM GCC to avoid mismatches/weird
|
||||
# inconsistencies with upstream
|
||||
RUN curl -L -o /tmp/gcc-arm.tar.bz2 https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2 && \
|
||||
tar -C /usr --strip-components=1 -xaf /tmp/gcc-arm.tar.bz2 && \
|
||||
rm -rf /tmp/gcc-arm.tar.bz2
|
||||
|
||||
# Get a local copy of KMKPython and its dependencies. We don't provide MPY
|
||||
# builds for kmkpython anymore, so we can get away with being opinionated
|
||||
# here.
|
||||
RUN git init /opt/kmkpython && \
|
||||
git -C /opt/kmkpython remote add origin ${KMKPY_URL} && \
|
||||
git -C /opt/kmkpython fetch --depth 1 origin ${KMKPY_REF} && \
|
||||
git -C /opt/kmkpython checkout FETCH_HEAD && \
|
||||
git -C /opt/kmkpython submodule update --init --recursive
|
||||
|
||||
# Build the MPY compiler
|
||||
RUN make -C /opt/kmkpython/mpy-cross
|
||||
|
||||
ENV PATH=/opt/kmkpython/mpy-cross:${PATH}
|
||||
|
||||
RUN mkdir -p /opt/kmkpython/frozen/kmk/kmk
|
||||
COPY ./build_kmkpython_release.sh /app/
|
||||
COPY ./kmk /opt/kmkpython/frozen/kmk/kmk
|
||||
|
||||
CMD /app/build_kmkpython_release.sh
|
@ -1,21 +0,0 @@
|
||||
# vim: ft=dockerfile
|
||||
|
||||
# Not using python:3.7 here because team-gcc-arm-embedded/ppa does not support
|
||||
# Ubuntu Cosmic or Debian Stretch, and Alpine, bizarrely, does not seem to
|
||||
# package GCC cross compilers
|
||||
FROM ubuntu:bionic
|
||||
|
||||
# Set up PPAs we'll need for Python and for GCC ARM
|
||||
RUN apt-get update && apt-get install -y software-properties-common
|
||||
RUN add-apt-repository ppa:deadsnakes/ppa
|
||||
RUN add-apt-repository ppa:team-gcc-arm-embedded/ppa
|
||||
|
||||
# Install Python
|
||||
RUN apt-get update && apt-get install -y python3.7 python3.7-dev build-essential pkg-config libffi-dev curl
|
||||
RUN curl https://bootstrap.pypa.io/get-pip.py | python3.7
|
||||
# Downgrade pip to work around https://github.com/pypa/pipenv/issues/2924
|
||||
RUN python3.7 -m pip install pip==18.0
|
||||
RUN python3.7 -m pip install pipenv==2018.7.1
|
||||
|
||||
# Install KMK CI and/or build-time dependencies
|
||||
RUN apt-get install -y gcc-arm-embedded gettext ssh wget unzip rsync git locales libusb-dev
|
141
Makefile
141
Makefile
@ -1,61 +1,98 @@
|
||||
.SILENT:
|
||||
|
||||
.PHONY: \
|
||||
clean-dist \
|
||||
devdeps \
|
||||
dist \
|
||||
dockerbase \
|
||||
lint
|
||||
|
||||
.DEFAULT: all
|
||||
|
||||
DIST_DESCRIBE_CMD = git describe --always --abbrev=0 --dirty --broken
|
||||
|
||||
DOCKER_BASE_TAG ?= latest
|
||||
DOCKER_TAG ?= latest
|
||||
|
||||
AMPY_PORT ?= /dev/ttyUSB0
|
||||
AMPY_BAUD ?= 115200
|
||||
AMPY_DELAY ?= 1.5
|
||||
ARDUINO ?= /usr/share/arduino
|
||||
PIPENV ?= $(shell which pipenv)
|
||||
PIPENV ?= $(shell which pipenv 2>/dev/null)
|
||||
|
||||
all: copy-kmk copy-bootpy copy-keymap
|
||||
MPY_CROSS ?= $(shell which mpy-cross 2>/dev/null)
|
||||
MPY_FLAGS ?= '-O2'
|
||||
MPY_SOURCES ?= 'kmk/'
|
||||
MPY_TARGET_DIR ?= .compiled
|
||||
PY_KMK_TREE = $(shell find $(MPY_SOURCES) -name "*.py")
|
||||
DIST_DESCRIBE = $(shell $(DIST_DESCRIBE_CMD))
|
||||
|
||||
.docker_base: Dockerfile_base
|
||||
@echo "===> Building Docker base image kmkfw/base:${DOCKER_BASE_TAG}"
|
||||
@docker build -f Dockerfile_base -t kmkfw/base:${DOCKER_BASE_TAG} .
|
||||
@touch .docker_base
|
||||
TIMESTAMP := $(shell date +%s)
|
||||
|
||||
docker-base: .docker_base
|
||||
all: copy-kmk copy-bootpy copy-keymap copy-board
|
||||
|
||||
docker-base-deploy: docker-base
|
||||
@echo "===> Pushing Docker base image kmkfw/base:${DOCKER_BASE_TAG} to Docker Hub"
|
||||
@docker push kmkfw/base:${DOCKER_BASE_TAG}
|
||||
.PHONY: compile compile-check
|
||||
compile: compile-check
|
||||
ifeq ($(MPY_CROSS),)
|
||||
compile-check:
|
||||
@echo "===> Could not find mpy-cross in PATH, exiting"
|
||||
@false
|
||||
else
|
||||
compile-check: $(PY_KMK_TREE:%.py=$(MPY_TARGET_DIR)/%.mpy)
|
||||
@echo "===> Compiling all py files to mpy with flags $(MPY_FLAGS)"
|
||||
$(MPY_TARGET_DIR)/%.mpy: %.py
|
||||
@mkdir -p $(dir $@)
|
||||
@$(MPY_CROSS) $(MPY_FLAGS) $? -o $@
|
||||
endif
|
||||
|
||||
.devdeps: Pipfile.lock
|
||||
@echo "===> Installing dependencies with pipenv"
|
||||
@$(PIPENV) install --dev --ignore-pipfile
|
||||
@$(PIPENV) sync --dev
|
||||
@touch .devdeps
|
||||
|
||||
devdeps: .devdeps
|
||||
|
||||
dist: clean-dist dockerbase
|
||||
@mkdir -p .dist
|
||||
@docker run --rm -it -v $$(pwd)/.dist:/dist kmkpy:$(TIMESTAMP)
|
||||
|
||||
dockerbase:
|
||||
docker build . \
|
||||
-t kmkpy:$(TIMESTAMP) \
|
||||
--build-arg KMKPY_URL=$$(cut -f1 < kmkpython_ref.tsv) \
|
||||
--build-arg KMKPY_REF=$$(cut -f2 < kmkpython_ref.tsv)
|
||||
|
||||
lint: devdeps
|
||||
@$(PIPENV) run flake8
|
||||
|
||||
fix-formatting: devdeps
|
||||
@$(PIPENV) run black .
|
||||
|
||||
fix-isort: devdeps
|
||||
@find kmk/ tests/ user_keymaps/ -name "*.py" | xargs $(PIPENV) run isort
|
||||
@find boards/ kmk/ tests/ user_keymaps/ -name "*.py" | xargs $(PIPENV) run isort
|
||||
|
||||
clean: clean-build-log
|
||||
clean: clean-dist
|
||||
@echo "===> Cleaning build artifacts"
|
||||
@rm -rf .devdeps build
|
||||
@rm -rf .devdeps build dist $(MPY_TARGET_DIR)
|
||||
|
||||
clean-build-log:
|
||||
@echo "===> Clearing previous .build.log"
|
||||
@rm -rf .build.log
|
||||
clean-dist:
|
||||
@echo "===> Cleaning KMKPython dists"
|
||||
@rm -rf .dist
|
||||
|
||||
# This is mostly a leftover from the days we vendored stuff from
|
||||
# micropython-lib via submodules. Leaving this here mostly in case someone goes
|
||||
# exploring through the history of KMK's repo and manages to screw up their
|
||||
# repo state (those were glitchy times...)
|
||||
powerwash: clean
|
||||
@echo "===> Removing vendor/ to force a re-pull"
|
||||
@rm -rf vendor
|
||||
@echo "===> Removing pipenv-managed virtual environment"
|
||||
@$(PIPENV) --rm || true
|
||||
|
||||
test: lint
|
||||
test: lint unit-tests
|
||||
|
||||
.PHONY: unit-tests
|
||||
unit-tests: devdeps
|
||||
@$(PIPENV) run python3 -m unittest $(TESTS)
|
||||
|
||||
reset-bootloader:
|
||||
@echo "===> Rebooting your board to bootloader (safe to ignore file not found errors)"
|
||||
@ -65,44 +102,44 @@ reset-board:
|
||||
@echo "===> Rebooting your board (safe to ignore file not found errors)"
|
||||
@-timeout -k 5s 10s $(PIPENV) run ampy -p /dev/ttyACM0 -d ${AMPY_DELAY} -b ${AMPY_BAUD} run util/reset.py
|
||||
|
||||
ifdef MOUNTPOINT
|
||||
$(MOUNTPOINT)/kmk/.copied: $(shell find kmk/ -name "*.py" | xargs -0)
|
||||
@echo "===> Copying KMK source folder"
|
||||
@rsync -rh kmk $(MOUNTPOINT)/
|
||||
@touch $(MOUNTPOINT)/kmk/.copied
|
||||
@sync
|
||||
|
||||
copy-kmk: $(MOUNTPOINT)/kmk/.copied
|
||||
else
|
||||
copy-kmk:
|
||||
echo "**** MOUNTPOINT must be defined (wherever your CIRCUITPY drive is mounted) ****" && exit 1
|
||||
endif
|
||||
|
||||
ifdef MOUNTPOINT
|
||||
$(MOUNTPOINT)/kmk/boot.py: boot.py
|
||||
@echo "===> Copying required boot.py"
|
||||
@rsync -rh boot.py $(MOUNTPOINT)/
|
||||
ifdef BOARD
|
||||
copy-board:
|
||||
@echo "===> Copying your board from $(BOARD) to $(MOUNTPOINT)"
|
||||
@rsync -rhu $(BOARD)/*.py $(MOUNTPOINT)/
|
||||
@sync
|
||||
else # BOARD
|
||||
copy-board:
|
||||
@echo "**** Missing BOARD argument ****" && exit 1
|
||||
endif # BOARD
|
||||
|
||||
copy-bootpy: $(MOUNTPOINT)/kmk/boot.py
|
||||
else
|
||||
copy-bootpy:
|
||||
echo "**** MOUNTPOINT must be defined (wherever your CIRCUITPY drive is mounted) ****" && exit 1
|
||||
endif
|
||||
|
||||
ifdef MOUNTPOINT
|
||||
ifndef USER_KEYMAP
|
||||
$(MOUNTPOINT)/main.py:
|
||||
@echo "**** USER_KEYMAP must be defined (ex. USER_KEYMAP=user_keymaps/noop.py) ****" && exit 1
|
||||
else
|
||||
$(MOUNTPOINT)/main.py: $(USER_KEYMAP)
|
||||
@echo "===> Copying your keymap to main.py"
|
||||
@rsync -rh $(USER_KEYMAP) $@
|
||||
@echo "===> Copying required boot.py"
|
||||
@rsync -rhu boot.py $(MOUNTPOINT)/boot.py
|
||||
@sync
|
||||
|
||||
copy-compiled:
|
||||
@echo "===> Copying compiled KMK folder"
|
||||
@rsync -rhu $(MPY_TARGET_DIR)/* $(MOUNTPOINT)/
|
||||
@sync
|
||||
|
||||
ifdef USER_KEYMAP
|
||||
copy-keymap:
|
||||
@echo "===> Copying your keymap to main.py"
|
||||
@rsync -rhu $(USER_KEYMAP) $(MOUNTPOINT)/main.py
|
||||
@sync
|
||||
else # USER_KEYMAP
|
||||
copy-keymap:
|
||||
@echo "**** Missing USER_KEYMAP argument ****" && exit 1
|
||||
endif # USER_KEYMAP
|
||||
|
||||
copy-keymap: $(MOUNTPOINT)/main.py
|
||||
else
|
||||
copy-keymap:
|
||||
echo "**** MOUNTPOINT must be defined (wherever your CIRCUITPY drive is mounted) ****" && exit 1
|
||||
endif # MOUNTPOINT
|
||||
copy-kmk:
|
||||
@echo "===> Copying KMK source folder"
|
||||
@rsync -rhu kmk $(MOUNTPOINT)/
|
||||
@sync
|
||||
|
||||
else # MOUNTPOINT
|
||||
copy-board copy-bootpy copy-compiled copy-keymap copy-kmk:
|
||||
@echo "**** MOUNTPOINT must be defined (wherever your CIRCUITPY drive is mounted) ****" && exit 1
|
||||
endif # ifndef MOUNTPOINT
|
||||
|
22
Pipfile
22
Pipfile
@ -4,19 +4,19 @@ verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
pydux = "*"
|
||||
|
||||
[dev-packages]
|
||||
adafruit-ampy = "*"
|
||||
"flake8" = "*"
|
||||
"flake8-comprehensions" = "*"
|
||||
ipython = "*"
|
||||
ipdb = "*"
|
||||
"flake8" = ">=3.9.0"
|
||||
"flake8-commas" = "*"
|
||||
isort = "*"
|
||||
"flake8-comprehensions" = "*"
|
||||
"flake8-isort" = "*"
|
||||
"python-magic" = "*"
|
||||
adafruit-ampy = "*"
|
||||
ipdb = "*"
|
||||
ipython = "*"
|
||||
isort = "*"
|
||||
neovim = "*"
|
||||
"flake8-per-file-ignores" = "*"
|
||||
|
||||
[requires]
|
||||
python_version = "3.7"
|
||||
s3cmd = "*"
|
||||
black = "==22.3.0"
|
||||
flake8-quotes = "*"
|
||||
flake8-black = "*"
|
||||
|
590
Pipfile.lock
generated
590
Pipfile.lock
generated
@ -1,12 +1,10 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "96625b372d35c7f5ed0fd3289ba61afd0bcc034ddad31feb958a107e2751fb0a"
|
||||
"sha256": "8c1b0ad909dc0ac0fc8013756ca7db8b5420f51c25cc1c2d1612f62fe5e19843"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
"python_version": "3.7"
|
||||
},
|
||||
"requires": {},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
@ -15,300 +13,482 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"default": {
|
||||
"pydux": {
|
||||
"hashes": [
|
||||
"sha256:5cb9217be9d8c7ff79b028f6f02597bbb055b107ce8eecbe5f631f3fc76d793f",
|
||||
"sha256:bed123b5255d566f792b9ceebad87e3f9c1d2d85abed4b9a9475ffc831035879"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.2.2"
|
||||
}
|
||||
},
|
||||
"default": {},
|
||||
"develop": {
|
||||
"adafruit-ampy": {
|
||||
"hashes": [
|
||||
"sha256:1055827874010f48c7dbd3cde4b1d7c6f6732661fad193b188a398e88961fc62"
|
||||
"sha256:4a74812226e53c17d01eb828633424bc4f4fe76b9499a7b35eba6fc2532635b7",
|
||||
"sha256:f4cba36f564096f2aafd173f7fbabb845365cc3bb3f41c37541edf98b58d3976"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.0.5"
|
||||
"version": "==1.1.0"
|
||||
},
|
||||
"asttokens": {
|
||||
"hashes": [
|
||||
"sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3",
|
||||
"sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"
|
||||
],
|
||||
"version": "==2.2.1"
|
||||
},
|
||||
"backcall": {
|
||||
"hashes": [
|
||||
"sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4",
|
||||
"sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"
|
||||
],
|
||||
"version": "==0.1.0"
|
||||
},
|
||||
"click": {
|
||||
"hashes": [
|
||||
"sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d",
|
||||
"sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b"
|
||||
],
|
||||
"version": "==6.7"
|
||||
},
|
||||
"decorator": {
|
||||
"hashes": [
|
||||
"sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82",
|
||||
"sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c"
|
||||
],
|
||||
"version": "==4.3.0"
|
||||
},
|
||||
"flake8": {
|
||||
"hashes": [
|
||||
"sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0",
|
||||
"sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.5.0"
|
||||
},
|
||||
"flake8-commas": {
|
||||
"hashes": [
|
||||
"sha256:d3005899466f51380387df7151fb59afec666a0f4f4a2c6a8995b975de0f44b7",
|
||||
"sha256:ee2141a3495ef9789a3894ed8802d03eff1eaaf98ce6d8653a7c573ef101935e"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==2.0.0"
|
||||
},
|
||||
"flake8-comprehensions": {
|
||||
"hashes": [
|
||||
"sha256:b83891fec0e680b07aa1fd92e53eb6993be29a0f3673a09badbe8da307c445e0",
|
||||
"sha256:e4ccf1627f75f192eb7fde640f5edb81c98d04b1390df9d4145ffd7710bb1ef2"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.4.1"
|
||||
},
|
||||
"flake8-isort": {
|
||||
"hashes": [
|
||||
"sha256:298d7904ac3a46274edf4ce66fd7e272c2a60c34c3cc999dea000608d64e5e6e",
|
||||
"sha256:5992850626ce96547b1f1c7e8a7f0ef49ab2be44eca2177934566437b636fa3c"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==2.5"
|
||||
},
|
||||
"flake8-per-file-ignores": {
|
||||
"hashes": [
|
||||
"sha256:3c4b1d770fa509aaad997ca147bd3533b730c3f6c48290b69a4265072c465522",
|
||||
"sha256:4ee4f24cbea5e18e1fefdfccb043e819caf483d16d08e39cb6df5d18b0407275"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.6"
|
||||
},
|
||||
"greenlet": {
|
||||
"hashes": [
|
||||
"sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0",
|
||||
"sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28",
|
||||
"sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8",
|
||||
"sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304",
|
||||
"sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0",
|
||||
"sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214",
|
||||
"sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043",
|
||||
"sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6",
|
||||
"sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625",
|
||||
"sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc",
|
||||
"sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638",
|
||||
"sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163",
|
||||
"sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4",
|
||||
"sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490",
|
||||
"sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248",
|
||||
"sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939",
|
||||
"sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87",
|
||||
"sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720",
|
||||
"sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656"
|
||||
],
|
||||
"version": "==0.4.15"
|
||||
},
|
||||
"ipdb": {
|
||||
"hashes": [
|
||||
"sha256:7081c65ed7bfe7737f83fa4213ca8afd9617b42ff6b3f1daf9a3419839a2a00a"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.11"
|
||||
},
|
||||
"ipython": {
|
||||
"hashes": [
|
||||
"sha256:007dcd929c14631f83daff35df0147ea51d1af420da303fd078343878bd5fb62",
|
||||
"sha256:b0f2ef9eada4a68ef63ee10b6dde4f35c840035c50fd24265f8052c98947d5a4"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==6.5.0"
|
||||
},
|
||||
"ipython-genutils": {
|
||||
"hashes": [
|
||||
"sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
|
||||
"sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
|
||||
"sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e",
|
||||
"sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"
|
||||
],
|
||||
"version": "==0.2.0"
|
||||
},
|
||||
"isort": {
|
||||
"black": {
|
||||
"hashes": [
|
||||
"sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af",
|
||||
"sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8",
|
||||
"sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497"
|
||||
"sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b",
|
||||
"sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176",
|
||||
"sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09",
|
||||
"sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a",
|
||||
"sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015",
|
||||
"sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79",
|
||||
"sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb",
|
||||
"sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20",
|
||||
"sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464",
|
||||
"sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968",
|
||||
"sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82",
|
||||
"sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21",
|
||||
"sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0",
|
||||
"sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265",
|
||||
"sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b",
|
||||
"sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a",
|
||||
"sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72",
|
||||
"sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce",
|
||||
"sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0",
|
||||
"sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a",
|
||||
"sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163",
|
||||
"sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad",
|
||||
"sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==4.3.4"
|
||||
"version": "==22.3.0"
|
||||
},
|
||||
"click": {
|
||||
"hashes": [
|
||||
"sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
|
||||
"sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==8.1.3"
|
||||
},
|
||||
"decorator": {
|
||||
"hashes": [
|
||||
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
||||
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
||||
],
|
||||
"markers": "python_version < '3.11' and python_version >= '3.7'",
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"executing": {
|
||||
"hashes": [
|
||||
"sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc",
|
||||
"sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"
|
||||
],
|
||||
"version": "==1.2.0"
|
||||
},
|
||||
"flake8": {
|
||||
"hashes": [
|
||||
"sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7",
|
||||
"sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==6.0.0"
|
||||
},
|
||||
"flake8-black": {
|
||||
"hashes": [
|
||||
"sha256:0dfbca3274777792a5bcb2af887a4cad72c72d0e86c94e08e3a3de151bb41c34",
|
||||
"sha256:fe8ea2eca98d8a504f22040d9117347f6b367458366952862ac3586e7d4eeaca"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.3.6"
|
||||
},
|
||||
"flake8-commas": {
|
||||
"hashes": [
|
||||
"sha256:940441ab8ee544df564ae3b3f49f20462d75d5c7cac2463e0b27436e2050f263",
|
||||
"sha256:ebb96c31e01d0ef1d0685a21f3f0e2f8153a0381430e748bf0bbbb5d5b453d54"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==2.1.0"
|
||||
},
|
||||
"flake8-comprehensions": {
|
||||
"hashes": [
|
||||
"sha256:412052ac4a947f36b891143430fef4859705af11b2572fbb689f90d372cf26ab",
|
||||
"sha256:d763de3c74bc18a79c039a7ec732e0a1985b0c79309ceb51e56401ad0a2cd44e"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.10.1"
|
||||
},
|
||||
"flake8-isort": {
|
||||
"hashes": [
|
||||
"sha256:537f453a660d7e903f602ecfa36136b140de279df58d02eb1b6a0c84e83c528c",
|
||||
"sha256:aa0cac02a62c7739e370ce6b9c31743edac904bae4b157274511fc8a19c75bbc"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==6.0.0"
|
||||
},
|
||||
"flake8-quotes": {
|
||||
"hashes": [
|
||||
"sha256:6e26892b632dacba517bf27219c459a8396dcfac0f5e8204904c5a4ba9b480e1"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.3.2"
|
||||
},
|
||||
"greenlet": {
|
||||
"hashes": [
|
||||
"sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a",
|
||||
"sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a",
|
||||
"sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43",
|
||||
"sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33",
|
||||
"sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8",
|
||||
"sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088",
|
||||
"sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca",
|
||||
"sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343",
|
||||
"sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645",
|
||||
"sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db",
|
||||
"sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df",
|
||||
"sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3",
|
||||
"sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86",
|
||||
"sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2",
|
||||
"sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a",
|
||||
"sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf",
|
||||
"sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7",
|
||||
"sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394",
|
||||
"sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40",
|
||||
"sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3",
|
||||
"sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6",
|
||||
"sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74",
|
||||
"sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0",
|
||||
"sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3",
|
||||
"sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91",
|
||||
"sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5",
|
||||
"sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9",
|
||||
"sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8",
|
||||
"sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b",
|
||||
"sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6",
|
||||
"sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb",
|
||||
"sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73",
|
||||
"sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b",
|
||||
"sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df",
|
||||
"sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9",
|
||||
"sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f",
|
||||
"sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0",
|
||||
"sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857",
|
||||
"sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a",
|
||||
"sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249",
|
||||
"sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30",
|
||||
"sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292",
|
||||
"sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b",
|
||||
"sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d",
|
||||
"sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b",
|
||||
"sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c",
|
||||
"sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca",
|
||||
"sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7",
|
||||
"sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75",
|
||||
"sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae",
|
||||
"sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b",
|
||||
"sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470",
|
||||
"sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564",
|
||||
"sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9",
|
||||
"sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099",
|
||||
"sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0",
|
||||
"sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5",
|
||||
"sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19",
|
||||
"sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1",
|
||||
"sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
||||
"version": "==2.0.2"
|
||||
},
|
||||
"ipdb": {
|
||||
"hashes": [
|
||||
"sha256:c23b6736f01fd4586cc2ecbebdf79a5eb454796853e1cd8f2ed3b7b91d4a3e93",
|
||||
"sha256:f74c2f741c18b909eaf89f19fde973f745ac721744aa1465888ce45813b63a9c"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.13.11"
|
||||
},
|
||||
"ipython": {
|
||||
"hashes": [
|
||||
"sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e",
|
||||
"sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==8.10.0"
|
||||
},
|
||||
"isort": {
|
||||
"hashes": [
|
||||
"sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504",
|
||||
"sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==5.12.0"
|
||||
},
|
||||
"jedi": {
|
||||
"hashes": [
|
||||
"sha256:b409ed0f6913a701ed474a614a3bb46e6953639033e31f769ca7581da5bd1ec1",
|
||||
"sha256:c254b135fb39ad76e78d4d8f92765ebc9bf92cbc76f49e97ade1d5f5121e1f6f"
|
||||
"sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e",
|
||||
"sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"
|
||||
],
|
||||
"version": "==0.12.1"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.18.2"
|
||||
},
|
||||
"matplotlib-inline": {
|
||||
"hashes": [
|
||||
"sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311",
|
||||
"sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.1.6"
|
||||
},
|
||||
"mccabe": {
|
||||
"hashes": [
|
||||
"sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
|
||||
"sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
|
||||
"sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
|
||||
"sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
|
||||
],
|
||||
"version": "==0.6.1"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.7.0"
|
||||
},
|
||||
"msgpack": {
|
||||
"hashes": [
|
||||
"sha256:0b3b1773d2693c70598585a34ca2715873ba899565f0a7c9a1545baef7e7fbdc",
|
||||
"sha256:0bae5d1538c5c6a75642f75a1781f3ac2275d744a92af1a453c150da3446138b",
|
||||
"sha256:0ee8c8c85aa651be3aa0cd005b5931769eaa658c948ce79428766f1bd46ae2c3",
|
||||
"sha256:1369f9edba9500c7a6489b70fdfac773e925342f4531f1e3d4c20ac3173b1ae0",
|
||||
"sha256:22d9c929d1d539f37da3d1b0e16270fa9d46107beab8c0d4d2bddffffe895cee",
|
||||
"sha256:2ff43e3247a1e11d544017bb26f580a68306cec7a6257d8818893c1fda665f42",
|
||||
"sha256:31a98047355d34d047fcdb55b09cb19f633cf214c705a765bd745456c142130c",
|
||||
"sha256:8767eb0032732c3a0da92cbec5ac186ef89a3258c6edca09161472ca0206c45f",
|
||||
"sha256:8acc8910218555044e23826980b950e96685dc48124a290c86f6f41a296ea172",
|
||||
"sha256:ab189a6365be1860a5ecf8159c248f12d33f79ea799ae9695fa6a29896dcf1d4",
|
||||
"sha256:cfd6535feb0f1cf1c7cdb25773e965cc9f92928244a8c3ef6f8f8a8e1f7ae5c4",
|
||||
"sha256:e274cd4480d8c76ec467a85a9c6635bbf2258f0649040560382ab58cabb44bcf",
|
||||
"sha256:f86642d60dca13e93260187d56c2bef2487aa4d574a669e8ceefcf9f4c26fd00",
|
||||
"sha256:f8a57cbda46a94ed0db55b73e6ab0c15e78b4ede8690fa491a0e55128d552bb0",
|
||||
"sha256:fcea97a352416afcbccd7af9625159d80704a25c519c251c734527329bb20d0e"
|
||||
"sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467",
|
||||
"sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae",
|
||||
"sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92",
|
||||
"sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef",
|
||||
"sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624",
|
||||
"sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227",
|
||||
"sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88",
|
||||
"sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9",
|
||||
"sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8",
|
||||
"sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd",
|
||||
"sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6",
|
||||
"sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55",
|
||||
"sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e",
|
||||
"sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2",
|
||||
"sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44",
|
||||
"sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6",
|
||||
"sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9",
|
||||
"sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab",
|
||||
"sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae",
|
||||
"sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa",
|
||||
"sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9",
|
||||
"sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e",
|
||||
"sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250",
|
||||
"sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce",
|
||||
"sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075",
|
||||
"sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236",
|
||||
"sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae",
|
||||
"sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e",
|
||||
"sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f",
|
||||
"sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08",
|
||||
"sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6",
|
||||
"sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d",
|
||||
"sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43",
|
||||
"sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1",
|
||||
"sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6",
|
||||
"sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0",
|
||||
"sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c",
|
||||
"sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff",
|
||||
"sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db",
|
||||
"sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243",
|
||||
"sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661",
|
||||
"sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba",
|
||||
"sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e",
|
||||
"sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb",
|
||||
"sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52",
|
||||
"sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6",
|
||||
"sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1",
|
||||
"sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f",
|
||||
"sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da",
|
||||
"sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f",
|
||||
"sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c",
|
||||
"sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"
|
||||
],
|
||||
"version": "==0.5.6"
|
||||
"version": "==1.0.4"
|
||||
},
|
||||
"mypy-extensions": {
|
||||
"hashes": [
|
||||
"sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
|
||||
"sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==1.0.0"
|
||||
},
|
||||
"neovim": {
|
||||
"hashes": [
|
||||
"sha256:6ce58a742e0427491c0e1c8108556ee72ba33844209bd9e226b8da9538299276"
|
||||
"sha256:a6a0e7a5b4433bf4e6ddcbc5c5ff44170be7d84259d002b8e8d8fb4ee78af60f"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.2.6"
|
||||
"version": "==0.3.1"
|
||||
},
|
||||
"parso": {
|
||||
"hashes": [
|
||||
"sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2",
|
||||
"sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24"
|
||||
"sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0",
|
||||
"sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"
|
||||
],
|
||||
"version": "==0.3.1"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.8.3"
|
||||
},
|
||||
"pathmatch": {
|
||||
"pathspec": {
|
||||
"hashes": [
|
||||
"sha256:b35db907d0532c66132e5bc8aaa20dbfae916441987c8f0abd53ac538376d9a7"
|
||||
"sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229",
|
||||
"sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"
|
||||
],
|
||||
"version": "==0.2.1"
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==0.11.0"
|
||||
},
|
||||
"pexpect": {
|
||||
"hashes": [
|
||||
"sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba",
|
||||
"sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b"
|
||||
"sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
|
||||
"sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
|
||||
],
|
||||
"markers": "sys_platform != 'win32'",
|
||||
"version": "==4.6.0"
|
||||
"version": "==4.8.0"
|
||||
},
|
||||
"pickleshare": {
|
||||
"hashes": [
|
||||
"sha256:84a9257227dfdd6fe1b4be1319096c20eb85ff1e82c7932f36efccfe1b09737b",
|
||||
"sha256:c9a2541f25aeabc070f12f452e1f2a8eae2abd51e1cd19e8430402bdf4c1d8b5"
|
||||
"sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
|
||||
"sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
|
||||
],
|
||||
"version": "==0.7.4"
|
||||
"version": "==0.7.5"
|
||||
},
|
||||
"platformdirs": {
|
||||
"hashes": [
|
||||
"sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9",
|
||||
"sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==3.0.0"
|
||||
},
|
||||
"prompt-toolkit": {
|
||||
"hashes": [
|
||||
"sha256:1df952620eccb399c53ebb359cc7d9a8d3a9538cb34c5a1344bdbeb29fbcc381",
|
||||
"sha256:3f473ae040ddaa52b52f97f6b4a493cfa9f5920c255a12dc56a7d34397a398a4",
|
||||
"sha256:858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"
|
||||
"sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63",
|
||||
"sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"
|
||||
],
|
||||
"version": "==1.0.15"
|
||||
"markers": "python_full_version >= '3.6.2'",
|
||||
"version": "==3.0.36"
|
||||
},
|
||||
"ptyprocess": {
|
||||
"hashes": [
|
||||
"sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0",
|
||||
"sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"
|
||||
"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
|
||||
"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
|
||||
],
|
||||
"version": "==0.6.0"
|
||||
"version": "==0.7.0"
|
||||
},
|
||||
"pure-eval": {
|
||||
"hashes": [
|
||||
"sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350",
|
||||
"sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"
|
||||
],
|
||||
"version": "==0.2.2"
|
||||
},
|
||||
"pycodestyle": {
|
||||
"hashes": [
|
||||
"sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766",
|
||||
"sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9"
|
||||
"sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053",
|
||||
"sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"
|
||||
],
|
||||
"version": "==2.3.1"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2.10.0"
|
||||
},
|
||||
"pyflakes": {
|
||||
"hashes": [
|
||||
"sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f",
|
||||
"sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805"
|
||||
"sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf",
|
||||
"sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"
|
||||
],
|
||||
"version": "==1.6.0"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==3.0.1"
|
||||
},
|
||||
"pygments": {
|
||||
"hashes": [
|
||||
"sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d",
|
||||
"sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"
|
||||
"sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297",
|
||||
"sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"
|
||||
],
|
||||
"version": "==2.2.0"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2.14.0"
|
||||
},
|
||||
"pynvim": {
|
||||
"hashes": [
|
||||
"sha256:3a795378bde5e8092fbeb3a1a99be9c613d2685542f1db0e5c6fd467eed56dff"
|
||||
],
|
||||
"version": "==0.4.3"
|
||||
},
|
||||
"pyserial": {
|
||||
"hashes": [
|
||||
"sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627",
|
||||
"sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8"
|
||||
"sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb",
|
||||
"sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"
|
||||
],
|
||||
"version": "==3.4"
|
||||
"version": "==3.5"
|
||||
},
|
||||
"python-dateutil": {
|
||||
"hashes": [
|
||||
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
|
||||
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==2.8.2"
|
||||
},
|
||||
"python-dotenv": {
|
||||
"hashes": [
|
||||
"sha256:122290a38ece9fe4f162dc7c95cae3357b983505830a154d3c98ef7f6c6cea77",
|
||||
"sha256:4a205787bc829233de2a823aa328e44fd9996fedb954989a21f1fc67c13d7a77"
|
||||
"sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49",
|
||||
"sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"
|
||||
],
|
||||
"version": "==0.9.1"
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==0.21.1"
|
||||
},
|
||||
"simplegeneric": {
|
||||
"python-magic": {
|
||||
"hashes": [
|
||||
"sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"
|
||||
"sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b",
|
||||
"sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"
|
||||
],
|
||||
"version": "==0.8.1"
|
||||
"index": "pypi",
|
||||
"version": "==0.4.27"
|
||||
},
|
||||
"s3cmd": {
|
||||
"hashes": [
|
||||
"sha256:15330776e7ff993d8ae0ac213bf896f210719e9b91445f5f7626a8fa7e74e30b",
|
||||
"sha256:2204306742c33c24fbca02b78e059bacfc1bfc04af09c7e9866f267a11a9ddb2"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==2.3.0"
|
||||
},
|
||||
"six": {
|
||||
"hashes": [
|
||||
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
|
||||
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
|
||||
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
||||
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
|
||||
],
|
||||
"version": "==1.11.0"
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==1.16.0"
|
||||
},
|
||||
"testfixtures": {
|
||||
"stack-data": {
|
||||
"hashes": [
|
||||
"sha256:334497d26344e8c0c5d01b4d785a1c83464573151e6a5f7ab250eb7981d452ec",
|
||||
"sha256:53c06c1feb0bf378d63c54d1d96858978422d5a34793b39f0dcb0e44f8ec26f4"
|
||||
"sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815",
|
||||
"sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"
|
||||
],
|
||||
"version": "==6.3.0"
|
||||
"version": "==0.6.2"
|
||||
},
|
||||
"tomli": {
|
||||
"hashes": [
|
||||
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
|
||||
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
|
||||
],
|
||||
"markers": "python_version < '3.11'",
|
||||
"version": "==2.0.1"
|
||||
},
|
||||
"traitlets": {
|
||||
"hashes": [
|
||||
"sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835",
|
||||
"sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9"
|
||||
"sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8",
|
||||
"sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"
|
||||
],
|
||||
"version": "==4.3.2"
|
||||
},
|
||||
"typing": {
|
||||
"hashes": [
|
||||
"sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d",
|
||||
"sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4",
|
||||
"sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a"
|
||||
],
|
||||
"version": "==3.6.6"
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==5.9.0"
|
||||
},
|
||||
"wcwidth": {
|
||||
"hashes": [
|
||||
"sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
|
||||
"sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
|
||||
"sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e",
|
||||
"sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"
|
||||
],
|
||||
"version": "==0.1.7"
|
||||
"version": "==0.2.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
148
README.md
148
README.md
@ -1,101 +1,81 @@
|
||||
# KMK: Python-based keyboard firmware for humans (and ARM microcontrollers)
|
||||
# KMK: Clackety Keyboards Powered by Python
|
||||
![GitHub](https://img.shields.io/github/license/KMKfw/kmk_firmware)
|
||||
![GitHub contributors](https://img.shields.io/github/contributors/KMKfw/kmk_firmware)
|
||||
![Lines of code](https://img.shields.io/tokei/lines/github/KMKfw/kmk_firmware)
|
||||
![GitHub issues](https://img.shields.io/github/issues-raw/KMKfw/kmk_firmware)
|
||||
![GitHub closed issues](https://img.shields.io/github/issues-closed/KMKfw/kmk_firmware)
|
||||
|
||||
[![CircleCI](https://circleci.com/gh/KMKfw/kmk_firmware/tree/master.svg?style=svg)](https://circleci.com/gh/KMKfw/kmk_firmware/tree/master)[![CLA assistant](https://cla-assistant.io/readme/badge/KMKfw/kmk_firmware)](https://cla-assistant.io/KMKfw/kmk_firmware)
|
||||
KMK is a feature-rich and beginner-friendly firmware for computer keyboards
|
||||
written and configured in
|
||||
[CircuitPython](https://github.com/adafruit/circuitpython).
|
||||
|
||||
#### [Join our Matrix community for chat and support!](https://matrix.to/#/+kmk:kmkfw.io)
|
||||
## Support
|
||||
|
||||
[Or, head directly to the #support channel](https://matrix.to/#/#support:kmkfw.io)
|
||||
For asynchronous support and chatter about KMK, [join our Zulip
|
||||
community](https://kmkfw.zulipchat.com)!
|
||||
|
||||
If you can't or won't use the Matrix infrastructure, a (possibly fragile) bridge
|
||||
to Discord exists
|
||||
[here](https://discordapp.com/widget?id=493256121075761173&theme=dark).
|
||||
If you ask for help in chat or open a bug report, if possible
|
||||
make sure your copy of KMK is up-to-date.
|
||||
In particular, swing by the Zulip chat *before* opening a GitHub Issue about
|
||||
configuration, documentation, etc. concerns.
|
||||
|
||||
<hr/>
|
||||
> The former Matrix and Discord rooms once linked to in this README are no
|
||||
> longer officially supported, please do not use them!
|
||||
|
||||
KMK is a firmware for (usually mechanical) keyboards, running on
|
||||
[CircuitPython](https://github.com/adafruit/circuitpython). It aims to provide a
|
||||
means to write complex keyboard configurations quickly, without having to learn
|
||||
much "real" programming, while preserving at least some of the hackability and
|
||||
DIY spirit of CircuitPython. Learn more about the rationale of KMK in `Why KMK?`
|
||||
below.
|
||||
## Features
|
||||
|
||||
This project is currently written and maintained by:
|
||||
- Fully configured through a single, easy to understand Python file that lives
|
||||
on a "flash-drive"-esque space on your microcontroller - edit on the go
|
||||
without DFU or other devtooling available!
|
||||
- Single-piece or [two-piece split
|
||||
keyboards](/docs/en/split_keyboards.md)
|
||||
are supported
|
||||
- [Chainable
|
||||
keys](/docs/en/keys.md) such as
|
||||
`KC.LWIN(KC.L)` to lock the screen on a Windows PC
|
||||
- [Built-in Unicode macros, including
|
||||
emojis](/docs/en/sequences.md)
|
||||
- [RGB underglow](/docs/en/rgb.md)
|
||||
and [LED
|
||||
backlights](/docs/en/led.md)
|
||||
- One key can turn into many more based on [how many times you tap
|
||||
it](/docs/en/tapdance.md)
|
||||
- Bluetooth HID and split keyboards. No more wires.
|
||||
|
||||
- [Josh Klar (@klardotsh)](https://github.com/klardotsh)
|
||||
- [Kyle Brown (@kdb424)](https://github.com/kdb424)
|
||||
## Getting Started
|
||||
KMK requires [CircuitPython](https://circuitpython.org/) version 7.0 or higher.
|
||||
Our getting started guide can be found
|
||||
[here](/docs/en/Getting_Started.md).
|
||||
|
||||
With community help from:
|
||||
## Code Style
|
||||
|
||||
- [@siddacious](https://github.com/siddacious)
|
||||
- [Scott Shawcroft (@tannewt)](https://github.com/tannewt)
|
||||
KMK uses [Black](https://github.com/psf/black) with a Python 3.6 target and,
|
||||
[(controversially?)](https://github.com/psf/black/issues/594) single quotes.
|
||||
Further code styling is enforced with isort and flake8 with several plugins.
|
||||
`make fix-isort fix-formatting` before a commit is a good idea, and CI will fail
|
||||
if inbound code does not adhere to these formatting rules. Some exceptions are
|
||||
found in `setup.cfg` loosening the rules in isolated cases, notably
|
||||
`user_keymaps` (which is *also* not subject to Black formatting for reasons
|
||||
documented in `pyproject.toml`).
|
||||
|
||||
> Scott is the lead developer of the CircuitPython project itself at Adafruit.
|
||||
> KMK, however, is not officially sponsored by Adafruit, and is an independent
|
||||
> project.
|
||||
## Tests
|
||||
|
||||
Lastly, we'd like to make a couple of shoutouts to people not directly
|
||||
affiliated with the project in any way, but who have helped or inspired us along
|
||||
the way:
|
||||
Unit tests within the `tests` folder mock various CircuitPython modules to allow
|
||||
them to be executed in a desktop development environment.
|
||||
|
||||
- [Jack Humbert (@jackhumbert)](https://jackhumbert.com/), for writing QMK.
|
||||
Without QMK, I'd have never been exposed to the wonderful world of
|
||||
programmable keyboards. He's also just an awesometastic human in general, if
|
||||
you ever catch him on Discord/Reddit/etc. Jack also makes fantastic hardware -
|
||||
check out [his store](https://olkb.com)!
|
||||
|
||||
- [Dan Halbert (@dhalbert)](https://danhalbert.org/), for his amazing and
|
||||
unjudgemental support of two random dudes on Github asking all sorts of
|
||||
bizzare (okay... and occasionally dumb) questions on the MicroPython and
|
||||
CircuitPython Github projects and the Adafruit Discord. Dan, without your help
|
||||
and pointers (even when those pointers are "Remember you're working with a
|
||||
microcontroller with a few MHz of processing speed and a few KB of RAM"), this
|
||||
project would have never gotten off the ground. Thank you, and an extended
|
||||
thanks to Adafruit.
|
||||
|
||||
## Why KMK?
|
||||
|
||||
A question we get from time to time is, "why bother with KMK when QMK already
|
||||
exists?", so here's a short bulleted list of our thoughts on the matter (in no
|
||||
particular order):
|
||||
|
||||
- Python is awesome
|
||||
- Python is super easy to write
|
||||
- Python provides fewer footguns than C
|
||||
- KMK cut all the "tech debt" of supporting AVR controllers, and frankly even
|
||||
most ARM controllers with under 256KB of flash. This let us make some very
|
||||
user-friendly (in our biased opinions) design decisions that should make it
|
||||
simple for users to create even fairly complex keyboards - want a key on your
|
||||
board that sends a shruggie (`¯\_(ツ)_/¯`)? No problem - it's supported out of
|
||||
the box. Want a single key that can act as all 26 alphabet characters
|
||||
depending on the number of times it's tapped? You're insane, but our simple
|
||||
Tap Dance implementation has you covered (without a single line of matrix
|
||||
mangling or timer madness)
|
||||
- KMK supports a few small features QMK doesn't - most are probably not
|
||||
deal-closers, but they exist no less. Probably the most notable addition here
|
||||
is `Leader Mode - Enter`. Check out `docs/leader.md` for details on that.
|
||||
- KMK plans to support some fairly powerful hardware that would enable things
|
||||
like connecting halves (or thirds, or whatever) of a split keyboard to each
|
||||
other via Bluetooth. This stuff is still in very early R&D.
|
||||
|
||||
## So how do I use it?
|
||||
|
||||
Since KMK is still in some state between "alpha" and "beta", flashing KMK to a
|
||||
board is still a process that requires a few lines of shell scripting. Check out
|
||||
`docs/flashing.md` for instructions/details, though note that for now, the
|
||||
instructions mostly assume Unix (Linux/MacOS/BSD) usage. You may want to check
|
||||
out the Windows Subsystem for Linux if you're on Windows.
|
||||
Execute tests using the command `python -m unittest`.
|
||||
|
||||
## License, Copyright, and Legal
|
||||
|
||||
Most files in this project are licensed
|
||||
[GPLv3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)) -
|
||||
see `LICENSE.md` at the top of this source tree for exceptions and the full
|
||||
license text.
|
||||
All software in this repository is licensed under the [GNU Public License,
|
||||
version 3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)).
|
||||
All documentation and hardware designs are licensed under the [Creative Commons
|
||||
Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
license. Contributions to this repository must use these licenses unless
|
||||
otherwise agreed to by the Core team.
|
||||
|
||||
When contributing for the first time, you'll need to sign a Contributor
|
||||
Licensing Agreement which is based on the Free Software Foundation's CLA. The
|
||||
CLA is basically a two-way promise that this code is and remains yours, but will
|
||||
be distributed as part of a larger GPLv3 project. If you'd like to get it out of
|
||||
the way early, you can find said CLA [here](
|
||||
https://cla-assistant.io/kmkfw/kmk_firmware). If you forget, the bots will
|
||||
remind you when you open the pull request, no worries!
|
||||
**Due to ethical and legal concerns, any works derived from GitHub Copilot or
|
||||
similar artificial intelligence tooling are unacceptable for inclusion in any
|
||||
first-party KMK repository or other code collection. We further recommend not
|
||||
using GitHub Copilot while developing anything KMK-related, regardless of
|
||||
intent to submit upstream.**
|
||||
|
10
boards/Pico14/README.md
Normal file
10
boards/Pico14/README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Pico 14 Numerical Keypad
|
||||
|
||||
![Pico14](https://www.boltind.com/wp-content/uploads/2022/01/PXL_20220119_171113903-scaled.jpg)
|
||||
|
||||
Pico 14 Numerical Keypad / Macro Pad PCB’s and Hardware Kit.
|
||||
|
||||
`kb.py` is designed to work with the Pi Pico.
|
||||
|
||||
Retailers:
|
||||
[Bolt Industries](https://www.boltind.com/product/pico-14-numerical-keypad-macro-pad-pcbs-and-hardware-kit/)
|
23
boards/Pico14/kb.py
Normal file
23
boards/Pico14/kb.py
Normal file
@ -0,0 +1,23 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP0,
|
||||
board.GP1,
|
||||
board.GP2,
|
||||
)
|
||||
|
||||
row_pins = (
|
||||
board.GP18,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
)
|
||||
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
led_pin = board.GP27
|
56
boards/Pico14/main.py
Normal file
56
boards/Pico14/main.py
Normal file
@ -0,0 +1,56 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.extensions.lock_status import LockStatus
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
Pico14 = KMKKeyboard()
|
||||
|
||||
|
||||
class LEDLockStatus(LockStatus):
|
||||
def __init__(self, leds):
|
||||
super().__init__()
|
||||
self._leds = leds
|
||||
|
||||
def set_lock_leds(self):
|
||||
if self.get_num_lock():
|
||||
self._leds.set_brightness(100, leds=[0])
|
||||
else:
|
||||
self._leds.set_brightness(0, leds=[0])
|
||||
|
||||
def after_hid_send(self, sandbox):
|
||||
super().after_hid_send(sandbox) # Critically important. Removing this will break lock status.
|
||||
|
||||
if self.report_updated:
|
||||
self.set_lock_leds()
|
||||
|
||||
|
||||
Pico14.modules.append(Layers())
|
||||
leds = LED(led_pin=[Pico14.led_pin], val=0)
|
||||
Pico14.extensions.append(leds)
|
||||
Pico14.extensions.append(LEDLockStatus(leds))
|
||||
|
||||
# Make this for better looking formatting...
|
||||
______ = KC.TRNS
|
||||
XXXXXX = KC.NO
|
||||
|
||||
Pico14.keymap = [[
|
||||
# Layer 0 QWERTY
|
||||
KC.NUMLOCK, KC.NUMPAD_SLASH, KC.NUMPAD_ASTERISK,
|
||||
KC.NUMPAD_7, KC.NUMPAD_8, KC.NUMPAD_9,
|
||||
KC.NUMPAD_4, KC.NUMPAD_5, KC.NUMPAD_6,
|
||||
KC.NUMPAD_1, KC.NUMPAD_2, KC.NUMPAD_1,
|
||||
KC.NUMPAD_0, XXXXXX, KC.NUMPAD_DOT
|
||||
], [
|
||||
# Layer 1
|
||||
______, ______, ______,
|
||||
KC.HOME, KC.UP, KC.PGUP,
|
||||
KC.LEFT, ______, KC.RIGHT,
|
||||
KC.END, KC.DOWN, KC.PGDN,
|
||||
KC.INS, XXXXXX, KC.DEL
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
Pico14.go()
|
42
boards/Pico87/kb.py
Normal file
42
boards/Pico87/kb.py
Normal file
@ -0,0 +1,42 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP0,
|
||||
board.GP1,
|
||||
board.GP2,
|
||||
board.GP3,
|
||||
board.GP4,
|
||||
board.GP5,
|
||||
board.GP6,
|
||||
board.GP7,
|
||||
board.GP8,
|
||||
board.GP9,
|
||||
board.GP10,
|
||||
board.GP11,
|
||||
board.GP12,
|
||||
board.GP13,
|
||||
board.GP14,
|
||||
board.GP15,
|
||||
board.GP16,
|
||||
board.GP17,
|
||||
)
|
||||
|
||||
row_pins = (
|
||||
board.GP18,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
board.GP26,
|
||||
)
|
||||
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
leds = LED(led_pin=[board.GP27, board.GP28])
|
||||
_KMKKeyboard.extensions.append(leds)
|
60
boards/Pico87/main.py
Normal file
60
boards/Pico87/main.py
Normal file
@ -0,0 +1,60 @@
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.lock_status import LockStatus
|
||||
from kmk.extensions.stringy_keymaps import StringyKeymaps
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
Pico87 = KMKKeyboard()
|
||||
|
||||
|
||||
class LEDLockStatus(LockStatus):
|
||||
def set_lock_leds(self):
|
||||
if self.get_caps_lock():
|
||||
Pico87.leds.set_brightness(50, leds=[0])
|
||||
else:
|
||||
Pico87.leds.set_brightness(0, leds=[0])
|
||||
|
||||
if self.get_scroll_lock():
|
||||
Pico87.leds.set_brightness(50, leds=[1])
|
||||
else:
|
||||
Pico87.leds.set_brightness(0, leds=[1])
|
||||
|
||||
def after_hid_send(self, sandbox):
|
||||
super().after_hid_send(sandbox) # Critically important. Removing this will break lock status.
|
||||
|
||||
if self.report_updated:
|
||||
self.set_lock_leds()
|
||||
|
||||
|
||||
Pico87.modules.append(Layers())
|
||||
Pico87.extensions.append(LEDLockStatus())
|
||||
Pico87.extensions.append(StringyKeymaps())
|
||||
|
||||
MOLYR = KC.MO(1)
|
||||
|
||||
# Make this for better looking formatting...
|
||||
______ = 'NO'
|
||||
|
||||
Pico87.keymap = [[
|
||||
# Layer 0 QWERTY
|
||||
'ESC', ______, 'F1', 'F2', 'F3', 'F4', ______, 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'PSCR', 'SLCK', 'PAUS',
|
||||
'GRV', 'N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9', 'N0', 'MINS', 'EQL', ______, 'BSPC', 'INS', 'HOME', 'PGUP',
|
||||
'TAB', ______, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'LBRC', 'RBRC', 'BSLS', 'DEL', 'END', 'PGDN',
|
||||
'CAPS', ______, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'SCLN', 'QUOT', 'ENT', ______, ______, ______, ______,
|
||||
______, 'LSFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'COMM', 'DOT', 'SLSH', ______, 'RSFT', ______, ______, 'UP', ______,
|
||||
'LCTL', 'LGUI', ______, 'LALT', ______, ______, 'SPC', ______, ______, ______, 'RALT', 'RGUI', ______, MOLYR, 'RCTL', 'LEFT', 'DOWN', 'RGHT',
|
||||
], [
|
||||
# Layer 1
|
||||
'ESC', ______, 'F1', 'F2', 'F3', 'F4', ______, 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'PSCR', 'SLCK', 'PAUS',
|
||||
'GRV', 'N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9', 'N0', 'MINS', 'EQL', ______, 'BSPC', 'INS', 'HOME', 'PGUP',
|
||||
'TAB', ______, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'LBRC', 'RBRC', 'BSLS', 'DEL', 'END', 'PGDN',
|
||||
'CAPS', ______, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'SCLN', 'QUOT', 'ENT', ______, ______, ______, ______,
|
||||
______, 'LSFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'COMM', 'DOT', 'SLSH', ______, 'RSFT', ______, ______, 'UP', ______,
|
||||
'LCTL', 'LGUI', ______, 'LALT', ______, ______, 'SPC', ______, ______, ______, 'RALT', 'RGUI', ______, MOLYR, 'RCTL', 'LEFT', 'DOWN', 'RGHT',
|
||||
]]
|
||||
|
||||
if __name__ == '__main__':
|
||||
Pico87.go()
|
105
boards/ZFR_KBD/RP2.65-F/kb.py
Normal file
105
boards/ZFR_KBD/RP2.65-F/kb.py
Normal file
@ -0,0 +1,105 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.matrix import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.COL0,
|
||||
board.COL1,
|
||||
board.COL2,
|
||||
board.COL3,
|
||||
board.COL4,
|
||||
board.COL5,
|
||||
board.COL6,
|
||||
board.COL7,
|
||||
)
|
||||
row_pins = (
|
||||
board.ROW0,
|
||||
board.ROW1,
|
||||
board.ROW2,
|
||||
board.ROW3,
|
||||
board.ROW4,
|
||||
board.ROW5,
|
||||
board.ROW6,
|
||||
board.ROW7,
|
||||
board.ROW8,
|
||||
board.ROW9,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
rgb_pixel_pin = board.LED
|
||||
rgb_num_pixels = 70
|
||||
|
||||
coord_mapping = [
|
||||
0,
|
||||
8,
|
||||
1,
|
||||
9,
|
||||
2,
|
||||
10,
|
||||
3,
|
||||
11,
|
||||
4,
|
||||
12,
|
||||
5,
|
||||
13,
|
||||
6,
|
||||
14,
|
||||
7,
|
||||
15,
|
||||
24,
|
||||
17,
|
||||
25,
|
||||
18,
|
||||
26,
|
||||
19,
|
||||
27,
|
||||
20,
|
||||
28,
|
||||
21,
|
||||
29,
|
||||
22,
|
||||
23,
|
||||
31,
|
||||
40,
|
||||
33,
|
||||
41,
|
||||
34,
|
||||
42,
|
||||
35,
|
||||
43,
|
||||
36,
|
||||
44,
|
||||
37,
|
||||
45,
|
||||
38,
|
||||
46,
|
||||
39,
|
||||
47,
|
||||
56,
|
||||
49,
|
||||
57,
|
||||
50,
|
||||
58,
|
||||
51,
|
||||
59,
|
||||
52,
|
||||
60,
|
||||
53,
|
||||
61,
|
||||
54,
|
||||
55,
|
||||
63,
|
||||
72,
|
||||
65,
|
||||
73,
|
||||
74,
|
||||
75,
|
||||
76,
|
||||
69,
|
||||
77,
|
||||
78,
|
||||
71,
|
||||
79,
|
||||
]
|
12
boards/anavi/anavi-arrows/README.md
Normal file
12
boards/anavi/anavi-arrows/README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# ANAVI Arrows
|
||||
|
||||
ANAVI Arrows is an open source, programmable mechanical keyboard with 4 hot-swappable mechanical switches, RGB WS2812B underlighting and yellow backlit a rotary encoder, [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html) and a mini OLED I2C yellow-blue display.
|
||||
|
||||
ANAVI Arrows has been designed with the cross platform and open source electronics design automation suite KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/anavitechnology/anavi-arrows) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/en/encoder.md) Twist control for all the things
|
||||
- [LED](/docs/en/led.md) Light your keys up (for backlit)
|
||||
- [RGB](/docs/en/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
||||
- [PEG_OLED](/docs/peg_oled_display.md) Show information on the mini OLED display
|
20
boards/anavi/anavi-arrows/arrows.py
Normal file
20
boards/anavi/anavi-arrows/arrows.py
Normal file
@ -0,0 +1,20 @@
|
||||
'''
|
||||
KMK keyboard for ANAVI Arrows
|
||||
|
||||
This is a macro pad with 4 mechanical switches based on the RP2040. Each key is
|
||||
attached to a single GPIO, so the KMK matrix scanner needs to be overridden.
|
||||
'''
|
||||
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
|
||||
class AnaviArrows(KMKKeyboard):
|
||||
'''
|
||||
Default keyboard config for ANAVI Arrows.
|
||||
'''
|
||||
|
||||
def __init__(self):
|
||||
self.matrix = KeysScanner([board.D1, board.D2, board.D3, board.D6])
|
90
boards/anavi/anavi-arrows/code.py
Normal file
90
boards/anavi/anavi-arrows/code.py
Normal file
@ -0,0 +1,90 @@
|
||||
import board
|
||||
|
||||
from arrows import AnaviArrows
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.peg_oled_Display import (
|
||||
Oled,
|
||||
OledData,
|
||||
OledDisplayMode,
|
||||
OledReactionType,
|
||||
)
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
|
||||
keyboard = AnaviArrows()
|
||||
|
||||
# I2C pins for the mini OLED display
|
||||
keyboard.SCL = board.D5
|
||||
keyboard.SDA = board.D4
|
||||
|
||||
# fmt: off
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.RIGHT, KC.DOWN, KC.LEFT, KC.UP,
|
||||
]
|
||||
]
|
||||
# fmt: on
|
||||
|
||||
oled_ext = Oled(
|
||||
OledData(
|
||||
corner_one={0: OledReactionType.STATIC, 1: ['ANAVI Arrows']},
|
||||
corner_two={0: OledReactionType.STATIC, 1: [' ']},
|
||||
corner_three={0: OledReactionType.STATIC, 1: ['Open Source']},
|
||||
corner_four={0: OledReactionType.STATIC, 1: [' ']},
|
||||
),
|
||||
oWidth=128,
|
||||
oHeight=64,
|
||||
toDisplay=OledDisplayMode.TXT,
|
||||
flip=False,
|
||||
)
|
||||
keyboard.extensions.append(oled_ext)
|
||||
|
||||
led_ext = LED(
|
||||
led_pin=[
|
||||
board.D0,
|
||||
],
|
||||
brightness=100,
|
||||
brightness_step=5,
|
||||
brightness_limit=100,
|
||||
breathe_center=1.5,
|
||||
animation_mode=AnimationModes.STATIC,
|
||||
animation_speed=1,
|
||||
user_animation=None,
|
||||
val=100,
|
||||
)
|
||||
keyboard.extensions.append(led_ext)
|
||||
|
||||
# WS2812B LED strips on the back
|
||||
underglow = RGB(
|
||||
pixel_pin=board.D10,
|
||||
num_pixels=4,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(underglow)
|
||||
|
||||
# Neopixel on XIAO RP2040
|
||||
frontglow = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(frontglow)
|
||||
|
||||
media_keys = MediaKeys()
|
||||
keyboard.extensions.append(media_keys)
|
||||
|
||||
# Rotary encoder that also acts as a key
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.pins = ((board.D8, board.D7, board.D9),)
|
||||
encoder_handler.map = (((KC.VOLD, KC.VOLU, KC.MUTE),),)
|
||||
keyboard.modules.append(encoder_handler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
10
boards/anavi/knob1/README.md
Normal file
10
boards/anavi/knob1/README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# ANAVI Knob 1
|
||||
|
||||
ANAVI Knob 1 is an open source, programmable mechanical keyboard with a single rotary encoder and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Knob 1 is open source hardware designed with KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/AnaviTechnology/anavi-knob-1) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/en/encoder.md) Twist control for all the things
|
||||
- [RGB](/docs/en/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
35
boards/anavi/knob1/code.py
Normal file
35
boards/anavi/knob1/code.py
Normal file
@ -0,0 +1,35 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
knob = KMKKeyboard()
|
||||
knob.matrix = KeysScanner([])
|
||||
|
||||
media_keys = MediaKeys()
|
||||
knob.extensions.append(media_keys)
|
||||
|
||||
# Rotary encoder that also acts as a key
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.divisor = 2
|
||||
encoder_handler.pins = ((board.D1, board.D2, board.D0),)
|
||||
encoder_handler.map = (((KC.VOLD, KC.VOLU, KC.MUTE),),)
|
||||
knob.modules.append(encoder_handler)
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
knob.extensions.append(rgb_ext)
|
||||
|
||||
knob.keymap = [[KC.MUTE]]
|
||||
|
||||
if __name__ == '__main__':
|
||||
knob.go()
|
10
boards/anavi/knobs3/README.md
Normal file
10
boards/anavi/knobs3/README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# ANAVI Knobs 3
|
||||
|
||||
ANAVI Knobs 3 is an open source, programmable mechanical keyboard with 3 rotary encoders and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Knobs 3 is open source hardware designed with KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/AnaviTechnology/anavi-knobs-3) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/en/encoder.md) Twist control for all the things
|
||||
- [RGB](/docs/en/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
43
boards/anavi/knobs3/code.py
Normal file
43
boards/anavi/knobs3/code.py
Normal file
@ -0,0 +1,43 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
knob = KMKKeyboard()
|
||||
knob.matrix = KeysScanner([])
|
||||
|
||||
media_keys = MediaKeys()
|
||||
knob.extensions.append(media_keys)
|
||||
|
||||
# Rotary encoders that also acts as keys
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.divisor = 2
|
||||
encoder_handler.pins = (
|
||||
(board.D1, board.D2, board.D0),
|
||||
(board.D9, board.D10, board.D3),
|
||||
(board.D7, board.D8, board.D6),
|
||||
)
|
||||
encoder_handler.map = (
|
||||
((KC.VOLD, KC.VOLU, KC.MUTE), (KC.UP, KC.DOWN, KC.A), (KC.RIGHT, KC.LEFT, KC.B)),
|
||||
)
|
||||
knob.modules.append(encoder_handler)
|
||||
|
||||
print('ANAVI Knobs 3')
|
||||
|
||||
rgb_ext = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
knob.extensions.append(rgb_ext)
|
||||
|
||||
knob.keymap = [[KC.MUTE]]
|
||||
|
||||
if __name__ == '__main__':
|
||||
knob.go()
|
11
boards/anavi/macro-pad-10/README.md
Normal file
11
boards/anavi/macro-pad-10/README.md
Normal file
@ -0,0 +1,11 @@
|
||||
# ANAVI Macro Pad 10
|
||||
|
||||
ANAVI Macro Pad 10 is an open source, programmable mechanical keyboard with 9 hot-swappable mechanical switches, RGB WS2812B underlighting and yellow backlit a rotary encoder and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Macro Pad 10 has been designed with the cross platform and open source electronics design automation suite KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/anavitechnology/anavi-macro-pad-10) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/en/encoder.md) Twist control for all the things
|
||||
- [LED](/docs/en/led.md) Light your keys up (for backlit)
|
||||
- [RGB](/docs/en/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
87
boards/anavi/macro-pad-10/code.py
Normal file
87
boards/anavi/macro-pad-10/code.py
Normal file
@ -0,0 +1,87 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
print('ANAVI Macro Pad 10')
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
led_ext = LED(
|
||||
led_pin=[
|
||||
board.D0,
|
||||
],
|
||||
brightness=100,
|
||||
brightness_step=5,
|
||||
brightness_limit=100,
|
||||
breathe_center=1.5,
|
||||
animation_mode=AnimationModes.STATIC,
|
||||
animation_speed=1,
|
||||
user_animation=None,
|
||||
val=100,
|
||||
)
|
||||
keyboard.extensions.append(led_ext)
|
||||
|
||||
# WS2812B LED strips on the back
|
||||
underglow = RGB(
|
||||
pixel_pin=board.D10,
|
||||
num_pixels=4,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(underglow)
|
||||
|
||||
# Neopixel on XIAO RP2040
|
||||
frontglow = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(frontglow)
|
||||
|
||||
keyboard.col_pins = (
|
||||
board.D4,
|
||||
board.D5,
|
||||
board.D6,
|
||||
)
|
||||
keyboard.row_pins = (
|
||||
board.D3,
|
||||
board.D2,
|
||||
board.D1,
|
||||
)
|
||||
keyboard.diode_orientation = DiodeOrientation.COL2ROW
|
||||
|
||||
media_keys = MediaKeys()
|
||||
keyboard.extensions.append(media_keys)
|
||||
|
||||
# Matrix 3x3 keymap, 9 keys in total
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.N1,
|
||||
KC.N2,
|
||||
KC.N3,
|
||||
KC.N4,
|
||||
KC.N5,
|
||||
KC.N6,
|
||||
KC.N7,
|
||||
KC.N8,
|
||||
KC.N9,
|
||||
]
|
||||
]
|
||||
|
||||
# Rotary encoder that also acts as a key
|
||||
encoder_handler = EncoderHandler()
|
||||
encoder_handler.divisor = 2
|
||||
encoder_handler.pins = ((board.D8, board.D7, board.D9),)
|
||||
encoder_handler.map = (((KC.VOLD, KC.VOLU, KC.MUTE),),)
|
||||
keyboard.modules.append(encoder_handler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
12
boards/anavi/macro-pad-12/README.md
Normal file
12
boards/anavi/macro-pad-12/README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# ANAVI Macro Pad 12
|
||||
|
||||
ANAVI Macro Pad 12 is an open source, programmable mechanical keyboard with 9 hot-swappable mechanical switches, RGB WS2812B underlighting and yellow backlit a rotary encoder and [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html).
|
||||
|
||||
ANAVI Macro Pad 12 has been designed with the cross platform and open source electronics design automation suite KiCad. All KiCad [files and schematics are available at GitHub](https://github.com/anavitechnology/anavi-macro-pad-12) under [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
|
||||
Extensions enabled by default:
|
||||
- [Encoder](/docs/en/encoder.md) Twist control for all the things
|
||||
- [LED](/docs/en/led.md) Light your keys up (for backlit)
|
||||
- [RGB](/docs/en/rgb.md) Light it up (for underlighting)
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
||||
- [PEG_OLED](/docs/peg_oled_display.md) Show information on the mini OLED display
|
97
boards/anavi/macro-pad-12/code.py
Normal file
97
boards/anavi/macro-pad-12/code.py
Normal file
@ -0,0 +1,97 @@
|
||||
import board
|
||||
|
||||
from kmk.extensions.LED import LED
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.peg_oled_Display import (
|
||||
Oled,
|
||||
OledData,
|
||||
OledDisplayMode,
|
||||
OledReactionType,
|
||||
)
|
||||
from kmk.extensions.RGB import RGB, AnimationModes
|
||||
from kmk.keys import KC
|
||||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# I2C pins for the mini OLED display
|
||||
keyboard.SCL = board.D5
|
||||
keyboard.SDA = board.D4
|
||||
|
||||
oled_ext = Oled(
|
||||
OledData(
|
||||
corner_one={0: OledReactionType.STATIC, 1: ['ANAVI Macro Pad 12']},
|
||||
corner_two={0: OledReactionType.STATIC, 1: [' ']},
|
||||
corner_three={0: OledReactionType.STATIC, 1: ['Open Source']},
|
||||
corner_four={0: OledReactionType.STATIC, 1: [' ']},
|
||||
),
|
||||
oWidth=128,
|
||||
oHeight=64,
|
||||
toDisplay=OledDisplayMode.TXT,
|
||||
flip=False,
|
||||
)
|
||||
keyboard.extensions.append(oled_ext)
|
||||
|
||||
led_ext = LED(
|
||||
led_pin=[
|
||||
board.D0,
|
||||
],
|
||||
brightness=100,
|
||||
brightness_step=5,
|
||||
brightness_limit=100,
|
||||
breathe_center=1.5,
|
||||
animation_mode=AnimationModes.STATIC,
|
||||
animation_speed=1,
|
||||
user_animation=None,
|
||||
val=100,
|
||||
)
|
||||
keyboard.extensions.append(led_ext)
|
||||
|
||||
# WS2812B LED strips on the back
|
||||
underglow = RGB(
|
||||
pixel_pin=board.D10,
|
||||
num_pixels=6,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(underglow)
|
||||
|
||||
# Neopixel on XIAO RP2040
|
||||
frontglow = RGB(
|
||||
pixel_pin=board.NEOPIXEL,
|
||||
num_pixels=1,
|
||||
val_limit=100,
|
||||
val_default=25,
|
||||
animation_mode=AnimationModes.RAINBOW,
|
||||
)
|
||||
keyboard.extensions.append(frontglow)
|
||||
|
||||
keyboard.col_pins = (board.D6, board.D8, board.D9)
|
||||
keyboard.row_pins = (board.D1, board.D2, board.D3, board.D7)
|
||||
keyboard.diode_orientation = DiodeOrientation.COL2ROW
|
||||
|
||||
media_keys = MediaKeys()
|
||||
keyboard.extensions.append(media_keys)
|
||||
|
||||
# Matrix 4x3 keymap, 12 keys in total
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.N1,
|
||||
KC.N2,
|
||||
KC.N3,
|
||||
KC.N4,
|
||||
KC.N5,
|
||||
KC.N6,
|
||||
KC.N7,
|
||||
KC.N8,
|
||||
KC.N9,
|
||||
KC.N0,
|
||||
KC.A,
|
||||
KC.B,
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
16
boards/atreus62/README.md
Normal file
16
boards/atreus62/README.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Atreus62
|
||||
|
||||
![Atreus62](https://assets.bigcartel.com/product_images/189335282/BIlqCtd.jpg?auto=format&fit=max&w=1200)
|
||||
|
||||
Atreus62 is a 60% column staggered keyboard pinky stagger
|
||||
|
||||
kb.py is designed to work with the Teensy 4.1
|
||||
|
||||
Retailers (USA)
|
||||
[Atreus62](https://shop.profetkeyboards.com/product/atreus62-keyboard)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [Encoder](/docs/en/encoder.md) Twist control for all the things
|
||||
|
26
boards/atreus62/kb.py
Normal file
26
boards/atreus62/kb.py
Normal file
@ -0,0 +1,26 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.D24,
|
||||
board.D25,
|
||||
board.D26,
|
||||
board.D27,
|
||||
board.D28,
|
||||
board.D29,
|
||||
board.D30,
|
||||
board.D31,
|
||||
board.D32,
|
||||
board.D33,
|
||||
board.D34,
|
||||
board.D35,
|
||||
)
|
||||
|
||||
row_pins = (board.D3, board.D4, board.D5, board.D6, board.D7, board.D8)
|
||||
|
||||
diode_orientation = DiodeOrientation.ROWS
|
||||
# diode_orientation = DiodeOrientation.COLUMNS
|
223
boards/atreus62/main.py
Normal file
223
boards/atreus62/main.py
Normal file
@ -0,0 +1,223 @@
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.handlers.sequences import send_string, simple_key_sequence
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
# local_increment = None
|
||||
# local_decrement = None
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# custom keys used for encoder actions
|
||||
Zoom_in = KC.LCTRL(KC.EQUAL)
|
||||
Zoom_out = KC.LCTRL(KC.MINUS)
|
||||
|
||||
# standard filler keys
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
|
||||
layers_ext = Layers()
|
||||
|
||||
# 1 encoder, no button, inversed = True
|
||||
encoder_ext = EncoderHandler(
|
||||
(board.D40, board.D41, None, True),
|
||||
)
|
||||
keyboard.modules = [layers_ext, encoder_ext]
|
||||
|
||||
keyboard.tap_time = 250
|
||||
keyboard.debug_enabled = False
|
||||
|
||||
|
||||
# custom keys
|
||||
NEW = KC.LCTL(KC.N)
|
||||
NEW_DIR = KC.LCTL(KC.LSFT(KC.N))
|
||||
CAD = KC.LCTL(KC.LALT(KC.DEL))
|
||||
RES = KC.LCTL(KC.LSFT(KC.ESC))
|
||||
FE = KC.LGUI(KC.E)
|
||||
LT1_DEL = KC.LT(1, KC.DEL)
|
||||
LT2_ENT = KC.LT(2, KC.ENT)
|
||||
SAVE_AS = KC.LCTL(KC.LSFT(KC.S))
|
||||
PSCR = KC.LGUI(KC.PSCR)
|
||||
SNIP = simple_key_sequence(
|
||||
(
|
||||
KC.LGUI,
|
||||
KC.MACRO_SLEEP_MS(25),
|
||||
KC.S,
|
||||
KC.N,
|
||||
KC.I,
|
||||
KC.P,
|
||||
KC.MACRO_SLEEP_MS(25),
|
||||
KC.ENT,
|
||||
)
|
||||
)
|
||||
|
||||
# programming layer keys
|
||||
UINT = simple_key_sequence(
|
||||
(
|
||||
KC.U,
|
||||
KC.I,
|
||||
KC.N,
|
||||
KC.T,
|
||||
)
|
||||
)
|
||||
INT = simple_key_sequence(
|
||||
(
|
||||
KC.I,
|
||||
KC.N,
|
||||
KC.T,
|
||||
)
|
||||
)
|
||||
DOUBLE = simple_key_sequence(
|
||||
(
|
||||
KC.D,
|
||||
KC.O,
|
||||
KC.U,
|
||||
KC.B,
|
||||
KC.L,
|
||||
KC.E,
|
||||
)
|
||||
)
|
||||
BOOL = simple_key_sequence(
|
||||
(
|
||||
KC.B,
|
||||
KC.O,
|
||||
KC.O,
|
||||
KC.L,
|
||||
)
|
||||
)
|
||||
BYTE = simple_key_sequence(
|
||||
(
|
||||
KC.B,
|
||||
KC.Y,
|
||||
KC.T,
|
||||
KC.E,
|
||||
)
|
||||
)
|
||||
SBYTE = simple_key_sequence(
|
||||
(
|
||||
KC.S,
|
||||
KC.B,
|
||||
KC.Y,
|
||||
KC.T,
|
||||
KC.E,
|
||||
)
|
||||
)
|
||||
CHAR = simple_key_sequence(
|
||||
(
|
||||
KC.C,
|
||||
KC.H,
|
||||
KC.A,
|
||||
KC.R,
|
||||
)
|
||||
)
|
||||
GETSET = simple_key_sequence(
|
||||
(
|
||||
KC.LBRC,
|
||||
KC.SPC,
|
||||
KC.G,
|
||||
KC.E,
|
||||
KC.T,
|
||||
KC.SCLN,
|
||||
KC.SPC,
|
||||
KC.S,
|
||||
KC.E,
|
||||
KC.T,
|
||||
KC.SCLN,
|
||||
KC.SPC,
|
||||
KC.RBRC,
|
||||
)
|
||||
)
|
||||
PUBLIC = simple_key_sequence(
|
||||
(
|
||||
KC.P,
|
||||
KC.U,
|
||||
KC.B,
|
||||
KC.L,
|
||||
KC.I,
|
||||
KC.C,
|
||||
)
|
||||
)
|
||||
DEBUGWL = simple_key_sequence(
|
||||
(
|
||||
KC.LSFT(KC.D),
|
||||
KC.E,
|
||||
KC.B,
|
||||
KC.U,
|
||||
KC.G,
|
||||
KC.DOT,
|
||||
KC.LSFT(KC.W),
|
||||
KC.R,
|
||||
KC.I,
|
||||
KC.T,
|
||||
KC.E,
|
||||
KC.LSFT(KC.L),
|
||||
KC.I,
|
||||
KC.N,
|
||||
KC.E,
|
||||
KC.LSFT(KC.N9),
|
||||
)
|
||||
)
|
||||
PRINT = simple_key_sequence(
|
||||
(
|
||||
KC.P,
|
||||
KC.R,
|
||||
KC.I,
|
||||
KC.N,
|
||||
KC.T,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# make keymap
|
||||
keyboard.keymap = [
|
||||
[ # qwerty
|
||||
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.MINS,
|
||||
KC.CAPS, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.PSLS,
|
||||
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
|
||||
KC.TRNS, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, FE,
|
||||
KC.BSPC, KC.DEL, KC.LALT, KC.LSFT, KC.LCTL, KC.BSPC, KC.SPC, KC.ENT, KC.RSFT, KC.RCTL, KC.ENT, KC.RGUI,
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MO(1), KC.MO(2), KC.MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
],
|
||||
[ # navnum
|
||||
KC.TRNS, SAVE_AS, PSCR, SNIP, KC.LGUI, NEW_DIR, KC.PSLS, KC.RGUI, KC.NO, KC.NO, KC.NO, KC.MINS,
|
||||
KC.BSLS, KC.NO, KC.HOME, KC.UP, KC.END, NEW, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.BSLS,
|
||||
KC.F2, KC.NO, KC.LEFT, KC.DOWN, KC.RGHT, KC.HASH, KC.N0, KC.N1, KC.N2, KC.N3, KC.N4, KC.QUOT,
|
||||
KC.LSFT, KC.NO, KC.NO, KC.NO, KC.TAB, KC.UNDS, KC.MINS, KC.PPLS, KC.MINS, KC.PAST, KC.PSLS, KC.LBRC,
|
||||
KC.BSPC, KC.NO, KC.NO, KC.NO, KC.NO, KC.TRNS, KC.SPC, KC.EQL, KC.N0, KC.DOT, KC.ENT, KC.RGUI,
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.TRNS, KC.TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
],
|
||||
[ # sym/prog
|
||||
KC.TRNS, KC.NO, KC.NO, KC.NO, KC.F2, KC.AMPR, PRINT, DEBUGWL, SAVE_AS, KC.NO, KC.NO, KC.NO,
|
||||
KC.BSLS, KC.NO, KC.NO, KC.LCBR, KC.RCBR, KC.AT, INT, GETSET, KC.UP, KC.NO, KC.NO, KC.NO,
|
||||
KC.TAB, KC.NO, KC.NO, KC.LPRN, KC.RPRN, KC.DLR, BOOL, KC.LEFT, KC.DOWN, KC.RGHT, KC.NO, KC.NO,
|
||||
KC.LSFT, KC.NO, KC.NO, KC.LBRC, KC.RBRC, KC.PERC, UINT, DOUBLE, KC.NO, KC.NO, KC.NO, KC.NO,
|
||||
KC.BSPC, KC.LGUI, KC.LALT, KC.LSFT, KC.LCTL, KC.DEL, KC.TRNS, PUBLIC, KC.RCTL, KC.RALT, KC.ENT, KC.RESET,
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.TRNS, KC.TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
],
|
||||
]
|
||||
|
||||
|
||||
# for use in the encoder extension
|
||||
encoder_map = [
|
||||
[
|
||||
(
|
||||
KC.VOLU,
|
||||
KC.VOLD,
|
||||
None,
|
||||
), # Only 1 encoder is being used, so only one tuple per layer is required
|
||||
],
|
||||
[
|
||||
(Zoom_in, Zoom_out, None),
|
||||
],
|
||||
[
|
||||
(_______, _______, None), # no action taken by the encoder on this layer
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
21
boards/boardsource/3x4/README.md
Normal file
21
boards/boardsource/3x4/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Boardsource 3x4
|
||||
|
||||
![Boardsource3x4](https://boardsource.imgix.net/30171267-d988-46cc-ba03-9f6a8ab96487.jpg?raw=true)
|
||||
|
||||
This macro pad / small 12 key was inspired by the plaid look
|
||||
|
||||
kb.py is designed to work with the nice!nano
|
||||
|
||||
Retailers (USA)
|
||||
[Boardsource](https://boardsource.xyz/store/5ecc2008eee64242946c98c1)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
12
boards/boardsource/3x4/kb.py
Normal file
12
boards/boardsource/3x4/kb.py
Normal file
@ -0,0 +1,12 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (pins[16], pins[17], pins[18])
|
||||
col_pins = (pins[12], pins[13], pins[14], pins[15])
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
31
boards/boardsource/3x4/main.py
Normal file
31
boards/boardsource/3x4/main.py
Normal file
@ -0,0 +1,31 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
layers_ext = Layers()
|
||||
keyboard.modules = [layers_ext]
|
||||
|
||||
RAISE = KC.MO(1)
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #Base
|
||||
KC.N0, KC.N1, KC.N4, KC.N7,
|
||||
KC.ENT, KC.N2, KC.N5, KC.N8,
|
||||
RAISE, KC.N3, KC.N6, KC.N9
|
||||
],
|
||||
[ #RAISE
|
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, _______
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
28
boards/boardsource/4x12/README.md
Normal file
28
boards/boardsource/4x12/README.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Boardsource 4x12 Ortho
|
||||
|
||||
![Boardsource4x12](https://boardsource.imgix.net/164c3388-5057-46c8-8fcd-82c58c7870ce.jpg?raw=true)
|
||||
![Boardsource4x12LP](https://boardsource.imgix.net/c2108ea4-7d70-4327-b4b4-88c8191b1369.jpg?raw=true)
|
||||
|
||||
The 4x12 ortholinear keyboard is an extremely common and beloved layout within
|
||||
the keyboard community. Made popular by Jack's Planck from OLKB, the 4x12
|
||||
ortholinear layout is possibly the most popular non-staggered layout available.
|
||||
|
||||
Retailers (USA)
|
||||
4x12
|
||||
[Boardsource](https://boardsource.xyz/store/5ecb78d286879c9a0c22dafd )
|
||||
Low profile 4x12
|
||||
[Boardsource](https://boardsource.xyz/store/5ecb7dad86879c9a0c22db32)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
25
boards/boardsource/4x12/kb.py
Normal file
25
boards/boardsource/4x12/kb.py
Normal file
@ -0,0 +1,25 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (board.pins[1], pins[0], board.pins[4], board.pins[5])
|
||||
col_pins = (
|
||||
board.pins[19],
|
||||
board.pins[18],
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
board.pins[14],
|
||||
board.pins[13],
|
||||
board.pins[12],
|
||||
board.pins[11],
|
||||
board.pins[10],
|
||||
board.pins[9],
|
||||
board.pins[8],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
44
boards/boardsource/4x12/main.py
Normal file
44
boards/boardsource/4x12/main.py
Normal file
@ -0,0 +1,44 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
media = MediaKeys()
|
||||
layers_ext = Layers()
|
||||
|
||||
keyboard.extensions = [media]
|
||||
keyboard.modules = [layers_ext]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #QWERTY
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
|
||||
KC.ESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT ,
|
||||
KC.PIPE, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
|
||||
],
|
||||
[ #LOWER
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
|
||||
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
|
||||
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, KC.PGUP, KC.PGDN, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
|
||||
],
|
||||
[ #RAISE
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,
|
||||
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
|
||||
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, _______, _______, KC.HOME, KC.END, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
31
boards/boardsource/5x12/README.md
Normal file
31
boards/boardsource/5x12/README.md
Normal file
@ -0,0 +1,31 @@
|
||||
# Boardsource 5x12 Ortho
|
||||
|
||||
![Boardsource5x12](https://boardsource.imgix.net/74abb511-792e-42d9-9f6e-8100c521b2e0.jpg?raw=true)
|
||||
![Boardsource5x12LP](https://boardsource.imgix.net/57ad3f69-3c88-4ae8-9592-6e4d2f45a58e.jpg?raw=true)
|
||||
|
||||
5x12 ortholinear -- for when just really don't want to give up your number row.
|
||||
The 5x12 ortholinear keyboard is a common ortholinear layout that many people
|
||||
prefer because it includes a number row. Made popular by Jack's Preonic from
|
||||
OLKB, the 5x12 ortholinear layout is a great option for those who want to try
|
||||
ortholinear but feel they aren't ready to make the jump to a 40%. The 5x12 Ortho
|
||||
is an approachable keyboard with hotswap compatibility.
|
||||
|
||||
Retailers (USA)
|
||||
5x12
|
||||
[Boardsource](https://boardsource.xyz/store/5ecb802c86879c9a0c22db61)
|
||||
Low Profile 5x12
|
||||
[Boardsource](https://boardsource.xyz/store/5ecb822386879c9a0c22db84)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
25
boards/boardsource/5x12/kb.py
Normal file
25
boards/boardsource/5x12/kb.py
Normal file
@ -0,0 +1,25 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (board.pins[1], pins[0], board.pins[4], board.pins[5], board.pins[6])
|
||||
col_pins = (
|
||||
board.pins[19],
|
||||
board.pins[18],
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
board.pins[14],
|
||||
board.pins[13],
|
||||
board.pins[12],
|
||||
board.pins[11],
|
||||
board.pins[10],
|
||||
board.pins[9],
|
||||
board.pins[8],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
i2c = board.I2C
|
47
boards/boardsource/5x12/main.py
Normal file
47
boards/boardsource/5x12/main.py
Normal file
@ -0,0 +1,47 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
media = MediaKeys()
|
||||
layers_ext = Layers()
|
||||
|
||||
keyboard.modules = [layers_ext]
|
||||
keyboard.extensions = [media]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #QWERTY
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.DEL,
|
||||
KC.ESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
|
||||
KC.PIPE, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
|
||||
],
|
||||
[ #LOWER
|
||||
KC.ESC, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.UP, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, KC.LEFT, KC.DOWN, KC.RGHT, _______, _______,
|
||||
KC.CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
|
||||
],
|
||||
[ #RAISE
|
||||
KC.GRV, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
|
||||
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
_______, KC.N4, KC.N5, KC.N6, KC.PLUS, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, _______,
|
||||
KC.ENT, KC.N7, KC.N8, KC.N9, KC.MINS, KC.F11, KC.F12, KC.NUHS, KC.NUBS, KC.MUTE, _______, KC.BSLS,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
21
boards/boardsource/Lulu/README.md
Normal file
21
boards/boardsource/Lulu/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Lulu
|
||||
|
||||
![Lulu](https://boardsource.imgix.net/c93fba70-71bc-11ec-bb73-09003ca81902.jpg?raw=true)
|
||||
|
||||
Based on the form factor of the Lily58, but with new features. The Lulu is a 58 key split keyboard design by Boardsource, featuring a 6x4 columnar stagger and 4 thumb cluster keys on each hand. The Lulu is a perfect choice for people who want to be on a split keyboard but still want to have a fairly standard amount of keys, and a premium case avaliable.
|
||||
|
||||
Hardware Availability: [PCB & Case Source](https://boardsource.xyz/store/5ec9df84c6b834480de6c3d0)
|
||||
kb.py is designed to work with the PCBA version directly from them.
|
||||
|
||||
Retailers (USA)
|
||||
[Boardsource](https://boardsource.xyz/store/5ec9df84c6b834480de6c3d0)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Split](/docs/en/split.md) Connects halves using a wire.
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [PEG_RGB](/docs/en/peg_rgb_matrix.md) Light it up!
|
||||
- [PEG_OLED](/docs/en/peg_oled_display.md) Screens to see things on of course.
|
||||
|
||||
Common Extensions
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life.
|
||||
- [BLE_Split](/docs/en/split.md) Connects halves without wires (For the DIY version)
|
73
boards/boardsource/Lulu/kb.py
Normal file
73
boards/boardsource/Lulu/kb.py
Normal file
@ -0,0 +1,73 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners.encoder import RotaryioEncoder
|
||||
from kmk.scanners.keypad import MatrixScanner
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
def __init__(self):
|
||||
# create and register the scanner
|
||||
self.matrix = [
|
||||
MatrixScanner(
|
||||
# required arguments:
|
||||
column_pins = self.col_pins,
|
||||
row_pins = self.row_pins,
|
||||
# optional arguments with defaults:
|
||||
columns_to_anodes=DiodeOrientation.COL2ROW,
|
||||
interval=0.02,
|
||||
max_events=64
|
||||
),
|
||||
RotaryioEncoder(
|
||||
pin_a=board.GP08,
|
||||
pin_b=board.GP09,
|
||||
# optional
|
||||
divisor=4,
|
||||
)
|
||||
]
|
||||
col_pins = (
|
||||
board.GP02,
|
||||
board.GP03,
|
||||
board.GP04,
|
||||
board.GP05,
|
||||
board.GP06,
|
||||
board.GP07,
|
||||
)
|
||||
row_pins = (board.GP14, board.GP15, board.GP16, board.GP17, board.GP18)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rx = board.RX
|
||||
tx = board.TX
|
||||
rgb_pixel_pin = board.GP29
|
||||
i2c = board.I2C
|
||||
data_pin = board.RX
|
||||
rgb_pixel_pin = board.GP29
|
||||
i2c = board.I2C
|
||||
SCL=board.SCL
|
||||
SDA=board.SDA
|
||||
encoder_a=board.GP08
|
||||
encoder_b=board.GP09
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
led_key_pos =[11,10,9 ,8 ,7 ,6 , 41,42,43,44,45,46,
|
||||
12,13,14,15,16,17, 52,51,50,49,48,47,
|
||||
23,22,21,20,19,18, 53,54,55,56,57,58,
|
||||
24,25,26,27,28,29,30,65,64,63,62,61,60,59,
|
||||
34,33,32,31,66,67,68,69,
|
||||
3 ,4 ,5 , 40,39,38,
|
||||
2 ,1 ,0 , 35,36,37
|
||||
]
|
||||
brightness_limit = 0.5
|
||||
num_pixels = 70
|
||||
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 37, 36, 35, 34, 33, 32,
|
||||
6, 7, 8, 9, 10, 11, 43, 42, 41, 40, 39, 38,
|
||||
12, 13, 14, 15, 16, 17, 49, 48, 47, 46, 45, 44,
|
||||
18, 19, 20, 21, 22, 23, 29, 61, 55, 54, 53, 52, 51, 50,
|
||||
25,26, 27, 28, 60, 59, 58, 57,
|
||||
30,31, 62,63
|
||||
]
|
||||
|
230
boards/boardsource/Lulu/main.py
Normal file
230
boards/boardsource/Lulu/main.py
Normal file
@ -0,0 +1,230 @@
|
||||
import supervisor
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.peg_oled_Display import (
|
||||
Oled,
|
||||
OledData,
|
||||
OledDisplayMode,
|
||||
OledReactionType,
|
||||
)
|
||||
from kmk.extensions.peg_rgb_matrix import Rgb_matrix
|
||||
from kmk.handlers.sequences import send_string
|
||||
from kmk.hid import HIDModes
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.holdtap import HoldTap
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
holdtap = HoldTap()
|
||||
layers_ext = Layers()
|
||||
keyboard.modules.append(layers_ext)
|
||||
keyboard.modules.append(holdtap)
|
||||
|
||||
oled_ext = Oled(
|
||||
OledData(
|
||||
corner_one={0: OledReactionType.STATIC, 1: ['qwertyzzzz']},
|
||||
corner_two={
|
||||
0: OledReactionType.LAYER,
|
||||
1: ['1', '2', '3', '4', '5', '6', '7', '8'],
|
||||
},
|
||||
corner_three={
|
||||
0: OledReactionType.LAYER,
|
||||
1: ['base', 'raise', 'lower', 'adjust', '5', '6', '7', '8'],
|
||||
},
|
||||
corner_four={
|
||||
0: OledReactionType.LAYER,
|
||||
1: ['qwertyzzz', 'nums', 'shifted', 'leds', '5', '6', '7', '8'],
|
||||
},
|
||||
),
|
||||
toDisplay=OledDisplayMode.TXT,
|
||||
flip=False,
|
||||
)
|
||||
keyboard.extensions.append(oled_ext)
|
||||
|
||||
# Default RGB matrix colours
|
||||
rgb_ext = Rgb_matrix(
|
||||
ledDisplay=[
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
[85, 0, 255],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[0, 255, 234],
|
||||
[85, 0, 255],
|
||||
],
|
||||
split=True,
|
||||
rightSide=False,
|
||||
disable_auto_write=True,
|
||||
)
|
||||
keyboard.extensions.append(rgb_ext)
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
# split_side = SplitSide.RIGHT
|
||||
split = Split(data_pin=keyboard.rx, data_pin2=keyboard.tx, uart_flip=False)
|
||||
keyboard.modules.append(split)
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.GRV,
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.MINS,
|
||||
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.LBRC, KC.RBRC, KC.N, KC.M, KC.COMMA, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.LGUI, KC.MO(1), KC.LCTL, KC.SPC, KC.ENT, KC.MO(2), KC.BSPC, KC.RGUI,
|
||||
# Encoders
|
||||
KC.AUDIO_VOL_UP,
|
||||
KC.AUDIO_VOL_DOWN,
|
||||
KC.MEDIA_PREV_TRACK,
|
||||
KC.MEDIA_NEXT_TRACK,
|
||||
],
|
||||
[
|
||||
KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12,
|
||||
KC.TRNS, KC.TRNS, KC.UP, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.EQL, KC.TRNS,
|
||||
KC.TRNS, KC.LEFT, KC.DOWN, KC.RGHT, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.DEL, KC.TRNS,
|
||||
# Encoders
|
||||
KC.AUDIO_VOL_UP,
|
||||
KC.AUDIO_VOL_DOWN,
|
||||
KC.MEDIA_PREV_TRACK,
|
||||
KC.MEDIA_NEXT_TRACK,
|
||||
],
|
||||
[
|
||||
KC.N2, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.TILD,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PLUS, KC.UNDS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.COLN, KC.DQT,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.LCBR, KC.RCBR, KC.TRNS, KC.TRNS, KC.LABK, KC.RABK, KC.QUES, KC.TRNS,
|
||||
KC.LGUI, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.AUDIO_VOL_UP,
|
||||
KC.AUDIO_VOL_DOWN,
|
||||
KC.MEDIA_PREV_TRACK,
|
||||
KC.MEDIA_NEXT_TRACK,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
# Encoders
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
# Encoders
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
# Encoders
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
# Encoders
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
],
|
||||
[
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
# Encoders
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
KC.TRNS,
|
||||
],
|
||||
]
|
||||
if __name__ == '__main__':
|
||||
keyboard.go(hid_type=HIDModes.USB)
|
27
boards/boardsource/microdox/README.md
Normal file
27
boards/boardsource/microdox/README.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Microdox
|
||||
|
||||
![microdox](https://boardsource.imgix.net/337ae65a-d061-46a4-b119-9916b043c58f.jpg?raw=true)
|
||||
|
||||
The Microdox is is a feature-packed 30% split columnar staggered keyboard. Even
|
||||
though the Microdox is an extremely small keyboard it offers tons of features
|
||||
from larger boards while maintaining a tiny footprint.
|
||||
|
||||
Retailers (USA)
|
||||
[Boardsource](https://boardsource.xyz/store/5f2e7e4a2902de7151494f92)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [BLE_Split](/docs/en/split_keyboards.md) Connects halves without wires
|
||||
- [HoldTap](/docs/en/holdtap.md) Allows mod keys to act as different keys when tapped.
|
||||
|
||||
Common Extensions
|
||||
- [Split](/docs/en/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/enpower.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
31
boards/boardsource/microdox/kb.py
Normal file
31
boards/boardsource/microdox/kb.py
Normal file
@ -0,0 +1,31 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.pins[19],
|
||||
board.pins[18],
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
)
|
||||
row_pins = (board.pins[13], board.pins[12], board.pins[10], board.pins[11])
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
data_pin = board.pins[1]
|
||||
rgb_pixel_pin = pins[0]
|
||||
rgb_num_pixels = 12
|
||||
i2c = board.I2C
|
||||
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 20, 21, 22, 23, 24,
|
||||
5, 6, 7, 8, 9, 25, 26, 27, 28, 29,
|
||||
10, 11, 12, 13, 14, 30, 31, 32, 33, 34,
|
||||
17, 18, 19, 35, 36, 37,
|
||||
]
|
55
boards/boardsource/microdox/main.py
Normal file
55
boards/boardsource/microdox/main.py
Normal file
@ -0,0 +1,55 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(split_type=SplitType.BLE, split_side=split_side)
|
||||
|
||||
layers_ext = Layers()
|
||||
|
||||
keyboard.modules = [layers_ext, split]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
LOWER = KC.MO(2)
|
||||
RAISE = KC.MO(1)
|
||||
|
||||
RGB_TOG = KC.RGB_TOG
|
||||
RGB_HUI = KC.RGB_HUI
|
||||
RGB_HUD = KC.RGB_HUI
|
||||
RGB_SAI = KC.RGB_SAI
|
||||
RGB_SAD = KC.RGB_SAD
|
||||
RGB_VAI = KC.RGB_VAI
|
||||
RGB_VAD = KC.RGB_VAD
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #QWERTY
|
||||
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,\
|
||||
KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN,\
|
||||
KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH,\
|
||||
KC.LCTL, LOWER, KC.SPC, KC.BSPC, RAISE, KC.ENT,
|
||||
],
|
||||
[ #RAISE
|
||||
KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0,\
|
||||
KC.TAB, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT, XXXXXXX, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC,\
|
||||
KC.LCTL, KC.GRV, KC.LGUI, KC.LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.BSLS, KC.QUOT,\
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
],
|
||||
[ #LOWER
|
||||
KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN,\
|
||||
KC.ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR,\
|
||||
KC.CAPS, KC.TILD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.PIPE, KC.DQT,\
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, KC.ENT, XXXXXXX, KC.DEL
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
33
boards/crkbd/README.md
Normal file
33
boards/crkbd/README.md
Normal file
@ -0,0 +1,33 @@
|
||||
# Corne Keyboard (CRKBD)
|
||||
|
||||
![Crkbd](https://boardsource.imgix.net/a90342e3-caa0-467c-bebd-d17f031d5210.jpg?raw=true)
|
||||
|
||||
![Crkbd](https://boardsource.imgix.net/9cbd31b7-3b37-42c6-919e-3be35a2578f6.jpg?raw=true)
|
||||
|
||||
A split keyboard with a 3x6 columnar stagger and 3 thumb keys.
|
||||
|
||||
Hardware Availability: [PCB & Case Source](https://github.com/foostan/crkbd)
|
||||
|
||||
Retailers (USA)
|
||||
Corne
|
||||
[Boardsource](https://boardsource.xyz/store/5ecc0f81eee64242946c988f)
|
||||
|
||||
Corne LP
|
||||
[Boardsource](https://boardsource.xyz/store/5f2efc462902de7151495057)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/en/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](/docs/en/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
35
boards/crkbd/kb.py
Normal file
35
boards/crkbd/kb.py
Normal file
@ -0,0 +1,35 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
pins[19],
|
||||
pins[18],
|
||||
pins[17],
|
||||
pins[16],
|
||||
pins[15],
|
||||
pins[14],
|
||||
)
|
||||
row_pins = (
|
||||
pins[6],
|
||||
pins[7],
|
||||
pins[8],
|
||||
pins[9],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
data_pin = pins[1]
|
||||
rgb_pixel_pin = pins[0]
|
||||
i2c = board.I2C
|
||||
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
|
||||
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
|
||||
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
|
||||
21, 22, 23, 47, 46, 45,
|
||||
]
|
68
boards/crkbd/main.py
Normal file
68
boards/crkbd/main.py
Normal file
@ -0,0 +1,68 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# Adding extensions
|
||||
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=27, val_limit=100, hue_default=190, sat_default=100, val_default=5)
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(split_type=SplitType.BLE, split_side=split_side)
|
||||
|
||||
layers_ext = Layers()
|
||||
|
||||
keyboard.modules = [layers_ext, split]
|
||||
keyboard.extensions = [rgb]
|
||||
#
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
ADJUST = KC.LT(3, KC.SPC)
|
||||
|
||||
RGB_TOG = KC.RGB_TOG
|
||||
RGB_HUI = KC.RGB_HUI
|
||||
RGB_HUD = KC.RGB_HUI
|
||||
RGB_SAI = KC.RGB_SAI
|
||||
RGB_SAD = KC.RGB_SAD
|
||||
RGB_VAI = KC.RGB_VAI
|
||||
RGB_VAD = KC.RGB_VAD
|
||||
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #QWERTY
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
|
||||
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
],
|
||||
[ #LOWER
|
||||
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,\
|
||||
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, XXXXXXX, XXXXXXX,\
|
||||
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
],
|
||||
[ #RAISE
|
||||
KC.ESC, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,\
|
||||
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.EQL, KC.LCBR, KC.RCBR, KC.PIPE, KC.GRV,\
|
||||
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
],
|
||||
[ #ADJUST
|
||||
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
|
||||
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
8
boards/crowboard/README.md
Normal file
8
boards/crowboard/README.md
Normal file
@ -0,0 +1,8 @@
|
||||
# Crowboard
|
||||
![crowboard](https://i.imgur.com/Rg7IYPw.jpg)
|
||||
Single Board 34/36 Key Keyboard Based on Raspberry pi Pico
|
||||
|
||||
[Link to the Github repo](https://github.com/doesntfazer/CrowBoard)
|
||||
|
||||
|
||||
You can Buy this keyboard at KeyboardDweebs.net
|
26
boards/crowboard/kb.py
Normal file
26
boards/crowboard/kb.py
Normal file
@ -0,0 +1,26 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.GP6,
|
||||
board.GP7,
|
||||
board.GP8,
|
||||
board.GP9,
|
||||
board.GP10,
|
||||
board.GP18,
|
||||
board.GP19,
|
||||
board.GP20,
|
||||
board.GP21,
|
||||
board.GP22,
|
||||
)
|
||||
row_pins = (
|
||||
board.GP14,
|
||||
board.GP15,
|
||||
board.GP16,
|
||||
board.GP17,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
92
boards/crowboard/main.py
Normal file
92
boards/crowboard/main.py
Normal file
@ -0,0 +1,92 @@
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.holdtap import HoldTap
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
keyboard.modules.append(Layers())
|
||||
|
||||
holdtap = HoldTap()
|
||||
keyboard.modules.append(holdtap)
|
||||
|
||||
|
||||
NONE = KC.NO
|
||||
QWERTY = KC.MO(0)
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
ADJUST = KC.MO(3)
|
||||
CAE = KC.LCTL(KC.LALT(KC.END))
|
||||
CAD = KC.LCTL(KC.LALT(KC.DEL))
|
||||
|
||||
|
||||
|
||||
ZSFT = KC.HT(KC.Z, KC.LSFT, prefer_hold=True, tap_interrupted=False, tap_time=3000)
|
||||
SLSHSFT = KC.HT(KC.SLSH, KC.LSFT, prefer_hold=True, tap_interrupted=False, tap_time=3000)
|
||||
ALCTL = KC.HT(KC.A, KC.LCTRL, prefer_hold=False, tap_interrupted=False, tap_time=150)
|
||||
|
||||
# flake8: noqa: E261
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,
|
||||
ALCTL, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.QUOT,
|
||||
ZSFT, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, SLSHSFT,
|
||||
NONE, NONE, KC.LCTL, LOWER, KC.SPACE, KC.BSPC, RAISE, KC.RALT, NONE, NONE,
|
||||
|
||||
],
|
||||
[ # LOWER
|
||||
KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0,
|
||||
KC.TAB, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, KC.TRNS, KC.MINUS, KC.EQUAL, KC.LBRC, KC.RBRC,
|
||||
KC.LCTL, KC.GRAVE, KC.LGUI, KC.LALT, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.BSLS, KC.SCLN,
|
||||
KC.NO, KC.NO, KC.TRNS, KC.TRNS, KC.TRNS, KC.ENTER, ADJUST, KC.TRNS, KC.NO, KC.NO,
|
||||
|
||||
],
|
||||
[ # RAISE
|
||||
KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN,
|
||||
KC.ESC, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR,
|
||||
KC.CAPS, KC.TILDE, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PIPE, KC.COLN,
|
||||
KC.NO, KC.NO, KC.TRNS, ADJUST, KC.TRNS, KC.ENTER, KC.TRNS, KC.DEL, KC.NO, KC.NO,
|
||||
|
||||
],
|
||||
[ # ADJUST
|
||||
KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10,
|
||||
KC.F11, KC.F12, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, CAE, CAD, CAD,
|
||||
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
|
||||
KC.NO, KC.NO, KC.TRNS, KC.TRNS, KC.TRNS, KC.ENTER, KC.TRNS, KC.TRNS, KC.NO, KC.NO,
|
||||
|
||||
]
|
||||
]
|
||||
|
||||
# Uncomment for Trackball
|
||||
# from kmk.modules.pimoroni_trackball import Trackball, TrackballMode
|
||||
# import busio as io
|
||||
|
||||
# i2c1 = io.I2C(scl=board.GP3, sda=board.GP2)
|
||||
# trackball = Trackball(i2c1, mode=TrackballMode.MOUSE_MODE)
|
||||
# keyboard.modules.append(trackball)
|
||||
# trackball.set_rgbw(255, 255, 255, 30)
|
||||
# trackball.set_red(20)
|
||||
# trackball.set_green(100)
|
||||
# trackball.set_blue(100)
|
||||
# trackball.set_white(40)
|
||||
|
||||
# uncomment for Encoders
|
||||
# from kmk.modules.encoder import EncoderHandler
|
||||
# encoder_handler = EncoderHandler()
|
||||
# keyboard.modules = [encoder_handler]
|
||||
# encoder_handler.pins = ((board.GP12, board.GP13, None, False), (board.GP27, board.GP26, None, False),)
|
||||
|
||||
# encoder_handler.map = [(( KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 1
|
||||
# ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 2
|
||||
# ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 3
|
||||
# ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 4
|
||||
# ]
|
||||
|
||||
# keyboard.debug_enabled = True
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
39
boards/ergo_travel/README.md
Normal file
39
boards/ergo_travel/README.md
Normal file
@ -0,0 +1,39 @@
|
||||
# Ergo Travel
|
||||
|
||||
![ergo_travel](https://boardsource.imgix.net/fa53de62-fd37-4c75-8c5b-b4bec37927c1.jpg?raw=true)
|
||||
|
||||
As the name implies, the Ergo Travel was originally designed as a travel
|
||||
keyboard, but it works just as well on your desk as a main daily use keyboard.
|
||||
The Ergo Travel is a popular choice by many because it offers a few more keys
|
||||
than other keyboards in similar sizes, and that is why we chose to stock it.
|
||||
Additionally, the Ergo Travel has nice customization options in the thumb
|
||||
cluster because you can configure the main thumb key to use a single larger 2u
|
||||
key, or two smaller 1u keys depending on your preference. The clean and simple
|
||||
aesthetic of the Ergo Travel and the few extra keys make it an awesome option
|
||||
for people wanting a 40%-ish split keyboard.
|
||||
|
||||
Hardware Availability: [PCB & Case Source](https://github.com/jpconstantineau/ErgoTravel/blob/master/OrderingInstructions.md)
|
||||
|
||||
Retailers (USA)
|
||||
[Boardsource](https://boardsource.xyz/store/5eed23430883e03ef9a69d6a)
|
||||
|
||||
Retailers (Canada)
|
||||
[BlueMicro Store (ErgoTravel's creator)](https://store.jpconstantineau.com/#/group/split_boards)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [BLE_Split](/docs/en/split_keyboards.md) Connects halves without wires
|
||||
- [MediaKeys](/docs/en/media_keys.md) Control volume and other media functions
|
||||
|
||||
Common Extensions
|
||||
- [Split](/docs/en/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
34
boards/ergo_travel/kb.py
Normal file
34
boards/ergo_travel/kb.py
Normal file
@ -0,0 +1,34 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (pins[7], pins[8], pins[9], pins[10])
|
||||
col_pins = (
|
||||
pins[17],
|
||||
pins[16],
|
||||
pins[15],
|
||||
pins[14],
|
||||
pins[13],
|
||||
pins[12],
|
||||
pins[10],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
led_pin = pins[9]
|
||||
rgb_pixel_pin = pins[0]
|
||||
rgb_num_pixels = 12
|
||||
data_pin = pins[1]
|
||||
i2c = board.I2C
|
||||
|
||||
# NOQA
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 6, 34, 33, 32, 31, 30, 29, 28,
|
||||
7, 8, 9, 10, 11, 12, 13, 41, 40, 39, 38, 37, 36, 35,
|
||||
14, 15, 16, 17, 18, 19, 20, 48, 47, 46, 45, 44, 43, 42,
|
||||
21, 22, 23, 24, 25, 26, 54, 53, 52, 51, 50, 49,
|
||||
]
|
59
boards/ergo_travel/main.py
Normal file
59
boards/ergo_travel/main.py
Normal file
@ -0,0 +1,59 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modulessplit import Split, SplitSide, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(split_type=SplitType.BLE, split_side=split_side)
|
||||
|
||||
media = MediaKeys()
|
||||
layers_ext = Layers()
|
||||
keyboard.modules = [layers_ext, split]
|
||||
keyboard.extensions = (media)
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
LOWER = KC.MO(1)
|
||||
RAISE = KC.MO(2)
|
||||
ADJUST = KC.MO(3)
|
||||
|
||||
CALTDEL = KC.LCTL(KC.LALT(KC.DEL))
|
||||
TSKMGR = KC.LCTL(KC.LSFT(KC.KC_ESC))
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #QWERTY
|
||||
KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.MINS, KC.EQL, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
|
||||
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.LBRC, KC.RBRC, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.SPC, KC.SPC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,\
|
||||
KC.LCTL, KC.LGUI, KC.LALT, ADJUST, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.UP, KC.DOWN, KC.RGHT\
|
||||
],
|
||||
[ #LOWER
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.HOME, KC.PGUP, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.DEL,\
|
||||
_______, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.END , KC.PGDN, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.BSLS,\
|
||||
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.BSPC, KC.BSPC, KC.F12, _______, _______, KC.MUTE, _______, KC.PIPE,\
|
||||
_______, _______, _______, _______, _______, KC.BSPC, KC.BSPC, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY\
|
||||
],
|
||||
[ #RAISE
|
||||
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, _______, _______, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL, \
|
||||
_______, KC.N4, KC.N5, KC.N6, KC.PLUS, _______, _______, _______, _______, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, _______, \
|
||||
KC.ENT, KC.N7, KC.N8, KC.N9, KC.MINS, _______, _______, _______, _______, KC.NUHS, KC.NUBS, KC.MUTE, _______, KC.BSLS, \
|
||||
_______, KC.COMM, KC.N0, KC.DOT, _______, KC.BSPC, KC.BSPC, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY \
|
||||
],
|
||||
[ #ADJUST
|
||||
TSKMGR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CALTDEL,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
6
boards/ferris_sweep/README.md
Normal file
6
boards/ferris_sweep/README.md
Normal file
@ -0,0 +1,6 @@
|
||||
# Ferris Sweep
|
||||
|
||||
The [Ferris Sweep](https://github.com/davidphilipbarr/Sweep) is a split, 34 key keyboard designed by David Philip Barr. It uses a Pro-Micro footprint.
|
||||
|
||||
It's based in turn on the Ferris by Philip Chevalier.
|
||||
The default keymap is based on the [original Ferris default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ferris/keymaps/default).
|
36
boards/ferris_sweep/kb.py
Normal file
36
boards/ferris_sweep/kb.py
Normal file
@ -0,0 +1,36 @@
|
||||
# Ferris Sweep pinout translated from QMK repo
|
||||
# CreditT: 2018-2020 ENDO Katsuhiro, David Philip Barr, Pierre Chevalier
|
||||
|
||||
import board
|
||||
|
||||
from storage import getmount
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.kb2040 import pinout as pins
|
||||
from kmk.scanners.keypad import KeysScanner
|
||||
|
||||
# GPIO to key mapping - each line is a new row.
|
||||
# fmt: off
|
||||
_KEY_CFG_LEFT = [
|
||||
pins[9], pins[16], pins[17], pins[18], pins[19],
|
||||
pins[15], pins[14], pins[13], pins[12], pins[0],
|
||||
pins[4], pins[5], pins[6], pins[7], pins[8],
|
||||
pins[10], pins[11],
|
||||
]
|
||||
|
||||
|
||||
# fmt: on
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
def __init__(self):
|
||||
# create and register the scanner
|
||||
self.matrix = KeysScanner(_KEY_CFG_LEFT)
|
||||
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 21, 20, 19, 18, 17,
|
||||
5, 6, 7, 8, 9, 26, 25, 24, 23, 22,
|
||||
10, 11, 12, 13, 14, 31, 30, 29, 28, 27,
|
||||
15, 16, 33, 32
|
||||
]
|
115
boards/ferris_sweep/main.py
Normal file
115
boards/ferris_sweep/main.py
Normal file
@ -0,0 +1,115 @@
|
||||
# Replicates default Ferris keymap from QMK
|
||||
# Credit: Pierre Chevalier, 2020
|
||||
# https://github.com/qmk/qmk_firmware/tree/master/keyboards/ferris/keymaps/default
|
||||
|
||||
import board
|
||||
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.holdtap import HoldTap
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.mouse_keys import MouseKeys
|
||||
from kmk.modules.split import Split, SplitSide
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
# split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(
|
||||
# split_flip=True,
|
||||
data_pin=board.D1,
|
||||
split_side=split_side,
|
||||
split_target_left=False,
|
||||
# Using the default wasn't working, try pio
|
||||
use_pio=True,
|
||||
uart_flip=True,
|
||||
)
|
||||
|
||||
layers_ext = Layers()
|
||||
holdtap = HoldTap()
|
||||
mouse_key = MouseKeys()
|
||||
|
||||
|
||||
keyboard.modules = [layers_ext, split, mod_tap, mouse_key]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
|
||||
# Mod-taps
|
||||
A_SFT = KC.HT(KC.A, KC.LSFT)
|
||||
SCLN_SFT = KC.HT(KC.SCLN, KC.LSFT)
|
||||
X_CTL = KC.HT(KC.X, KC.LCTRL)
|
||||
C_ALT = KC.HT(KC.C, KC.LALT)
|
||||
COM_ALT = KC.HT(KC.COMM, KC.LALT)
|
||||
DOT_CTL = KC.HT(KC.DOT, KC.LCTRL)
|
||||
CTL_ALT = KC.LCTRL(KC.LALT)
|
||||
|
||||
|
||||
# Layer tap for other home row keys
|
||||
S_L5 = KC.LT(5, KC.S)
|
||||
D_L1 = KC.LT(1, KC.D)
|
||||
F_L3 = KC.LT(3, KC.F)
|
||||
J_L4 = KC.LT(4, KC.J)
|
||||
K_L2 = KC.LT(2, KC.K)
|
||||
L_L6 = KC.LT(6, KC.L)
|
||||
SPC_L7 = KC.LT(7, KC.SPC)
|
||||
|
||||
# fmt: off
|
||||
# flake8: noqa
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,
|
||||
A_SFT, S_L5, D_L1, F_L3, KC.G, KC.H, J_L4, K_L2, L_L6, SCLN_SFT,
|
||||
KC.Z, X_CTL, C_ALT, KC.V, KC.B, KC.N, KC.M, COM_ALT, DOT_CTL, KC.SLSH,
|
||||
KC.LGUI, KC.BSPC, SPC_L7, KC.ENT,
|
||||
],
|
||||
[ # MOUSE
|
||||
_______, _______, _______, _______, _______, _______, KC.MB_LMB, KC.MW_UP, KC.MB_LMB, _______,
|
||||
_______, KC.MB_RMB, _______, KC.MB_LMB, _______, _______, KC.MS_LT, KC.MS_DN, KC.MS_UP, KC.MS_RT,
|
||||
_______, _______, _______, _______, _______, _______, _______, KC.MW_DN, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
],
|
||||
[ # NAVIGATION
|
||||
_______, _______, KC.PGUP, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC.LEFT, KC.UP, KC.DOWN, KC.RGHT, _______, _______, KC.LGUI, CTL_ALT, KC.MEH, KC.HYPR,
|
||||
_______, KC.HOME, KC.PGDN, KC.END, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
],
|
||||
[ # RIGHT SYMBOLS
|
||||
_______, _______, _______, _______, _______, _______, KC.UNDS, KC.PIPE, KC.QUOT, _______,
|
||||
KC.CIRC, KC.ASTR, KC.AMPR, _______, _______, KC.HASH, KC.TILD, KC.SLSH, KC.DQUO, KC.DLR,
|
||||
_______, _______, _______, _______, _______, _______, KC.MINS, KC.BSLS, KC.GRV, _______,
|
||||
_______, _______, _______, _______,
|
||||
],
|
||||
[ # LEFT SYMBOLS
|
||||
_______, KC.COLN, KC.LABK, KC.RABK, KC.SCLN, _______, _______, _______, _______, _______,
|
||||
KC.LCBR, KC.RCBR, KC.LPRN, KC.RPRN, KC.AT, _______, _______, KC.EQL, KC.PLUS, KC.PERC,
|
||||
_______, KC.EXLM, KC.LBRC, KC.RBRC, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
],
|
||||
[ # 5 FUNCTION
|
||||
_______, _______, _______, _______, _______, _______, KC.F7, KC.F8, KC.F9, KC.F10,
|
||||
_______, _______, _______, _______, _______, _______, KC.F4, KC.F5, KC.F6, KC.F11,
|
||||
_______, _______, _______, _______, _______, _______, KC.F1, KC.F2, KC.F3, KC.F12,
|
||||
_______, _______, _______, _______,
|
||||
],
|
||||
[ # 6 NUMBERS
|
||||
KC.SLSH, KC.N7, KC.N8, KC.N9, KC.PLUS, _______, _______, _______, _______, _______,
|
||||
KC.N0, KC.N1, KC.N2, KC.N3, KC.MINS, _______, _______, _______, _______, _______,
|
||||
KC.ASTR, KC.N4, KC.N5, KC.N6, KC.EQL, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
],
|
||||
[ # 7 ALWAYS AVAILABLE
|
||||
_______, _______, KC.COLN, KC.ESC, _______, _______, _______, _______, _______, KC.DEL,
|
||||
_______, KC.PERC, KC.SLSH, KC.ENT, _______, KC.DF(1), KC.LGUI, _______, _______, _______,
|
||||
_______, _______, _______, KC.PERC, _______, KC.DF(0), KC.RALT, KC.RCTL, _______, KC.RESET,
|
||||
_______, KC.TAB, _______, _______,
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == "__main__":
|
||||
keyboard.go()
|
25
boards/fingerpunch/ffkb/README.md
Normal file
25
boards/fingerpunch/ffkb/README.md
Normal file
@ -0,0 +1,25 @@
|
||||
# Faux Fox Keyboard (ffkb)
|
||||
|
||||
![ffkb](https://fingerpunch.xyz/product/faux-fox-keyboard)
|
||||
|
||||
A 36 or 42 key keyboard with support for per key LEDs, 2 rotary encoders (EC11
|
||||
or evqwgd001), and a feature in the center (EC11, OLED (128x64), or pimoroni
|
||||
trackball). KMK support is available for the BYO MCU option only.
|
||||
|
||||
Use `nice_nano/kb.py` when using a Nice!Nano v2 MCU.
|
||||
|
||||
> Note: The Nice!Nano doesn't have a lot of ROM, so there are a couple of extra
|
||||
> steps. See guidance [over
|
||||
> here](../../docs/en/Officially_Supported_Microcontrollers.md#nicenano).
|
||||
|
||||
Use `kb2040/kb.py` when using any other pro micro footprint MCU.
|
||||
|
||||
An example `main.py` file is included for each MCU.
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
39
boards/fingerpunch/ffkb/nice_nano/kb.py
Normal file
39
boards/fingerpunch/ffkb/nice_nano/kb.py
Normal file
@ -0,0 +1,39 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
board.P1_06,
|
||||
board.P1_04,
|
||||
board.P0_11,
|
||||
board.P1_00,
|
||||
board.P0_24,
|
||||
board.P0_22,
|
||||
board.MOSI,
|
||||
board.MISO,
|
||||
)
|
||||
row_pins = (
|
||||
board.P0_08,
|
||||
board.P0_31,
|
||||
board.P0_29,
|
||||
board.P0_02,
|
||||
board.P1_15,
|
||||
board.SCK,
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rgb_pixel_pin = board.P0_06
|
||||
rgb_num_pixels = 42
|
||||
i2c = board.I2C
|
||||
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 35, 28, 37, 31,
|
||||
8, 9, 10, 11, 12, 13, 33, 14, 15, 26, 36, 29, 39,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 34, 27, 30, 38,
|
||||
41, 43, 44, 45, 46, 47, 42, 40,
|
||||
]
|
||||
|
||||
encoder_pins = ((board.P0_20, board.P0_17, board.P0_09, False))
|
70
boards/fingerpunch/ffkb/nice_nano/main.py
Normal file
70
boards/fingerpunch/ffkb/nice_nano/main.py
Normal file
@ -0,0 +1,70 @@
|
||||
import board
|
||||
|
||||
import kb
|
||||
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.combos import Combos, Sequence
|
||||
from kmk.modules.dynamic_sequences import DynamicSequences
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.oneshot import OneShot
|
||||
|
||||
combos = Combos()
|
||||
dyn_seq = DynamicSequences(
|
||||
slots=1, # The number of sequence slots to use
|
||||
timeout=60000, # Maximum time to spend in record or config mode before stopping automatically, milliseconds
|
||||
key_interval=20, # Milliseconds between key events while playing
|
||||
use_recorded_speed=False, # Whether to play the sequence at the speed it was typed
|
||||
)
|
||||
layers = Layers()
|
||||
oneshot = OneShot()
|
||||
|
||||
keyboard = kb.KMKKeyboard()
|
||||
keyboard.modules = [combos, dyn_seq, layers, oneshot]
|
||||
keyboard.debug_enabled = False
|
||||
|
||||
# Convenience variables for the Keymap
|
||||
_______ = KC.TRNS
|
||||
xxxxxxx = KC.NO
|
||||
|
||||
L1_TAB = KC.LT(1, KC.TAB, prefer_hold=True)
|
||||
L2_ENT = KC.LT(2, KC.ENT, prefer_hold=True)
|
||||
|
||||
OS_LSFT = KC.OS(KC.LSFT)
|
||||
|
||||
SEQ_REC = KC.RECORD_SEQUENCE()
|
||||
SEQ_STP = KC.STOP_SEQUENCE()
|
||||
SEQ_PLY = KC.PLAY_SEQUENCE()
|
||||
|
||||
combos.combos = [
|
||||
Sequence((KC.LEADER, KC.A), KC.LCTL(KC.A)), # select All
|
||||
Sequence((KC.LEADER, KC.T), KC.LCTL(KC.X)), # cuT
|
||||
Sequence((KC.LEADER, KC.C), KC.LCTL(KC.C)), # Copy
|
||||
Sequence((KC.LEADER, KC.P), KC.LCTL(KC.V)), # Paste
|
||||
Sequence((KC.LEADER, KC.U), KC.LCTL(KC.Z)), # Undo
|
||||
Sequence((KC.LEADER, KC.Y), KC.LCTL(KC.Y)), # redo
|
||||
]
|
||||
|
||||
# flake8: noqa
|
||||
keyboard.keymap = [
|
||||
[ # 0: Colemak-DH letters
|
||||
KC.ESC, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.LEADER,
|
||||
KC.LCTL, KC.A, KC.R, KC.S, KC.T, KC.G, xxxxxxx, KC.M, KC.N, KC.E, KC.I, KC.O, KC.QUOT,
|
||||
KC.LALT, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.BSLS,
|
||||
xxxxxxx, KC.LGUI, OS_LSFT, KC.BSPC, L1_TAB, KC.SPACE,L2_ENT, xxxxxxx,
|
||||
],
|
||||
[ # 1: Nav & Numbers
|
||||
KC.TAB, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
_______, KC.LPRN, KC.LEFT, KC.UP, KC.RIGHT,KC.RPRN, _______, KC.GRV, KC.PLUS, KC.EQL, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
_______, KC.LBRC, KC.LCBR, KC.DOWN, KC.RCBR, KC.RBRC, KC.TILD, KC.MINS, KC.UNDS, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
_______, _______, _______, KC.DEL, _______, _______, _______, _______,
|
||||
],
|
||||
[ # 2: F-row & Board Functions
|
||||
KC.F12, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
|
||||
_______, SEQ_REC, SEQ_PLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, SEQ_STP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
40
boards/fingerpunch/ffkb/other_pro_micro/kb.py
Normal file
40
boards/fingerpunch/ffkb/other_pro_micro/kb.py
Normal file
@ -0,0 +1,40 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.scanners import intify_coordinate as ic
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
pins[11],
|
||||
pins[10],
|
||||
pins[9],
|
||||
pins[8],
|
||||
pins[7],
|
||||
pins[6],
|
||||
pins[10],
|
||||
pins[12],
|
||||
)
|
||||
row_pins = (
|
||||
pins[1],
|
||||
pins[19],
|
||||
pins[18],
|
||||
pins[17],
|
||||
pins[16],
|
||||
pins[15],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rgb_pixel_pin = pins[0]
|
||||
rgb_num_pixels = 42
|
||||
i2c = board.I2C
|
||||
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
ic(0, 0), ic(0, 1), ic(0, 2), ic(0, 3), ic(0, 4), ic(0, 5), ic(0, 6), ic(0, 7), ic(4, 3), ic(3, 4), ic(4, 5), ic(3, 7),
|
||||
ic(1, 0), ic(1, 1), ic(1, 2), ic(1, 3), ic(1, 4), ic(1, 5), ic(4, 1), ic(1, 6), ic(1, 7), ic(3, 2), ic(4, 4), ic(3, 5), ic(4, 7),
|
||||
ic(2, 0), ic(2, 1), ic(2, 2), ic(2, 3), ic(2, 4), ic(2, 5), ic(2, 6), ic(2, 7), ic(4, 2), ic(3, 3), ic(3, 6), ic(4, 6),
|
||||
ic(5, 1), ic(5, 3), ic(5, 4), ic(5, 5), ic(5, 6), ic(5, 7), ic(5, 2), ic(5, 0)
|
||||
]
|
140
boards/fingerpunch/ffkb/other_pro_micro/main.py
Normal file
140
boards/fingerpunch/ffkb/other_pro_micro/main.py
Normal file
@ -0,0 +1,140 @@
|
||||
import board
|
||||
|
||||
from kb_kb2040 import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.holdtap import HoldTap
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.mouse_keys import MouseKeys
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.tap_time = 150
|
||||
keyboard.debug_enabled = False
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
# Adding extensions
|
||||
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels, val_limit=50, hue_default=190, sat_default=100, val_default=5)
|
||||
|
||||
holdtap = HoldTap()
|
||||
layers = Layers()
|
||||
media_keys = MediaKeys()
|
||||
|
||||
encoder_handler = EncoderHandler()
|
||||
|
||||
keyboard.modules = [layers, holdtap] #, encoder_handler]
|
||||
keyboard.modules.append(MouseKeys())
|
||||
keyboard.extensions = [rgb, media_keys]
|
||||
|
||||
|
||||
encoder_handler.pins = ((board.D3, board.D2, board.D10, False))
|
||||
|
||||
ZOOM_IN = KC.LCTRL(KC.EQUAL)
|
||||
ZOOM_OUT = KC.LCTRL(KC.MINUS)
|
||||
|
||||
LYR_BASE, LYR_NAV, LYR_SYM, LYR_SNAV, LYR_MEDIA, LYR_MOUSE = 0, 1, 2, 3, 4, 5
|
||||
|
||||
NAV_ENT = KC.LT(LYR_NAV, KC.ENT)
|
||||
SYM_SPC = KC.LT(LYR_SYM, KC.SPC)
|
||||
SNAV_TAB = KC.LT(LYR_SNAV, KC.TAB)
|
||||
MEDIA_BSPC = KC.LT(LYR_MEDIA, KC.BSPC)
|
||||
MOUSE_M = KC.LT(LYR_MOUSE, KC.M)
|
||||
|
||||
# HOMEROW MODS
|
||||
LCTL_A = KC.HT(KC.A, KC.LCTRL)
|
||||
LGUI_R = KC.HT(KC.R, KC.LGUI)
|
||||
LALT_S = KC.HT(KC.S, KC.LALT)
|
||||
LSFT_T = KC.HT(KC.T, KC.LSFT)
|
||||
RSFT_N = KC.HT(KC.N, KC.RSFT)
|
||||
RALT_E = KC.HT(KC.E, KC.RALT)
|
||||
RGUI_I = KC.HT(KC.I, KC.RGUI)
|
||||
RCTL_O = KC.HT(KC.O, KC.RCTRL)
|
||||
|
||||
# OTHER SHORTCUTS
|
||||
BRWSR_LFT = KC.LCTRL(KC.LSFT(KC.TAB))
|
||||
BRWSR_RGHT = KC.LCTRL(KC.TAB)
|
||||
DESK_LEFT = KC.LCTRL(KC.LGUI(KC.LEFT))
|
||||
DESK_RIGHT = KC.LCTRL(KC.LGUI(KC.RIGHT))
|
||||
CAPSWORD = _______ # TODO: IMPLEMENT THIS
|
||||
|
||||
# SHIFT NAV
|
||||
SFT_PGUP = KC.LSFT(KC.PGUP)
|
||||
SFT_PGDN = KC.LSFT(KC.PGDN)
|
||||
SFT_HOME = KC.LSFT(KC.HOME)
|
||||
SFT_END = KC.LSFT(KC.END)
|
||||
SFT_UP = KC.LSFT(KC.UP)
|
||||
SFT_DOWN = KC.LSFT(KC.DOWN)
|
||||
SFT_LEFT = KC.LSFT(KC.LEFT)
|
||||
SFT_RGHT = KC.LSFT(KC.RIGHT)
|
||||
|
||||
RGB_TOG = KC.RGB_TOG
|
||||
RGB_HUI = KC.RGB_HUI
|
||||
RGB_HUD = KC.RGB_HUI
|
||||
RGB_SAI = KC.RGB_SAI
|
||||
RGB_SAD = KC.RGB_SAD
|
||||
RGB_VAI = KC.RGB_VAI
|
||||
RGB_VAD = KC.RGB_VAD
|
||||
RGB_ANI = KC.RGB_ANI
|
||||
RGB_AND = KC.RGB_AND
|
||||
RGB_M_P = KC.RGB_MODE_PLAIN
|
||||
RGB_M_B = KC.RGB_MODE_BREATHE
|
||||
RGB_M_R = KC.RGB_MODE_RAINBOW
|
||||
RGB_M_BR = KC.RGB_MODE_BREATHE_RAINBOW
|
||||
RGB_M_K = KC.RGB_MODE_KNIGHT
|
||||
RGB_M_S = KC.RGB_MODE_SWIRL
|
||||
|
||||
keyboard.keymap = [
|
||||
[ #COLEMAK-DH
|
||||
KC.ESC, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
|
||||
KC.CAPS, LCTL_A, LGUI_R, LALT_S, LSFT_T, KC.G, KC.MUTE, MOUSE_M, RSFT_N, RALT_E, RGUI_I, RCTL_O, KC.QUOT,
|
||||
KC.SPC, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.MUTE, KC.DEL, NAV_ENT, SNAV_TAB, MEDIA_BSPC, SYM_SPC, KC.QUOT, KC.LCTRL(KC.BSPC)
|
||||
],
|
||||
[ #NAVIGATION
|
||||
_______, KC.ESC, KC.PGUP, KC.UP, KC.PGDN, _______, KC.ASTR, KC.N7, KC.N8, KC.N9, KC.PLUS, _______,
|
||||
_______, KC.HOME, KC.LEFT, KC.DOWN, KC.RIGHT, KC.END, _______, KC.SLSH, KC.N4, KC.N5, KC.N6, KC.MINS, _______,
|
||||
_______, _______, _______, _______, _______, _______, KC.EQL, KC.N1, KC.N2, KC.N3, KC.N0, _______,
|
||||
_______, _______, _______, _______, KC.BKSP, KC.SPC, KC.DOT, _______,
|
||||
],
|
||||
[ #SYMBOLS
|
||||
_______, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.UNDS, KC.EQL, _______,
|
||||
_______, KC.MINS, KC.LBRC, KC.LCBR, KC.LPRN, KC.LABK, _______, KC.RABK, KC.RPRN, KC.RCBR, KC.RBRC, KC.PLUS, _______,
|
||||
_______, KC.CAPS, KC.GRV, BRWSR_LFT, DESK_LEFT, CAPSWORD, _______, DESK_RIGHT, BRWSR_RGHT, _______, KC.BSLS, _______,
|
||||
_______, _______, KC.ENT, KC.TAB, _______, _______, _______, _______,
|
||||
],
|
||||
[ #SHIFT NAVIGATION
|
||||
_______, _______, SFT_PGUP, SFT_UP, SFT_PGDN, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, SFT_HOME, SFT_LEFT, SFT_DOWN, SFT_RGHT, SFT_END, _______, KC.VOLU, KC.MPLY, KC.MSTP, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, KC.MUTE, KC.VOLD, KC.MPRV, KC.MNXT, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
[ #MEDIA
|
||||
_______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_ANI, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_BR, RGB_M_K, _______,
|
||||
_______, _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_AND, RGB_M_S, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
[ #MOUSE
|
||||
_______, KC.RESET, KC.MW_UP, KC.MS_UP, KC.MW_DN, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, KC.MS_LT, KC.MS_DN, KC.MS_RT, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
]
|
||||
|
||||
encoder_handler.map = [
|
||||
((KC.VOLD, KC.VOLU, KC.MUTE)), # Layer 1
|
||||
((ZOOM_OUT, ZOOM_IN, _______)), # Layer 2
|
||||
((_______, _______, _______)), # Layer 3
|
||||
((_______, _______, _______)), # Layer 4
|
||||
((_______, _______, _______)), # Layer 5
|
||||
((_______, _______, _______)), # Layer 6
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
23
boards/fourtypercentclub/gherkin/README.md
Normal file
23
boards/fourtypercentclub/gherkin/README.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Ghirkin
|
||||
|
||||
![Gherkin](https://4.bp.blogspot.com/-sQ18-lNZXOc/WCzlTde-4PI/AAAAAAAB_JQ/qQrehAMG6DMKf3i4oj4mkmLGOfTUvb3KgCLcB/s640/IMG_20161116_122926.jpg)
|
||||
|
||||
A keyboard with only 30 keys.
|
||||
|
||||
Hardware Availability: [Gherkin project on 40% Keyboards](http://www.40percent.club/2016/11/gherkin.html)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [HoldTap](/docs/en/holdtap.md) Allows mod keys to act as different keys when tapped.
|
||||
- [LED](/docs/en/led.md) Light your keys up
|
||||
|
||||
Common Extensions
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
21
boards/fourtypercentclub/gherkin/kb.py
Normal file
21
boards/fourtypercentclub/gherkin/kb.py
Normal file
@ -0,0 +1,21 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (pins[16], pins[15], pins[14], pins[13], pins[12])
|
||||
col_pins = (
|
||||
board.pins[10],
|
||||
board.pins[9],
|
||||
board.pins[8],
|
||||
board.pins[7],
|
||||
board.pins[6],
|
||||
board.pins[5],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
led_pin = board.pins[11]
|
||||
rgb_num_pixels = 0
|
||||
i2c = board.I2C
|
68
boards/fourtypercentclub/gherkin/main.py
Normal file
68
boards/fourtypercentclub/gherkin/main.py
Normal file
@ -0,0 +1,68 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.led import LED
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.holdtap import HoldTap
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
|
||||
holdtap = HoldTap()
|
||||
layers_ext = Layers()
|
||||
led = LED()
|
||||
keyboard.extensions = [led]
|
||||
keyboard.modules = [layers_ext, holdtap]
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
FN1_SPC = KC.LT(1, KC.SPC)
|
||||
FN2_BSPC = KC.LT(2, KC.BSPC)
|
||||
FN3_C = KC.LT(3, KC.C)
|
||||
FN4_V = KC.LT(4, KC.V)
|
||||
FN5_B = KC.LT(5, KC.B)
|
||||
CTL_Z = KC.CTL_T(KC.Z)
|
||||
ALT_X = KC.ALT(KC.X)
|
||||
ALT_N = KC.ALT(KC.N)
|
||||
CTL_M = KC.CTL(KC.M)
|
||||
SFT_ENT = KC.SFT(KC.ENT)
|
||||
BL_DEC = KC.BL_DEC
|
||||
BL_INC = KC.BL_INC
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P,
|
||||
KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.ESC,
|
||||
CTL_Z, ALT_X, FN3_C, FN4_V, FN2_BSPC, FN1_SPC, FN5_B, ALT_N, CTL_M, SFT_ENT
|
||||
],
|
||||
[
|
||||
KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0,
|
||||
KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10,
|
||||
_______, _______, _______, _______, KC.DEL, _______, _______, _______, _______, _______
|
||||
],
|
||||
[
|
||||
KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN,
|
||||
KC.F11, KC.F12, _______, _______, _______, _______, _______, _______, _______, KC.GRV,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
],
|
||||
[
|
||||
_______, _______, _______, _______, _______, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
|
||||
KC.TAB, _______, _______, _______, _______, KC.COMM, KC.DOT, KC.SLSH, KC.SCLN, KC.QUOT,
|
||||
_______, _______, _______, _______, _______, _______, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
|
||||
],
|
||||
[
|
||||
_______, _______, _______, _______, _______, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
|
||||
KC.TAB, _______, _______, _______, _______, KC.LABK, KC.RABK, KC.QUES, KC.COLN, KC.DQUO,
|
||||
_______, _______, _______, _______, _______, _______, KC.HOME, KC.PGDN, KC.PGUP, KC.END
|
||||
],
|
||||
[
|
||||
KC.CALC, KC.WHOM, KC.MAIL, KC.MYCM, _______, _______, _______, _______, _______, KC.PSCR,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
23
boards/fourtypercentclub/luddite/README.md
Normal file
23
boards/fourtypercentclub/luddite/README.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Luddite
|
||||
|
||||
![Luddite](https://1.bp.blogspot.com/-GAAa-sMU_WU/W7uYLJJ8x1I/AAAAAAACS44/31n2z69BSboM4KT48YkNMJRYciC8LUMWgCLcBGAs/s640/a.jpg)
|
||||
|
||||
Luddite 60% keyboard with backlight and RGB underglow.
|
||||
|
||||
Hardware Availability: [Luddite project on 40% Keyboards](http://www.40percent.club/search/label/luddite)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) RGB underglow
|
||||
- [LED](/docs/en/led.md) Light your keys up
|
||||
|
||||
Common Extensions
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
33
boards/fourtypercentclub/luddite/kb.py
Normal file
33
boards/fourtypercentclub/luddite/kb.py
Normal file
@ -0,0 +1,33 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (
|
||||
pins[0],
|
||||
board.pins[1],
|
||||
board.pins[4],
|
||||
board.pins[5],
|
||||
board.pins[6],
|
||||
board.pins[7],
|
||||
board.pins[8],
|
||||
board.pins[9],
|
||||
)
|
||||
col_pins = (
|
||||
board.pins[19],
|
||||
board.pins[18],
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
board.pins[14],
|
||||
board.pins[13],
|
||||
board.pins[12],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
led_pin = board.pins[11]
|
||||
rgb_pixel_pin = board.pins[10]
|
||||
rgb_num_pixels = 8
|
||||
i2c = board.I2C
|
41
boards/fourtypercentclub/luddite/main.py
Normal file
41
boards/fourtypercentclub/luddite/main.py
Normal file
@ -0,0 +1,41 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.led import LED
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
|
||||
led = LED()
|
||||
layers_ext = Layers()
|
||||
keyboard.extensions = [rgb_ext, led]
|
||||
keyboard.modules = [layers_ext]
|
||||
|
||||
BASE = 0
|
||||
FN1 = 1
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.GESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.MINS, KC.EQL, KC.BSPC,
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.LBRC, KC.RBRC, KC.BSLS,
|
||||
KC.CAPS, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT, KC.ENT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
|
||||
KC.LCTL, KC.LGUI, KC.LALT, KC.SPC, KC.RALT, KC.RGUI, KC.MO(FN1), KC.RCTL,
|
||||
],
|
||||
|
||||
[
|
||||
KC.GESC, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.BSPC,
|
||||
KC.RGB_TOG, _______, KC.UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, KC.LEFT, KC.DOWN, KC.RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC.LED_INC, KC.LED_DEC, KC.LED_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC.GRV, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
111
boards/helix/README.md
Normal file
111
boards/helix/README.md
Normal file
@ -0,0 +1,111 @@
|
||||
# Helix
|
||||
|
||||
![Helix](https://camo.githubusercontent.com/15552bce07c6ad8e2a9c25054bada9f6a12239d009771b372d2c2ea7a91ed8b2/68747470733a2f2f692e696d6775722e636f6d2f5842416d796e4e2e6a7067)
|
||||
|
||||
A compact split ortholinear keyboard.
|
||||
|
||||
* Keyboard Maintainer: [yushakobo](https://github.com/yushakobo)
|
||||
* Hardware Supported: Helix PCBs (probably rev2 only), Pro Micro RP2040 boards
|
||||
|
||||
Copy the `kb.py` and `main.py` files from your preferred keymap folder into your root directory of your keyboard as detailed in the [KMK instructions](http://kmkfw.io/docs/Getting_Started/).
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
||||
|
||||
## Layout
|
||||
|
||||
### Qwerty
|
||||
|
||||
```
|
||||
,-----------------------------------------. ,-----------------------------------------.
|
||||
| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
|Adjust| Esc | Alt | GUI | |Lower |Space |Space |Raise | | Left | Down | Up |Right |
|
||||
`-------------------------------------------------------------------------------------------------'
|
||||
```
|
||||
|
||||
### Colemak
|
||||
```
|
||||
,-----------------------------------------. ,-----------------------------------------.
|
||||
| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
|Adjust| Esc | Alt | GUI | |Lower |Space |Space |Raise | | Left | Down | Up |Right |
|
||||
`-------------------------------------------------------------------------------------------------'
|
||||
```
|
||||
|
||||
### Dvorak
|
||||
```
|
||||
,-----------------------------------------. ,-----------------------------------------.
|
||||
| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
|Adjust| Esc | Alt | GUI | |Lower |Space |Space |Raise | | Left | Down | Up |Right |
|
||||
`-------------------------------------------------------------------------------------------------'
|
||||
```
|
||||
|
||||
### Lower
|
||||
```
|
||||
,-----------------------------------------. ,-----------------------------------------.
|
||||
| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
||||
`-------------------------------------------------------------------------------------------------'
|
||||
```
|
||||
|
||||
### Raise
|
||||
```
|
||||
,-----------------------------------------. ,-----------------------------------------.
|
||||
| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
||||
`-------------------------------------------------------------------------------------------------'
|
||||
```
|
||||
|
||||
### Adjust (Lower + Raise)
|
||||
```
|
||||
,-----------------------------------------. ,-----------------------------------------.
|
||||
| F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| | Reset| Debug| | | | | | | | | | Del |
|
||||
|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||
| | | | | | Mac | | Win |Qwerty|Colemk|Dvorak| | |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ |
|
||||
|------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
| | | | | | | | | | | MODE | HUE- | SAT- | VAL- |
|
||||
`-------------------------------------------------------------------------------------------------'
|
||||
```
|
37
boards/helix/kb.py
Normal file
37
boards/helix/kb.py
Normal file
@ -0,0 +1,37 @@
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.sparkfun_promicro_rp2040 import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (
|
||||
pins[19],
|
||||
pins[18],
|
||||
pins[17],
|
||||
pins[16],
|
||||
pins[15],
|
||||
pins[14],
|
||||
pins[13],
|
||||
)
|
||||
row_pins = (
|
||||
pins[6],
|
||||
pins[7],
|
||||
pins[8],
|
||||
pins[9],
|
||||
pins[10],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COL2ROW
|
||||
data_pin = pins[1]
|
||||
rgb_pixel_pin = pins[0]
|
||||
SDA = pins[4]
|
||||
SCL = pins[5]
|
||||
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 40, 39, 38, 37, 36, 35,
|
||||
7, 8, 9, 10, 11, 12, 47, 46, 45, 44, 43, 42,
|
||||
14, 15, 16, 17, 18, 19, 54, 53, 52, 51, 50, 49,
|
||||
21, 22, 23, 24, 25, 26, 27, 62, 61, 60, 59, 58, 57, 56,
|
||||
28, 29, 30, 31, 32, 33, 34, 69, 68, 67, 66, 65, 64, 63
|
||||
]
|
102
boards/helix/main.py
Normal file
102
boards/helix/main.py
Normal file
@ -0,0 +1,102 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.cg_swap import CgSwap
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
# RGB backlight support
|
||||
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=32, hue_default=80, sat_default=255, val_default=80)
|
||||
keyboard.extensions.append(rgb)
|
||||
|
||||
# Split keyboard support
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(
|
||||
use_pio=True,
|
||||
uart_flip=True,
|
||||
data_pin=keyboard.data_pin
|
||||
)
|
||||
keyboard.modules.append(split)
|
||||
|
||||
# Media key support
|
||||
keyboard.extensions.append(MediaKeys())
|
||||
|
||||
# CG Swap Module
|
||||
cg_swap = CgSwap()
|
||||
keyboard.modules.append(cg_swap)
|
||||
|
||||
# Layer support
|
||||
layers_ext = Layers()
|
||||
keyboard.modules.append(layers_ext)
|
||||
|
||||
# Cleaner key names
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
QWERTY = KC.DF(0)
|
||||
COLEMAK = KC.DF(1)
|
||||
DVORAK = KC.DF(2)
|
||||
LOWER = KC.MO(3)
|
||||
RAISE = KC.MO(4)
|
||||
ADJUST = KC.MO(5)
|
||||
|
||||
RGB_TOG = KC.RGB_TOG
|
||||
RGB_HUI = KC.RGB_HUI
|
||||
RGB_HUD = KC.RGB_HUI
|
||||
RGB_SAI = KC.RGB_SAI
|
||||
RGB_SAD = KC.RGB_SAD
|
||||
RGB_VAI = KC.RGB_VAI
|
||||
RGB_VAD = KC.RGB_VAD
|
||||
|
||||
keyboard.keymap = [
|
||||
[ # QWERTY
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
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.LBRC, KC.RBRC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT ,
|
||||
ADJUST, KC.ESC, KC.LALT, KC.LGUI, XXXXXXX, LOWER, KC.SPC, KC.SPC, RAISE, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
|
||||
],
|
||||
[ # COLEMAK
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
KC.TAB, KC.Q, KC.W, KC.F, KC.P, KC.G, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
|
||||
KC.LCTL, KC.A, KC.R, KC.S, KC.T, KC.D, KC.H, KC.N, KC.E, KC.I, KC.O, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.LBRC, KC.RBRC, KC.K, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT ,
|
||||
ADJUST, KC.ESC, KC.LALT, KC.LGUI, XXXXXXX, LOWER, KC.SPC, KC.SPC, RAISE, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
|
||||
],
|
||||
[ # DVORAK
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.DEL,
|
||||
KC.LCTL, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.SLSH,
|
||||
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.LBRC, KC.RBRC, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.ENT ,
|
||||
ADJUST, KC.ESC, KC.LALT, KC.LGUI, XXXXXXX, LOWER, KC.SPC, KC.SPC, RAISE, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT
|
||||
],
|
||||
[ # LOWER
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, _______,
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, _______,
|
||||
_______, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
|
||||
KC.CAPS, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.LPRN, KC.RPRN, KC.F12, _______, _______, KC.HOME, KC.END, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
|
||||
],
|
||||
[ # RAISE
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
_______, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
|
||||
KC.CAPS, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, _______, _______, KC.F12, _______, _______, KC.PGDN, KC.PGUP, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY
|
||||
],
|
||||
[ # ADJUSTs
|
||||
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.DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC.DEL,
|
||||
_______, _______, _______, _______, _______, KC.CG_NORM, KC.CG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD
|
||||
]
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
13
boards/jpconstantineau/Batreus44/README.md
Normal file
13
boards/jpconstantineau/Batreus44/README.md
Normal file
@ -0,0 +1,13 @@
|
||||
# JPConstantineau's Batreus44: An Atreus44 clone with Low Profile Switches and Wireless Options!
|
||||
|
||||
![Batreus44](https://preview.redd.it/yu090ikxiou71.jpg?width=4032&format=pjpg&auto=webp&s=6da758f1ca439ecee912b35a709eacef9b019cd8)
|
||||
|
||||
44 Keys Low Profile Keyboard inspired from Keyboardio's Atreus with a socket for a NiceNano, BlueMicro840 or Pro Micro RP2040 and a place to solder in a Battery.
|
||||
|
||||
kb_BlueMicro840.py is designed to work with the BlueMicro840
|
||||
|
||||
Retailers (USA)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [MediaKeys](/docs/en/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
|
||||
|
||||
![PyKey60](https://cdn.tindiemedia.com/images/resize/JYsH3WYq6GZD4xnvByhHXzwLhPo=/p/full-fit-in/2400x1600/i/556481/products/2021-09-17T19%3A53%3A16.118Z-PXL_20210917_194653430.jpg?1631883222)
|
||||
|
||||
A 60% RGB Keyboard PCB with Hot Swap Sockets, running CircuitPython on a RP2040 Soldered on board.
|
||||
|
||||
kb.py is designed to work with the [PyKey60 CircuitPython UF2](https://circuitpython.org/board/jpconstantineau_pykey60/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/pykey60-rgb-keyboard-pcb-with-a-rp2040/)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [MediaKeys](/docs/en/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
|
||||
|
||||
![GridMX47](https://cdn.tindiemedia.com/images/resize/alLUevg6WzBFO9uqkOwd5Lw5tJY=/p/fit-in/1370x912/filters:fill(fff)/i/556481/products/2021-10-26T23%3A29%3A50.131Z-PXL_20211026_230848859.jpg?1635265805)
|
||||
|
||||
47 Keys RGB Keyboard inspired from OLKB's Planck with a Raspberry Pi Pico
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/47-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [MediaKeys](/docs/en/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
|
||||
|
||||
![OffsetMX43](https://cdn.tindiemedia.com/images/resize/Y9o1UdtekCSE5Jp5FesV2Q3qvCE=/p/fit-in/653x435/filters:fill(fff)/i/556481/products/2021-10-26T23%3A40%3A53.317Z-PXL_20211026_234121626.jpg?1635266543)
|
||||
|
||||
43 Keys RGB Keyboard the same size as the GridMX47 but with staggered keys instead of ortholinear (keys in a grid). Uses a Raspberry Pi Pico as the controller.
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/43-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [MediaKeys](/docs/en/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
|
||||
|
||||
![VColChoc44](https://cdn.tindiemedia.com/images/resize/tbqfM8nhMn0hoDM0ZkwYxM23mU0=/p/full-fit-in/2400x1600/i/556481/products/2021-10-15T15%3A33%3A13.288Z-qj04uaoo2ht71.jpg?1634287023)
|
||||
|
||||
44 Keys Low Profile RGB Keyboard inspired from Keyboardio's Atreus with a RP2040 Soldered on board.
|
||||
|
||||
kb.py is designed to work with the [PyKey60 CircuitPython UF2](https://circuitpython.org/board/jpconstantineau_pykey60/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/low-profile-44-keys-rgb-keyboard-pcb-with-a-rp2040/)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [MediaKeys](/docs/en/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
|
||||
|
||||
![VColMX44](https://cdn.tindiemedia.com/images/resize/5oEyXgxteB6wYjXv8kFC1B3YqOk=/p/full-fit-in/2400x1600/i/556481/products/2021-10-20T05%3A14%3A24.776Z-PXL_20211016_060203733.jpg?1634681706v)
|
||||
|
||||
|
||||
44 Keys RGB Keyboard inspired from Keyboardio's Atreus with a Raspberry Pi Pico
|
||||
|
||||
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
|
||||
|
||||
Retailers (USA)
|
||||
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/44-keys-rgb-keyboard-using-raspberry-pi-pico/)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [MediaKeys](/docs/en/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
|
21
boards/keebio/iris/README.md
Normal file
21
boards/keebio/iris/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Iris Rev 2
|
||||
|
||||
A split keyboard with a 4x6 layout with additional 4 thumb buttons
|
||||
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/hardware)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/en/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](/docs/en/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
39
boards/keebio/iris/kb.py
Normal file
39
boards/keebio/iris/kb.py
Normal file
@ -0,0 +1,39 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (
|
||||
board.pins[8],
|
||||
board.pins[9],
|
||||
board.pins[10],
|
||||
board.pins[1],
|
||||
board.pins[6],
|
||||
)
|
||||
col_pins = (
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
board.pins[14],
|
||||
board.pins[13],
|
||||
board.pins[12],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
led_pin = board.pins[11]
|
||||
rgb_pixel_pin = pins[0]
|
||||
rgb_num_pixels = 12
|
||||
i2c = board.I2C
|
||||
data_pin = board.pins[5]
|
||||
|
||||
# flake8: noqa
|
||||
# fmt: off
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 35, 34, 33, 32, 31, 30,
|
||||
6, 7, 8, 9, 10, 11, 41, 40, 39, 38, 37, 36,
|
||||
12, 13, 14, 15, 16, 17, 47, 46, 45, 44, 43, 42,
|
||||
18, 19, 20, 21, 22, 23, 26, 56, 53, 52, 51, 50, 49, 48,
|
||||
27, 28, 29, 59, 58, 57,
|
||||
]
|
40
boards/keebio/iris/kb_converter.py
Normal file
40
boards/keebio/iris/kb_converter.py
Normal file
@ -0,0 +1,40 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
# Pin mappings for converter board found at hardware/README.md
|
||||
# QMK: MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
|
||||
# QMK: MATRIX_ROW_PINS { D7, E6, B4, D2, D4 }
|
||||
col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI)
|
||||
row_pins = (board.D11, board.D10, board.D9, board.RX, board.D13)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
split_flip = True
|
||||
split_offset = (6, 6, 6, 6, 6)
|
||||
split_type = 'UART'
|
||||
data_pin = board.SCL
|
||||
data_pin2 = board.SDA
|
||||
rgb_num_pixels = 12
|
||||
i2c = board.I2C
|
||||
rgb_pixel_pin = board.TX
|
||||
led_pin = board.D7
|
||||
|
||||
# Buckle up friends, the bottom row of this keyboard is wild, and making
|
||||
# our layouts match, visually, what the keyboard looks like, requires some
|
||||
# surgery on the bottom two rows of coords
|
||||
|
||||
# Row index 3 is actually perfectly sane and we _could_ expose it
|
||||
# just like the above three rows, however, visually speaking, the
|
||||
# top-right thumb cluster button (when looking at the left-half PCB)
|
||||
# is more inline with R3, so we'll jam that key (and its mirror) in here
|
||||
# flake8: noqa
|
||||
coord_mapping = [
|
||||
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
|
||||
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
|
||||
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
|
||||
18, 19, 20, 21, 22, 23, 26, 57, 54, 53, 52, 51, 50, 49,
|
||||
28, 29, 30, 60, 59, 58,
|
||||
]
|
96
boards/keebio/iris/main.py
Normal file
96
boards/keebio/iris/main.py
Normal file
@ -0,0 +1,96 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.consts import UnicodeMode
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.handlers.sequences import compile_unicode_string_sequences as cuss
|
||||
from kmk.handlers.sequences import send_string
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
keyboard.debug_enabled = False
|
||||
keyboard.unicode_mode = UnicodeMode.LINUX
|
||||
keyboard.tap_time = 750
|
||||
|
||||
emoticons = cuss({
|
||||
# Emojis
|
||||
'BEER': r'🍺',
|
||||
'BEER_TOAST': r'🍻',
|
||||
'FACE_CUTE_SMILE': r'😊',
|
||||
'FACE_HEART_EYES': r'😍',
|
||||
'FACE_JOY': r'😂',
|
||||
'FACE_SWEAT_SMILE': r'😅',
|
||||
'FACE_THINKING': r'🤔',
|
||||
'FIRE': r'🔥',
|
||||
'FLAG_CA': r'🇨🇦',
|
||||
'FLAG_US': r'🇺🇸',
|
||||
'HAND_CLAP': r'👏',
|
||||
'HAND_HORNS': r'🤘',
|
||||
'HAND_OK': r'👌',
|
||||
'HAND_THUMB_DOWN': r'👎',
|
||||
'HAND_THUMB_UP': r'👍',
|
||||
'HAND_WAVE': r'👋',
|
||||
'HEART': r'❤️',
|
||||
'MAPLE_LEAF': r'🍁',
|
||||
'POOP': r'💩',
|
||||
'TADA': r'🎉',
|
||||
'SHRUG_EMOJI': r'🤷',
|
||||
|
||||
# Emoticons, but fancier
|
||||
'ANGRY_TABLE_FLIP': r'(ノಠ痊ಠ)ノ彡┻━┻',
|
||||
'CELEBRATORY_GLITTER': r'+。:.゚ヽ(´∀。)ノ゚.:。+゚゚+。:.゚ヽ(*´∀)ノ゚.:。+゚',
|
||||
'SHRUGGIE': r'¯\_(ツ)_/¯',
|
||||
'TABLE_FLIP': r'(╯°□°)╯︵ ┻━┻',
|
||||
})
|
||||
|
||||
WPM = send_string('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Bibendum arcu vitae elementum curabitur vitae nunc sed. Facilisis sed odio morbi quis.')
|
||||
|
||||
_______ = KC.TRNS
|
||||
xxxxxxx = KC.NO
|
||||
HELLA_TD = KC.TD(
|
||||
KC.A,
|
||||
KC.B,
|
||||
send_string('macros in a tap dance? I think yes'),
|
||||
KC.TG(1),
|
||||
)
|
||||
|
||||
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
|
||||
layers_ext = Layers()
|
||||
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(split_type=SplitType.BLE, split_side=split_side)
|
||||
|
||||
keyboard.extensions = [rgb_ext]
|
||||
keyboard.modules = [split, layers_ext]
|
||||
|
||||
|
||||
keyboard.keymap = [
|
||||
[
|
||||
KC.GESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,
|
||||
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.SLSH,
|
||||
KC.LGUI, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENTER,
|
||||
KC.LCTL, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.MO(2), KC.MO(1), KC.B, KC.M, KC.W, KC.V, KC.Z, KC.LALT,
|
||||
KC.LEFT, KC.RGHT, KC.LSFT, KC.SPC, KC.UP, KC.DOWN,
|
||||
],
|
||||
[
|
||||
_______, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.F10, KC.F11, KC.F12, xxxxxxx, xxxxxxx, _______,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.F7, KC.F8, KC.F9, xxxxxxx, xxxxxxx, KC.EQUAL,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.INS, KC.F4, KC.F5, KC.F6, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.NO, _______, KC.F1, KC.F2, KC.F3, xxxxxxx, xxxxxxx, _______,
|
||||
KC.HOME, KC.END, _______, xxxxxxx, KC.PGUP, KC.PGDN,
|
||||
],
|
||||
[
|
||||
KC.MUTE, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.LBRC, KC.RBRC, KC.DEL,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.BSLS,
|
||||
KC.RGUI, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.MINS,
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, _______, KC.VOLU, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.RALT,
|
||||
KC.HOME, KC.END, _______, KC.VOLD, KC.PGUP, KC.PGDN,
|
||||
],
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
22
boards/keebio/levinson/README.md
Normal file
22
boards/keebio/levinson/README.md
Normal file
@ -0,0 +1,22 @@
|
||||
# Levinson Rev 2
|
||||
|
||||
A split keyboard with a 4x6 layout
|
||||
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/hardware)
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/en/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](/docs/en/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
```
|
24
boards/keebio/levinson/kb.py
Normal file
24
boards/keebio/levinson/kb.py
Normal file
@ -0,0 +1,24 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (board.pins[6], board.pins[8], board.pins[9], board.pins[10])
|
||||
col_pins = (
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
board.pins[14],
|
||||
board.pins[13],
|
||||
board.pins[12],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rgb_pixel_pin = pins[0]
|
||||
rgb_num_pixels = 12
|
||||
led_pin = board.pins[11]
|
||||
data_pin = board.pins[1]
|
||||
i2c = board.I2C
|
||||
powersave_pin = board.P0_13
|
18
boards/keebio/levinson/kb_converter.py
Normal file
18
boards/keebio/levinson/kb_converter.py
Normal file
@ -0,0 +1,18 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI)
|
||||
row_pins = (board.D13, board.D11, board.D10, board.D9)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
split_type = 'UART'
|
||||
split_flip = True
|
||||
split_offsets = [6, 6, 6, 6, 6]
|
||||
data_pin = board.SCL
|
||||
data_pin2 = board.SDA
|
||||
rgb_pixel_pin = board.TX
|
||||
led_pin = board.D7
|
133
boards/keebio/levinson/main.py
Normal file
133
boards/keebio/levinson/main.py
Normal file
@ -0,0 +1,133 @@
|
||||
from kb import KMKKeyboard
|
||||
|
||||
from kmk.extensions.rgb import RGB
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.modules.split import Split, SplitSide, SplitType
|
||||
|
||||
keyboard = KMKKeyboard()
|
||||
|
||||
rgb_ext = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels)
|
||||
layers_ext = Layers()
|
||||
# TODO Comment one of these on each side
|
||||
split_side = SplitSide.LEFT
|
||||
split_side = SplitSide.RIGHT
|
||||
split = Split(split_type=SplitType.BLE, split_side=split_side)
|
||||
|
||||
keyboard.extensions = [rgb_ext]
|
||||
keyboard.modules = [layers_ext, split]
|
||||
|
||||
_______ = KC.TRNS
|
||||
XXXXXXX = KC.NO
|
||||
|
||||
LOWER = KC.MO(3)
|
||||
RAISE = KC.MO(4)
|
||||
ADJUST = KC.MO(5)
|
||||
|
||||
keyboard.keymap = [
|
||||
# Qwerty
|
||||
# ,-----------------------------------------------------------------------------------.
|
||||
# | Tab | Q | W | E | R | T | Y | U | I | O | P | Bak |
|
||||
# |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
# | Esc | A | S | D | F | G | H | J | K | L | ; | " |
|
||||
# |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
# | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
|
||||
# |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
|
||||
# `-----------------------------------------------------------------------------------'
|
||||
[
|
||||
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
|
||||
KC.GESC, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
|
||||
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
|
||||
],
|
||||
|
||||
# Colemak
|
||||
# ,-----------------------------------------------------------------------------------.
|
||||
# | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bak |
|
||||
# |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
# | Esc | A | R | S | T | D | H | N | E | I | O | " |
|
||||
# |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
# | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
|
||||
# |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
|
||||
# `-----------------------------------------------------------------------------------'
|
||||
[
|
||||
KC.TAB, KC.Q, KC.W, KC.F, KC.P, KC.G, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
|
||||
KC.GESC, KC.A, KC.R, KC.S, KC.T, KC.D, KC.H, KC.N, KC.E, KC.I, KC.O, KC.QUOT,
|
||||
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.K, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.ENT,
|
||||
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
|
||||
],
|
||||
|
||||
# Dvorak
|
||||
# ,-----------------------------------------------------------------------------------.
|
||||
# | Tab | " | , | . | P | Y | F | G | C | R | L | Bak |
|
||||
# |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
# | Esc | A | O | E | U | I | D | H | T | N | S | / |
|
||||
# |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
# | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
|
||||
# |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
# |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
|
||||
# `-----------------------------------------------------------------------------------'
|
||||
[
|
||||
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC,
|
||||
KC.GESC, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.SLSH,
|
||||
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.ENT,
|
||||
ADJUST, KC.LCTL, KC.LALT, KC.LGUI, LOWER, KC.SPC, KC.SPC, RAISE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
|
||||
],
|
||||
|
||||
# Lower
|
||||
# ,-----------------------------------------------------------------------------------.
|
||||
# | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
|
||||
# |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
# | Del | F1 | F2 | F3 | F4 | F5 | F6 | . | + | | \ | | |
|
||||
# |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
# | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter |
|
||||
# |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
# | | | | | | | | Next | Vol- | Vol+ | Play |
|
||||
# `-----------------------------------------------------------------------------------'
|
||||
[
|
||||
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.DEL,
|
||||
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE,
|
||||
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY,
|
||||
],
|
||||
|
||||
# Raise
|
||||
# ,-----------------------------------------------------------------------------------.
|
||||
# | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
|
||||
# |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
# | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
|
||||
# |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
# | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter |
|
||||
# |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
# | | | | | | | | Next | Vol- | Vol+ | Play |
|
||||
# `-----------------------------------------------------------------------------------'
|
||||
[
|
||||
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DEL,
|
||||
KC.DEL, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS,
|
||||
_______, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12, KC.NUHS, KC.NUBS, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, KC.MNXT, KC.VOLD, KC.VOLU, KC.MPLY,
|
||||
],
|
||||
|
||||
# Adjust
|
||||
# ,-----------------------------------------------------------------------------------.
|
||||
# | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | Del |
|
||||
# |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
# | | | | | | | |Qwerty|Colemk|Dvorak| | |
|
||||
# |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
# | | | | | | | | | | | | |
|
||||
# |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||
# | | | | | | | | | | | |
|
||||
# `-----------------------------------------------------------------------------------'
|
||||
[
|
||||
_______, _______, KC.RGB.TOG, KC.RGB.MOD, KC.RGB.HUD, KC.RGB.HUI, KC.RGB.SAD, KC.RGB.SAI, KC.RGB.VAD, KC.RGB.VAI, _______, KC.DEL,
|
||||
_______, _______, _______, _______, _______, _______, _______, KC.DF(0), KC.DF(1), KC.DF(2), _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
],
|
||||
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
keyboard.go()
|
22
boards/keebio/nyquist/README.md
Normal file
22
boards/keebio/nyquist/README.md
Normal file
@ -0,0 +1,22 @@
|
||||
# Nyquist Rev 2
|
||||
|
||||
A split keyboard with a 5x6 layout
|
||||
|
||||
kb_converter.py is designed to work with an itsybitsy with converter board found [here](/hardware)
|
||||
|
||||
|
||||
Extensions enabled by default
|
||||
- [Layers](/docs/en/layers.md) Need more keys than switches? Use layers.
|
||||
- [RGB](/docs/en/rgb.md) Light it up
|
||||
- [BLE_Split](/docs/en/split_keyboards.md) Connects halves without wires
|
||||
|
||||
Common Extensions
|
||||
- [Split](/docs/en/split_keyboards.md) Connects halves using a wire
|
||||
- [Power](/docs/en/power.md) Powersaving features for battery life
|
||||
|
||||
## Microcontroller support
|
||||
|
||||
Update this line in `kb.py` to any supported microcontroller in `kmk/quickpin/pro_micro`:
|
||||
|
||||
```python
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
29
boards/keebio/nyquist/kb.py
Normal file
29
boards/keebio/nyquist/kb.py
Normal file
@ -0,0 +1,29 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.quickpin.pro_micro.boardsource_blok import pinout as pins
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
row_pins = (
|
||||
board.pins[6],
|
||||
board.pins[8],
|
||||
board.pins[9],
|
||||
board.pins[10],
|
||||
board.pins[11],
|
||||
)
|
||||
col_pins = (
|
||||
board.pins[1],
|
||||
board.pins[18],
|
||||
board.pins[17],
|
||||
board.pins[16],
|
||||
board.pins[15],
|
||||
board.pins[14],
|
||||
)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
rgb_pixel_pin = pins[0]
|
||||
rgb_num_pixels = 12
|
||||
data_pin = board.pins[1]
|
||||
led_pin = board.pins[12]
|
||||
i2c = board.I2C
|
15
boards/keebio/nyquist/kb_converter.py
Normal file
15
boards/keebio/nyquist/kb_converter.py
Normal file
@ -0,0 +1,15 @@
|
||||
import board
|
||||
|
||||
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
|
||||
from kmk.scanners import DiodeOrientation
|
||||
|
||||
|
||||
class KMKKeyboard(_KMKKeyboard):
|
||||
col_pins = (board.RX, board.A1, board.A2, board.A3, board.A4, board.A5)
|
||||
row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7)
|
||||
diode_orientation = DiodeOrientation.COLUMNS
|
||||
|
||||
data_pin = board.SCL
|
||||
rgb_num_pixels = 12
|
||||
rgb_pixel_pin = board.TX
|
||||
data_pin2 = board.SDA
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user