forked from Github/qmk_firmware
Compare commits
560 Commits
breakpoint
...
0.13.7
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4720aa4a34 | ||
![]() |
ed0451bc28 | ||
![]() |
22cd151fc3 | ||
![]() |
96c8afea2d | ||
![]() |
3966599940 | ||
![]() |
09e22b9cfc | ||
![]() |
9cf4148aa9 | ||
![]() |
c00a9937f2 | ||
![]() |
d0a3506d0f | ||
![]() |
3d546c0853 | ||
![]() |
a9525d88a3 | ||
![]() |
0713797c58 | ||
![]() |
ae45faca26 | ||
![]() |
449b4b8d86 | ||
![]() |
3d62e1dfbf | ||
![]() |
a08486597d | ||
![]() |
f48bd8cde3 | ||
![]() |
c16b7d63e7 | ||
![]() |
db36e2be9f | ||
![]() |
0ef145db15 | ||
![]() |
2e90ef0536 | ||
![]() |
d684b8cafe | ||
![]() |
39c8ed32b4 | ||
![]() |
5073dc33e9 | ||
![]() |
21aa7890cb | ||
![]() |
4dda716712 | ||
![]() |
9975e17712 | ||
![]() |
9dcd03b6ca | ||
![]() |
e0acd3e53d | ||
![]() |
c277ae4768 | ||
![]() |
b52b8f1d23 | ||
![]() |
b7ef959400 | ||
![]() |
17e6e04600 | ||
![]() |
a0ed583b75 | ||
![]() |
093a89c534 | ||
![]() |
c1bd8eed76 | ||
![]() |
9dffd35762 | ||
![]() |
b10728edc1 | ||
![]() |
94e80912a4 | ||
![]() |
7b666245d6 | ||
![]() |
23631de191 | ||
![]() |
0374e4c733 | ||
![]() |
add10524d6 | ||
![]() |
7aab06ffdf | ||
![]() |
ab6128e86d | ||
![]() |
8128c5f822 | ||
![]() |
770a3349be | ||
![]() |
c7c9f3e3cf | ||
![]() |
e660dcff09 | ||
![]() |
6eb18a6ccb | ||
![]() |
af91221ddb | ||
![]() |
261d94ce34 | ||
![]() |
a0cc2dc6d0 | ||
![]() |
597d2e0e7b | ||
![]() |
35dbe8ba03 | ||
![]() |
93496c8364 | ||
![]() |
5a06813b10 | ||
![]() |
6bafefa886 | ||
![]() |
1a3064afb1 | ||
![]() |
2b8f1fcdfb | ||
![]() |
7b055dcc55 | ||
![]() |
fc9a2167b1 | ||
![]() |
3aca3d3572 | ||
![]() |
305cca9a5e | ||
![]() |
1646c0f26c | ||
![]() |
f55e39e8a2 | ||
![]() |
84883d3400 | ||
![]() |
147cf8afbb | ||
![]() |
9da95bc3ab | ||
![]() |
088c71b4ea | ||
![]() |
7e14f85dd5 | ||
![]() |
0e53917471 | ||
![]() |
446ef4a676 | ||
![]() |
1f86c3ac96 | ||
![]() |
6750733cda | ||
![]() |
975e42ed3c | ||
![]() |
712d53c953 | ||
![]() |
2ca7a8677a | ||
![]() |
722b1d655d | ||
![]() |
e7d68c500b | ||
![]() |
5962f05f56 | ||
![]() |
3a6188fc55 | ||
![]() |
7cd9edab99 | ||
![]() |
0399271a73 | ||
![]() |
8ba537fa23 | ||
![]() |
0211e30032 | ||
![]() |
aa97f52963 | ||
![]() |
bc67ca6a59 | ||
![]() |
bbe453599f | ||
![]() |
5eb48994ad | ||
![]() |
d5a94b58d2 | ||
![]() |
e17a6c4f8d | ||
![]() |
3328aefd8e | ||
![]() |
f173963d95 | ||
![]() |
60da67fbd2 | ||
![]() |
1bb7905f78 | ||
![]() |
1a7c1c0036 | ||
![]() |
6152861356 | ||
![]() |
8feb767994 | ||
![]() |
d14f1ab7ff | ||
![]() |
0be53004b3 | ||
![]() |
d425fcc8b1 | ||
![]() |
10f8a6d983 | ||
![]() |
40f235a96c | ||
![]() |
e961e34c7f | ||
![]() |
db1eacdaac | ||
![]() |
a9aec546c8 | ||
![]() |
3023015c5b | ||
![]() |
1c81e69503 | ||
![]() |
d86a97a089 | ||
![]() |
4dd5f45b6c | ||
![]() |
22e9a0bd01 | ||
![]() |
3bee24a827 | ||
![]() |
f7c6d68b34 | ||
![]() |
1d3f775051 | ||
![]() |
6d1f059868 | ||
![]() |
3e1fa8cd31 | ||
![]() |
29e35d83b7 | ||
![]() |
526fbf0faf | ||
![]() |
a5d7e83985 | ||
![]() |
173aed3d0e | ||
![]() |
36ba4806b1 | ||
![]() |
0876bdf1a3 | ||
![]() |
4c13de9b45 | ||
![]() |
1e5962adbf | ||
![]() |
430cd6dbc2 | ||
![]() |
7ca4608427 | ||
![]() |
3efaa5ba7c | ||
![]() |
60cf7ae8b7 | ||
![]() |
cc77710b4a | ||
![]() |
f9a395e265 | ||
![]() |
b057194568 | ||
![]() |
83be6ba472 | ||
![]() |
9107c382f3 | ||
![]() |
495d47b7d2 | ||
![]() |
9c68e27ace | ||
![]() |
02e1912371 | ||
![]() |
1d50693e1b | ||
![]() |
937f5fe740 | ||
![]() |
cae4911ca8 | ||
![]() |
3d6d4bd949 | ||
![]() |
5195f97d35 | ||
![]() |
7262d5cc93 | ||
![]() |
ba66b63fe5 | ||
![]() |
eddd6aa113 | ||
![]() |
b2a63b42a5 | ||
![]() |
8f4603dd73 | ||
![]() |
bfbbb21197 | ||
![]() |
a6807d1822 | ||
![]() |
f594b22332 | ||
![]() |
0aaddf697f | ||
![]() |
cef1d19a6c | ||
![]() |
37ca66f6cf | ||
![]() |
2f6618d699 | ||
![]() |
5db0a8e2cc | ||
![]() |
542918d073 | ||
![]() |
10a3e3a341 | ||
![]() |
737fe8d763 | ||
![]() |
c6cc6ec7f6 | ||
![]() |
54e788364a | ||
![]() |
6e5e34662b | ||
![]() |
3efd94014f | ||
![]() |
ad0e6b6291 | ||
![]() |
4ccba9e3ac | ||
![]() |
32b697f5f1 | ||
![]() |
a2412e3f4c | ||
![]() |
9633f9a60f | ||
![]() |
17864b249f | ||
![]() |
0bada398df | ||
![]() |
fc52b43592 | ||
![]() |
7d21ce367d | ||
![]() |
9ada2f30ea | ||
![]() |
d471a691f7 | ||
![]() |
c305edc680 | ||
![]() |
9a3f4f8f8a | ||
![]() |
e9aee3bfd0 | ||
![]() |
77875e89ec | ||
![]() |
1ab2167ff9 | ||
![]() |
a116b3f1ae | ||
![]() |
bc38c38f8c | ||
![]() |
a3e7f3e7c5 | ||
![]() |
66ed80ad3a | ||
![]() |
3f854e16ac | ||
![]() |
4fa32f0f04 | ||
![]() |
5c924efa04 | ||
![]() |
30aae6298b | ||
![]() |
6c5e94061c | ||
![]() |
1426ffc0ee | ||
![]() |
f544b60aaa | ||
![]() |
7725d813c9 | ||
![]() |
60a39f4f5d | ||
![]() |
df57590ec6 | ||
![]() |
b7fe24923e | ||
![]() |
067a6f0174 | ||
![]() |
189e0d5b98 | ||
![]() |
56e5a83e68 | ||
![]() |
34f3918244 | ||
![]() |
f3a1629469 | ||
![]() |
3d922e6257 | ||
![]() |
38b9f67c3b | ||
![]() |
c6778dde82 | ||
![]() |
c27a458799 | ||
![]() |
8ed1addd1e | ||
![]() |
25c97e0019 | ||
![]() |
0fd8faa1ad | ||
![]() |
fc2b51194c | ||
![]() |
18dc12cd78 | ||
![]() |
489c814a48 | ||
![]() |
8190a795ed | ||
![]() |
d3963a61cb | ||
![]() |
4abc3ceb4b | ||
![]() |
05ee0afd54 | ||
![]() |
54e8dd0885 | ||
![]() |
63cdf80885 | ||
![]() |
2af86cec3d | ||
![]() |
e5cde191e1 | ||
![]() |
7be4047df0 | ||
![]() |
3fe356e65c | ||
![]() |
b95231c1e3 | ||
![]() |
f9fb52951d | ||
![]() |
b5419bd574 | ||
![]() |
8f660ca1e6 | ||
![]() |
2f47bafd6a | ||
![]() |
417a07c22d | ||
![]() |
611cd80861 | ||
![]() |
89bd04b9eb | ||
![]() |
5b394e82c9 | ||
![]() |
da6e888a32 | ||
![]() |
d3bf3d3b1c | ||
![]() |
dbd65d01b6 | ||
![]() |
c7ca67a036 | ||
![]() |
b88498ba85 | ||
![]() |
0c50a9eae9 | ||
![]() |
35944df7b0 | ||
![]() |
2a45d99059 | ||
![]() |
06f8cb1b8a | ||
![]() |
b2b075c123 | ||
![]() |
54dc6b7bf2 | ||
![]() |
ffa1507c2c | ||
![]() |
4f2afaa6fb | ||
![]() |
0b6d8150e4 | ||
![]() |
054adbaf1e | ||
![]() |
6b5e349d7e | ||
![]() |
1cecd593c8 | ||
![]() |
2bccb7132d | ||
![]() |
0d5458a7ad | ||
![]() |
cce9ddff80 | ||
![]() |
d330203486 | ||
![]() |
45a557641d | ||
![]() |
271c7d4923 | ||
![]() |
54bad99e0e | ||
![]() |
9a3ba6874c | ||
![]() |
5f670fbdc4 | ||
![]() |
bd07120d33 | ||
![]() |
4ff16fe73e | ||
![]() |
21c147c11b | ||
![]() |
752f5d6eb6 | ||
![]() |
b6c353db0c | ||
![]() |
666944df2e | ||
![]() |
3d37afd495 | ||
![]() |
f778ede8bd | ||
![]() |
8405d28670 | ||
![]() |
f93ad79f41 | ||
![]() |
dffa089173 | ||
![]() |
3990c0f43d | ||
![]() |
20f35afd53 | ||
![]() |
00eea387fc | ||
![]() |
2274631c8f | ||
![]() |
81be065fa5 | ||
![]() |
53a35c0d0c | ||
![]() |
cfbd9ba0e7 | ||
![]() |
5581ea8809 | ||
![]() |
fe9bd0afb9 | ||
![]() |
17c880b076 | ||
![]() |
ef6802ca60 | ||
![]() |
c7adb7a352 | ||
![]() |
10dfc8d92f | ||
![]() |
c7214e1d13 | ||
![]() |
94d9d2bb31 | ||
![]() |
0b560673ce | ||
![]() |
2b7078cd21 | ||
![]() |
99c46e4b73 | ||
![]() |
1e19227b31 | ||
![]() |
9b8c5c1860 | ||
![]() |
0afbf8cc3c | ||
![]() |
2aab8a114e | ||
![]() |
6b2a3a67a6 | ||
![]() |
cfefecd951 | ||
![]() |
05357d7937 | ||
![]() |
a0089aa345 | ||
![]() |
eb7e668eb9 | ||
![]() |
a3d717cb83 | ||
![]() |
fd65451679 | ||
![]() |
d0973e1cfb | ||
![]() |
c32264d9b7 | ||
![]() |
09a392433a | ||
![]() |
3975c712f0 | ||
![]() |
a8c013a145 | ||
![]() |
a69616c45c | ||
![]() |
39d31d3ee4 | ||
![]() |
588bcdc8ca | ||
![]() |
b33e6793de | ||
![]() |
bcceb701cd | ||
![]() |
9dea6f7720 | ||
![]() |
b64dabdffd | ||
![]() |
a2ac6f50aa | ||
![]() |
1a7a821582 | ||
![]() |
50e0f5dc80 | ||
![]() |
0f516d9026 | ||
![]() |
b23eeb6a14 | ||
![]() |
1298eab6ab | ||
![]() |
98939868fa | ||
![]() |
7daa2e210c | ||
![]() |
7d953332e0 | ||
![]() |
03685309fd | ||
![]() |
e09ca63317 | ||
![]() |
3dbb7f261d | ||
![]() |
93e8a401df | ||
![]() |
7f9409bbb3 | ||
![]() |
633464acfa | ||
![]() |
f744e22b49 | ||
![]() |
1a913aa12e | ||
![]() |
75f83210f4 | ||
![]() |
2170b75b26 | ||
![]() |
d1270c9d55 | ||
![]() |
546dfce209 | ||
![]() |
e0614e4f52 | ||
![]() |
49dc332a04 | ||
![]() |
60e1910e5b | ||
![]() |
4e2ab3a177 | ||
![]() |
41f649c9a9 | ||
![]() |
d91938c19d | ||
![]() |
a3cd1290be | ||
![]() |
7d33d1bace | ||
![]() |
4b9f5578a0 | ||
![]() |
59c8672f5c | ||
![]() |
a7920acff5 | ||
![]() |
79a87a9c2b | ||
![]() |
8d3581a49f | ||
![]() |
cd96377312 | ||
![]() |
8b98e67643 | ||
![]() |
6876263961 | ||
![]() |
4caeb64888 | ||
![]() |
70540a1f74 | ||
![]() |
f0dc206784 | ||
![]() |
caca8949de | ||
![]() |
0232941b1d | ||
![]() |
63445be4e5 | ||
![]() |
619885b484 | ||
![]() |
6592f83589 | ||
![]() |
43d74d7fa5 | ||
![]() |
cd981ec56a | ||
![]() |
12f308748f | ||
![]() |
ac0ba832c7 | ||
![]() |
c5ddada32e | ||
![]() |
8a950a7116 | ||
![]() |
64551a8386 | ||
![]() |
ae59a51193 | ||
![]() |
5dc7951dc0 | ||
![]() |
a866fbf381 | ||
![]() |
8af7200085 | ||
![]() |
f028dbf179 | ||
![]() |
aa2b4a688b | ||
![]() |
57475caab0 | ||
![]() |
34205f5bb5 | ||
![]() |
9f1608a6a2 | ||
![]() |
0a056cfd81 | ||
![]() |
5c1442766c | ||
![]() |
816f2f9cc2 | ||
![]() |
666623d39a | ||
![]() |
0eabb01e27 | ||
![]() |
b664db3cf3 | ||
![]() |
a5ecd4eb87 | ||
![]() |
f3f444c1df | ||
![]() |
81c51ec51c | ||
![]() |
b5a12fa6d3 | ||
![]() |
29c82cfb33 | ||
![]() |
2cd684f8e0 | ||
![]() |
c4d05010cb | ||
![]() |
6276f54752 | ||
![]() |
8e820cde13 | ||
![]() |
572395ac20 | ||
![]() |
95c74ae4ae | ||
![]() |
3fc710e0b1 | ||
![]() |
dd0a35273c | ||
![]() |
cf7404630e | ||
![]() |
ef872595ae | ||
![]() |
eac9ee8d3f | ||
![]() |
1d706bd77c | ||
![]() |
3e60997edb | ||
![]() |
a74846a0db | ||
![]() |
038d9118b6 | ||
![]() |
be771e5fd2 | ||
![]() |
1fbee7c316 | ||
![]() |
8b39ae13c7 | ||
![]() |
1bb6d8de6f | ||
![]() |
a888057453 | ||
![]() |
eae7343741 | ||
![]() |
c59fb1b477 | ||
![]() |
e7cb7bc737 | ||
![]() |
1ed48c774e | ||
![]() |
54b80ecf9f | ||
![]() |
97a73637e0 | ||
![]() |
653ecf91c2 | ||
![]() |
b7870ae78c | ||
![]() |
299008be36 | ||
![]() |
723d9af04d | ||
![]() |
6edcbdca19 | ||
![]() |
2882ee9f55 | ||
![]() |
78149505f9 | ||
![]() |
7b07ce3fef | ||
![]() |
d395c81606 | ||
![]() |
be257b6f9f | ||
![]() |
d4a8123267 | ||
![]() |
e1a7027fe8 | ||
![]() |
c5b0366a25 | ||
![]() |
217e3a59c4 | ||
![]() |
0ab88f5342 | ||
![]() |
8dfe37a3a3 | ||
![]() |
69eca63a84 | ||
![]() |
a5576f9738 | ||
![]() |
c833b77646 | ||
![]() |
ed446360a4 | ||
![]() |
9807225f90 | ||
![]() |
9331c22620 | ||
![]() |
cc84831cae | ||
![]() |
f490777502 | ||
![]() |
6e79767f5a | ||
![]() |
3bc7f46412 | ||
![]() |
8a2d3a8861 | ||
![]() |
538194344a | ||
![]() |
23765332fa | ||
![]() |
163e9b02bf | ||
![]() |
90f95de5c9 | ||
![]() |
ffc4380b30 | ||
![]() |
314ef9df03 | ||
![]() |
563be8ca2a | ||
![]() |
e527b375e8 | ||
![]() |
4e8a218d17 | ||
![]() |
57de02c9f2 | ||
![]() |
3c4972a53f | ||
![]() |
6af387ec6f | ||
![]() |
554b73643d | ||
![]() |
e941ae3811 | ||
![]() |
f75420c209 | ||
![]() |
d99806cc27 | ||
![]() |
cd8497b9fb | ||
![]() |
469b4b21d2 | ||
![]() |
926389f3a7 | ||
![]() |
52b7ebd6be | ||
![]() |
2e50b34c67 | ||
![]() |
a18e1305b3 | ||
![]() |
0779c34db8 | ||
![]() |
9e1d04fea7 | ||
![]() |
b44bffe954 | ||
![]() |
739925c902 | ||
![]() |
45e6bb7add | ||
![]() |
7b7689d307 | ||
![]() |
aa73411c14 | ||
![]() |
b96c18c952 | ||
![]() |
225bff226f | ||
![]() |
5d7ad69cd8 | ||
![]() |
b8ad5f4249 | ||
![]() |
63f9e7ee86 | ||
![]() |
88dce24375 | ||
![]() |
ea2a7c5ea4 | ||
![]() |
0ad7833ca4 | ||
![]() |
790f94533c | ||
![]() |
9089244db7 | ||
![]() |
aed8bace97 | ||
![]() |
4f5e0dd325 | ||
![]() |
6d8d20774f | ||
![]() |
2aa38f5bd3 | ||
![]() |
75fd6bd269 | ||
![]() |
86e6be342c | ||
![]() |
8556068534 | ||
![]() |
0763269ec5 | ||
![]() |
01b8ef39f5 | ||
![]() |
08e512a273 | ||
![]() |
1cbf1c681a | ||
![]() |
9b85b1b638 | ||
![]() |
788b1854b4 | ||
![]() |
86e28b4db8 | ||
![]() |
9c94de070a | ||
![]() |
23d6ca9942 | ||
![]() |
b16bfac107 | ||
![]() |
09dfc08207 | ||
![]() |
07fce7ba13 | ||
![]() |
52d8cbf092 | ||
![]() |
73b8f85816 | ||
![]() |
aadea5ab97 | ||
![]() |
54f7708eaa | ||
![]() |
d7aa245c33 | ||
![]() |
2cb0b41ce7 | ||
![]() |
e25f05224f | ||
![]() |
7639b5aa3e | ||
![]() |
4d41645598 | ||
![]() |
b1a8fafa62 | ||
![]() |
6461087c86 | ||
![]() |
7aa74c227b | ||
![]() |
0fd95e5db5 | ||
![]() |
8f30f4170c | ||
![]() |
ad4cfffe3d | ||
![]() |
2dcd67ce1a | ||
![]() |
4c3090ace9 | ||
![]() |
fb3777f085 | ||
![]() |
018b8e1d62 | ||
![]() |
ba3c346195 | ||
![]() |
e420b3981c | ||
![]() |
76cd6b662b | ||
![]() |
0b6ff59448 | ||
![]() |
0752b6b23c | ||
![]() |
c5b0b6ff32 | ||
![]() |
ab3986a684 | ||
![]() |
d0108869ee | ||
![]() |
58d043b0d0 | ||
![]() |
d918d571cc | ||
![]() |
75ab48958c | ||
![]() |
3200007a69 | ||
![]() |
7132526dd2 | ||
![]() |
f8266a228c | ||
![]() |
59c7deab09 | ||
![]() |
1a7f2c8f45 | ||
![]() |
e6905805bb | ||
![]() |
90c7ae70c6 | ||
![]() |
ef49a9243b | ||
![]() |
db7c8562ed | ||
![]() |
51eac99ce4 | ||
![]() |
c3f83b6761 | ||
![]() |
ce75f48acb | ||
![]() |
9fd5c6f619 | ||
![]() |
f41e5ec928 | ||
![]() |
cd12fe86d3 | ||
![]() |
d6fb8f12c6 | ||
![]() |
371fb853ee | ||
![]() |
a0f532072d | ||
![]() |
3405efe934 | ||
![]() |
af2e1f4e4d | ||
![]() |
4fe8c473fd | ||
![]() |
b2a0e98a60 | ||
![]() |
74372424ae | ||
![]() |
4a7a9e9951 | ||
![]() |
81fd005af9 | ||
![]() |
2395069b0b | ||
![]() |
032dfddb6b | ||
![]() |
e6f7da4036 | ||
![]() |
7190971b44 | ||
![]() |
6b1170cb97 | ||
![]() |
ec06ffe294 | ||
![]() |
03ea478f20 | ||
![]() |
e4d3ff2374 | ||
![]() |
bcbcb3d107 | ||
![]() |
765d8a33dd | ||
![]() |
58e733b5a0 | ||
![]() |
0828d0f5c7 | ||
![]() |
deaabff752 | ||
![]() |
6623744172 | ||
![]() |
e2d3cefc95 | ||
![]() |
dd61f7795f | ||
![]() |
aa038994b2 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -92,3 +92,4 @@ GRAPHICS
|
||||
# hex files
|
||||
*.hex binary
|
||||
*.eep binary
|
||||
nix/sources.nix linguist-generated=true
|
||||
|
21
.github/workflows/api.yml
vendored
21
.github/workflows/api.yml
vendored
@@ -25,18 +25,13 @@ jobs:
|
||||
- name: Generate API Data
|
||||
run: qmk generate-api
|
||||
|
||||
- name: Install rsync
|
||||
run: |
|
||||
apt-get update && apt-get install -y rsync
|
||||
|
||||
- name: Upload API Data
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
with:
|
||||
ACCESS_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: main
|
||||
FOLDER: api_data/v1
|
||||
CLEAN: true
|
||||
GIT_CONFIG_EMAIL: hello@qmk.fm
|
||||
REPOSITORY_NAME: qmk/qmk_keyboards
|
||||
TARGET_FOLDER: v1
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ secrets.API_SPACE_MASTER }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||
SOURCE_DIR: 'api_data'
|
||||
|
2
.github/workflows/cli.yml
vendored
2
.github/workflows/cli.yml
vendored
@@ -23,6 +23,6 @@ jobs:
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: pip3 install -r requirements.txt
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
- name: Run tests
|
||||
run: bin/qmk pytest
|
||||
|
21
.github/workflows/develop_api.yml
vendored
21
.github/workflows/develop_api.yml
vendored
@@ -25,18 +25,13 @@ jobs:
|
||||
- name: Generate API Data
|
||||
run: qmk generate-api
|
||||
|
||||
- name: Install rsync
|
||||
run: |
|
||||
apt-get update && apt-get install -y rsync
|
||||
|
||||
- name: Upload API Data
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
with:
|
||||
ACCESS_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: main
|
||||
FOLDER: api_data/v1
|
||||
CLEAN: true
|
||||
GIT_CONFIG_EMAIL: hello@qmk.fm
|
||||
REPOSITORY_NAME: qmk/qmk_keyboards_devel
|
||||
TARGET_FOLDER: v1
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ secrets.API_SPACE_DEVELOP }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||
SOURCE_DIR: 'api_data'
|
||||
|
61
.github/workflows/format.yaml
vendored
61
.github/workflows/format.yaml
vendored
@@ -1,47 +1,42 @@
|
||||
name: Format Codebase
|
||||
name: PR Lint Format
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
paths:
|
||||
- 'drivers/**'
|
||||
- 'lib/arm_atsam/**'
|
||||
- 'lib/lib8tion/**'
|
||||
- 'lib/python/**'
|
||||
- 'platforms/**'
|
||||
- 'quantum/**'
|
||||
- 'tests/**'
|
||||
- 'tmk_core/**'
|
||||
|
||||
jobs:
|
||||
format:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
container: qmkfm/base_container
|
||||
|
||||
# protect against those who develop with their fork on master
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
container: qmkfm/base_container
|
||||
|
||||
steps:
|
||||
- uses: rlespinasse/github-slug-action@v3.x
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
token: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
apt-get update && apt-get install -y dos2unix
|
||||
|
||||
- name: Format files
|
||||
run: |
|
||||
bin/qmk cformat -a
|
||||
bin/qmk pyformat
|
||||
bin/qmk fileformat
|
||||
|
||||
- name: Become QMK Bot
|
||||
run: |
|
||||
git config user.name 'QMK Bot'
|
||||
git config user.email 'hello@qmk.fm'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
- uses: trilom/file-changes-action@v1.2.4
|
||||
id: file_changes
|
||||
with:
|
||||
delete-branch: true
|
||||
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }}
|
||||
author: QMK Bot <hello@qmk.fm>
|
||||
committer: QMK Bot <hello@qmk.fm>
|
||||
commit-message: Format code according to conventions
|
||||
title: '[CI] Format code according to conventions'
|
||||
output: ' '
|
||||
fileOutput: ' '
|
||||
|
||||
- name: Run qmk cformat and qmk pyformat
|
||||
shell: 'bash {0}'
|
||||
run: |
|
||||
qmk cformat --core-only -n $(< ~/files.txt)
|
||||
cformat_exit=$?
|
||||
qmk pyformat -n
|
||||
pyformat_exit=$?
|
||||
|
||||
exit $((cformat_exit + pyformat_exit))
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -5,6 +5,7 @@
|
||||
*.eep
|
||||
*.elf
|
||||
*.hex
|
||||
*.uf2
|
||||
*.qmk
|
||||
!util/bootloader.hex
|
||||
!quantum/tools/eeprom_reset.hex
|
||||
@@ -50,6 +51,7 @@ doxygen/
|
||||
.browse.VC.db*
|
||||
*.stackdump
|
||||
# Let these ones be user specific, since we have so many different configurations
|
||||
*.code-workspace
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/tasks.json
|
||||
@@ -71,6 +73,7 @@ id_rsa_*
|
||||
|
||||
# python things
|
||||
__pycache__
|
||||
.python-version
|
||||
|
||||
# prerequisites for updating ChibiOS
|
||||
/util/fmpp*
|
||||
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -22,5 +22,6 @@
|
||||
"[markdown]": {
|
||||
"editor.trimAutoWhitespace": false,
|
||||
"files.trimTrailingWhitespace": false
|
||||
}
|
||||
},
|
||||
"python.formatting.provider": "yapf"
|
||||
}
|
||||
|
17
Makefile
17
Makefile
@@ -29,6 +29,13 @@ $(info QMK Firmware $(QMK_VERSION))
|
||||
endif
|
||||
endif
|
||||
|
||||
# Determine which qmk cli to use
|
||||
ifeq (,$(shell which qmk))
|
||||
QMK_BIN = bin/qmk
|
||||
else
|
||||
QMK_BIN = qmk
|
||||
endif
|
||||
|
||||
# avoid 'Entering|Leaving directory' messages
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
@@ -86,8 +93,8 @@ clean:
|
||||
|
||||
.PHONY: distclean
|
||||
distclean: clean
|
||||
echo -n 'Deleting *.bin and *.hex ... '
|
||||
rm -f *.bin *.hex
|
||||
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
|
||||
rm -f *.bin *.hex *.uf2
|
||||
echo 'done.'
|
||||
|
||||
#Compatibility with the old make variables, anything you specify directly on the command line
|
||||
@@ -384,7 +391,7 @@ define PARSE_KEYMAP
|
||||
# Format it in bold
|
||||
KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR)
|
||||
# Specify the variables that we are passing forward to submake
|
||||
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) REQUIRE_PLATFORM_KEY=$$(REQUIRE_PLATFORM_KEY)
|
||||
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) REQUIRE_PLATFORM_KEY=$$(REQUIRE_PLATFORM_KEY) QMK_BIN=$$(QMK_BIN)
|
||||
# And the first part of the make command
|
||||
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_TARGET)
|
||||
# The message to display
|
||||
@@ -501,8 +508,8 @@ endef
|
||||
%:
|
||||
# Check if we have the CMP tool installed
|
||||
cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
|
||||
# Ensure that bin/qmk works.
|
||||
if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; exit 1; fi
|
||||
# Ensure that $(QMK_BIN) works.
|
||||
if ! $(QMK_BIN) hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; exit 1; fi
|
||||
# Check if the submodules are dirty, and display a warning if they are
|
||||
ifndef SKIP_GIT
|
||||
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
|
||||
|
48
bin/qmk
48
bin/qmk
@@ -3,7 +3,6 @@
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
from importlib.util import find_spec
|
||||
from pathlib import Path
|
||||
|
||||
# Add the QMK python libs to our path
|
||||
@@ -12,52 +11,9 @@ qmk_dir = script_dir.parent
|
||||
python_lib_dir = Path(qmk_dir / 'lib' / 'python').resolve()
|
||||
sys.path.append(str(python_lib_dir))
|
||||
|
||||
|
||||
def _check_modules(requirements):
|
||||
""" Check if the modules in the given requirements.txt are available.
|
||||
"""
|
||||
with Path(qmk_dir / requirements).open() as fd:
|
||||
for line in fd.readlines():
|
||||
line = line.strip().replace('<', '=').replace('>', '=')
|
||||
|
||||
if len(line) == 0 or line[0] == '#' or line.startswith('-r'):
|
||||
continue
|
||||
|
||||
if '#' in line:
|
||||
line = line.split('#')[0]
|
||||
|
||||
module = dict()
|
||||
module['name'] = line.split('=')[0] if '=' in line else line
|
||||
module['import'] = module['name'].replace('-', '_')
|
||||
|
||||
# Not every module is importable by its own name.
|
||||
if module['name'] == "pep8-naming":
|
||||
module['import'] = "pep8ext_naming"
|
||||
|
||||
if not find_spec(module['import']):
|
||||
print('Could not find module %s!' % module['name'])
|
||||
print('Please run `python3 -m pip install -r %s` to install required python dependencies.' % (qmk_dir / requirements,))
|
||||
if developer:
|
||||
print('You can also turn off developer mode: qmk config user.developer=None')
|
||||
print()
|
||||
exit(255)
|
||||
|
||||
|
||||
developer = False
|
||||
# Make sure our modules have been setup
|
||||
_check_modules('requirements.txt')
|
||||
|
||||
# Setup the CLI
|
||||
import milc # noqa
|
||||
|
||||
# For developers additional modules are needed
|
||||
if milc.cli.config.user.developer:
|
||||
# Do not run the check for 'config',
|
||||
# so users can turn off developer mode
|
||||
if len(sys.argv) == 1 or (len(sys.argv) > 1 and 'config' != sys.argv[1]):
|
||||
developer = True
|
||||
_check_modules('requirements-dev.txt')
|
||||
|
||||
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
|
||||
|
||||
|
||||
@@ -73,9 +29,13 @@ def main():
|
||||
"""
|
||||
# Change to the root of our checkout
|
||||
os.environ['ORIG_CWD'] = os.getcwd()
|
||||
os.environ['DEPRECATED_BIN_QMK'] = '1'
|
||||
os.chdir(qmk_dir)
|
||||
|
||||
print('Warning: The bin/qmk script is being deprecated. Please install the QMK CLI: python3 -m pip install qmk', file=sys.stderr)
|
||||
|
||||
# Import the subcommands
|
||||
import milc.subcommand.config # noqa
|
||||
import qmk.cli # noqa
|
||||
|
||||
# Execute
|
||||
|
@@ -89,11 +89,17 @@ ifeq ($(strip $(BOOTLOADER)), USBasp)
|
||||
BOOTLOADER_SIZE = 4096
|
||||
endif
|
||||
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
|
||||
# DO NOT USE THIS BOOTLOADER IN NEW PROJECTS!
|
||||
# It is extremely prone to bricking, and is only included to support existing boards.
|
||||
OPT_DEFS += -DBOOTLOADER_MS
|
||||
BOOTLOADER_SIZE = 6144
|
||||
BOOTLOADER_SIZE ?= 8192
|
||||
FIRMWARE_FORMAT = bin
|
||||
cpfirmware: lufa_warning
|
||||
.INTERMEDIATE: lufa_warning
|
||||
lufa_warning: $(FIRMWARE_FORMAT)
|
||||
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
|
||||
$(info LUFA MASS STORAGE Bootloader selected)
|
||||
$(info DO NOT USE THIS BOOTLOADER IN NEW PROJECTS!)
|
||||
$(info It is extremely prone to bricking, and is only included to support existing boards.)
|
||||
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
|
||||
endif
|
||||
ifdef BOOTLOADER_SIZE
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE))
|
||||
@@ -137,3 +143,6 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)
|
||||
DFU_ARGS = -d 1EAF:0003 -a 2 -R
|
||||
DFU_SUFFIX_ARGS = -v 1EAF -p 0003
|
||||
endif
|
||||
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
|
||||
OPT_DEFS += -DBOOTLOADER_TINYUF2
|
||||
endif
|
||||
|
@@ -28,4 +28,4 @@ endif
|
||||
|
||||
# Generate the keymap.c
|
||||
$(KEYBOARD_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
||||
bin/qmk json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
||||
$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
||||
|
@@ -12,6 +12,9 @@ endif
|
||||
|
||||
include common.mk
|
||||
|
||||
# Set the qmk cli to use
|
||||
QMK_BIN ?= qmk
|
||||
|
||||
# Set the filename for the final firmware binary
|
||||
KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD))
|
||||
TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP)
|
||||
@@ -97,7 +100,7 @@ MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
|
||||
|
||||
# Pull in rules from info.json
|
||||
INFO_RULES_MK = $(shell bin/qmk generate-rules-mk --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
|
||||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
|
||||
include $(INFO_RULES_MK)
|
||||
|
||||
# Check for keymap.json first, so we can regenerate keymap.c
|
||||
@@ -205,6 +208,7 @@ endif
|
||||
#
|
||||
# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
|
||||
#
|
||||
QMK_KEYBOARD_H = $(KEYBOARD_OUTPUT)/src/default_keyboard.h
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
|
||||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
|
||||
endif
|
||||
@@ -294,12 +298,15 @@ endif
|
||||
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||
|
||||
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
|
||||
bin/qmk generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
|
||||
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
|
||||
|
||||
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
|
||||
$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h
|
||||
|
||||
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
|
||||
bin/qmk generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||
$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||
|
||||
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||
|
||||
.INTERMEDIATE : generated-files
|
||||
|
||||
|
@@ -17,6 +17,7 @@ SERIAL_PATH := $(QUANTUM_PATH)/serial_link
|
||||
|
||||
QUANTUM_SRC += \
|
||||
$(QUANTUM_DIR)/quantum.c \
|
||||
$(QUANTUM_DIR)/send_string.c \
|
||||
$(QUANTUM_DIR)/bitwise.c \
|
||||
$(QUANTUM_DIR)/led.c \
|
||||
$(QUANTUM_DIR)/keymap_common.c \
|
||||
@@ -222,14 +223,17 @@ VALID_LED_MATRIX_TYPES := IS31FL3731 custom
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
||||
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
|
||||
$(error LED_MATRIX_DRIVER="$(LED_MATRIX_DRIVER)" is not a valid matrix type)
|
||||
else
|
||||
BACKLIGHT_ENABLE = yes
|
||||
BACKLIGHT_DRIVER = custom
|
||||
OPT_DEFS += -DLED_MATRIX_ENABLE
|
||||
SRC += $(QUANTUM_DIR)/led_matrix.c
|
||||
SRC += $(QUANTUM_DIR)/led_matrix_drivers.c
|
||||
$(error "$(LED_MATRIX_DRIVER)" is not a valid matrix type)
|
||||
endif
|
||||
OPT_DEFS += -DLED_MATRIX_ENABLE
|
||||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
||||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
||||
OPT_DEFS += -DLIB8_ATTINY
|
||||
endif
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
|
||||
SRC += $(QUANTUM_DIR)/led_matrix.c
|
||||
SRC += $(QUANTUM_DIR)/led_matrix_drivers.c
|
||||
CIE1931_CURVE := yes
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3731)
|
||||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
@@ -346,7 +350,11 @@ endif
|
||||
VALID_BACKLIGHT_TYPES := pwm timer software custom
|
||||
|
||||
BACKLIGHT_ENABLE ?= no
|
||||
BACKLIGHT_DRIVER ?= pwm
|
||||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
||||
BACKLIGHT_DRIVER ?= software
|
||||
else
|
||||
BACKLIGHT_DRIVER ?= pwm
|
||||
endif
|
||||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
|
||||
$(error BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
|
||||
@@ -421,10 +429,6 @@ ifeq ($(strip $(TERMINAL_ENABLE)), yes)
|
||||
OPT_DEFS += -DUSER_PRINT
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(USB_HID_ENABLE)), yes)
|
||||
include $(TMK_DIR)/protocol/usb_hid.mk
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(WPM_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/wpm.c
|
||||
OPT_DEFS += -DWPM_ENABLE
|
||||
@@ -458,6 +462,23 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/dip_switch.c
|
||||
endif
|
||||
|
||||
VALID_MAGIC_TYPES := yes full lite
|
||||
BOOTMAGIC_ENABLE ?= no
|
||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
||||
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),)
|
||||
$(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic)
|
||||
endif
|
||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), full)
|
||||
OPT_DEFS += -DBOOTMAGIC_LITE
|
||||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/bootmagic_lite.c
|
||||
else
|
||||
OPT_DEFS += -DBOOTMAGIC_ENABLE
|
||||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/bootmagic_full.c
|
||||
endif
|
||||
endif
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/bootmagic
|
||||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/magic.c
|
||||
|
||||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
||||
|
||||
CUSTOM_MATRIX ?= no
|
||||
@@ -672,4 +693,4 @@ ifeq ($(strip $(USBPD_ENABLE)), yes)
|
||||
# Board designers can add their own driver to $(SRC)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
@@ -38,5 +38,9 @@
|
||||
"RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"},
|
||||
"PRODUCT": {"info_key": "keyboard_folder", "to_json": false},
|
||||
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"},
|
||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"}
|
||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"},
|
||||
"QMK_ESC_OUTPUT": {"info_key": "qmk_lufa_bootloader.esc_output"},
|
||||
"QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"},
|
||||
"QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
|
||||
"QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"}
|
||||
}
|
||||
|
443
data/mappings/keyboard_aliases.json
Normal file
443
data/mappings/keyboard_aliases.json
Normal file
@@ -0,0 +1,443 @@
|
||||
{
|
||||
# Format for each entry:
|
||||
# <alias>: {
|
||||
# target: <keyboard_folder>,
|
||||
# layouts: {
|
||||
# <layout_alias>: <layout_target>
|
||||
# }
|
||||
# }
|
||||
#
|
||||
# Both target and layouts are optional.
|
||||
'2_milk': {
|
||||
target: 'spaceman/2_milk'
|
||||
},
|
||||
'aeboards/ext65': {
|
||||
target: 'aeboards/ext65/rev1'
|
||||
},
|
||||
'ai03/equinox': {
|
||||
target: 'ai03/equinox/rev1'
|
||||
},
|
||||
aleth42: {
|
||||
target: 'aleth42/rev1'
|
||||
},
|
||||
alice: {
|
||||
target: 'tgr/alice'
|
||||
},
|
||||
angel17: {
|
||||
target: 'angel17/alpha'
|
||||
},
|
||||
angel64: {
|
||||
target: 'angel64/alpha'
|
||||
},
|
||||
at101_blackheart: {
|
||||
target: 'at101_bh'
|
||||
},
|
||||
'atom47/rev2': {
|
||||
target: 'maartenwut/atom47/rev2'
|
||||
},
|
||||
'atom47/rev3': {
|
||||
target: 'maartenwut/atom47/rev3'
|
||||
},
|
||||
bear_face: {
|
||||
target: 'bear_face/v1'
|
||||
},
|
||||
'bpiphany/pegasushoof': {
|
||||
target: 'bpiphany/pegasushoof/2013'
|
||||
},
|
||||
chavdai40: {
|
||||
target: 'chavdai40/rev1'
|
||||
},
|
||||
'candybar/lefty': {
|
||||
target: 'tkc/candybar/lefty'
|
||||
},
|
||||
'candybar/righty': {
|
||||
target: 'tkc/candybar/righty'
|
||||
},
|
||||
canoe: {
|
||||
target: 'percent/canoe'
|
||||
},
|
||||
'cmm_studio/saka68': {
|
||||
target: 'cmm_studio/saka68/solder'
|
||||
},
|
||||
'crkbd/rev1': {
|
||||
target: 'crkbd/rev1/legacy'
|
||||
},
|
||||
'doro67/multi': {
|
||||
layouts: {
|
||||
LAYOUT_ansi: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
'doro67/regular': {
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
'doro67/rgb': {
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
drakon: {
|
||||
target: 'jagdpietr/drakon'
|
||||
},
|
||||
'dztech/dz60rgb': {
|
||||
target: 'dztech/dz60rgb/v1'
|
||||
},
|
||||
'dztech/dz60rgb_ansi': {
|
||||
target: 'dztech/dz60rgb_ansi/v1'
|
||||
},
|
||||
'dztech/dz60rgb_wkl': {
|
||||
target: 'dztech/dz60rgb_wkl/v1'
|
||||
},
|
||||
'dztech/dz65rgb': {
|
||||
target: 'dztech/dz65rgb/v1'
|
||||
},
|
||||
eek: {
|
||||
target: 'eek/silk_down'
|
||||
},
|
||||
ergoinu: {
|
||||
target: 'dm9records/ergoinu'
|
||||
},
|
||||
'exclusive/e85': {
|
||||
target: 'exclusive/e85/hotswap'
|
||||
},
|
||||
gh60: {
|
||||
target: 'gh60/revc'
|
||||
},
|
||||
'handwired/ferris': {
|
||||
target: 'ferris/0_1'
|
||||
},
|
||||
'helix/pico/sc/back': {
|
||||
target: 'helix/pico/sc'
|
||||
},
|
||||
'helix/pico/sc/under': {
|
||||
target: 'helix/pico/sc'
|
||||
},
|
||||
'helix/rev2/back/oled': {
|
||||
target: 'helix/rev2/back'
|
||||
},
|
||||
'helix/rev2/oled': {
|
||||
target: 'helix/rev2'
|
||||
},
|
||||
'helix/rev2/oled/back': {
|
||||
target: 'helix/rev2/back'
|
||||
},
|
||||
'helix/rev2/oled/under': {
|
||||
target: 'helix/rev2/under'
|
||||
},
|
||||
'helix/rev2/sc/back': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/oled': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/oledback': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/oledunder': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/under': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/under': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/under/oled': {
|
||||
target: 'helix/rev2/under'
|
||||
},
|
||||
id80: {
|
||||
target: 'id80/ansi'
|
||||
},
|
||||
idb_60: {
|
||||
target: 'idb/idb_60',
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_all'
|
||||
}
|
||||
},
|
||||
jones: {
|
||||
target: 'jones/v03_1'
|
||||
},
|
||||
katana60: {
|
||||
target: 'rominronin/katana60/rev1'
|
||||
},
|
||||
'kbdfans/kbd67mkiirgb': {
|
||||
target: 'kbdfans/kbd67/mkiirgb',
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
'kbdfans/kbd67/mkiirgb': {
|
||||
target: 'kbdfans/kbd67/mkiirgb/v1'
|
||||
},
|
||||
'keebio/dsp40': {
|
||||
target: 'keebio/dsp40/rev1'
|
||||
},
|
||||
'keycapsss/plaid_pad': {
|
||||
target: 'keycapsss/plaid_pad/rev1'
|
||||
},
|
||||
kudox: {
|
||||
target: 'kudox/rev1'
|
||||
},
|
||||
'lfkeyboards/lfk78': {
|
||||
target: 'lfkeyboards/lfk78/revj'
|
||||
},
|
||||
'lfkeyboards/smk65': {
|
||||
target: 'lfkeyboards/smk65/revb'
|
||||
},
|
||||
'maartenwut/atom47/rev2': {
|
||||
target: 'evyd13/atom47/rev2'
|
||||
},
|
||||
'maartenwut/atom47/rev3': {
|
||||
target: 'evyd13/atom47/rev3'
|
||||
},
|
||||
'maartenwut/eon40': {
|
||||
target: 'evyd13/eon40'
|
||||
},
|
||||
'maartenwut/eon65': {
|
||||
target: 'evyd13/eon65'
|
||||
},
|
||||
'maartenwut/eon75': {
|
||||
target: 'evyd13/eon75'
|
||||
},
|
||||
'maartenwut/eon87': {
|
||||
target: 'evyd13/eon87'
|
||||
},
|
||||
'maartenwut/eon95': {
|
||||
target: 'evyd13/eon95'
|
||||
},
|
||||
'maartenwut/gh80_1800': {
|
||||
target: 'evyd13/gh80_1800'
|
||||
},
|
||||
'maartenwut/gh80_3700': {
|
||||
target: 'evyd13/gh80_3700'
|
||||
},
|
||||
'maartenwut/minitomic': {
|
||||
target: 'evyd13/minitomic'
|
||||
},
|
||||
'maartenwut/mx5160': {
|
||||
target: 'evyd13/mx5160'
|
||||
},
|
||||
'maartenwut/nt660': {
|
||||
target: 'evyd13/nt660'
|
||||
},
|
||||
'maartenwut/omrontkl': {
|
||||
target: 'evyd13/omrontkl'
|
||||
},
|
||||
'maartenwut/plain60': {
|
||||
target: 'evyd13/plain60'
|
||||
},
|
||||
'maartenwut/pockettype': {
|
||||
target: 'evyd13/pockettype'
|
||||
},
|
||||
'maartenwut/quackfire': {
|
||||
target: 'evyd13/quackfire'
|
||||
},
|
||||
'maartenwut/solheim68': {
|
||||
target: 'evyd13/solheim68'
|
||||
},
|
||||
'maartenwut/ta65': {
|
||||
target: 'evyd13/ta65'
|
||||
},
|
||||
'maartenwut/wasdat': {
|
||||
target: 'evyd13/wasdat'
|
||||
},
|
||||
'maartenwut/wasdat_code': {
|
||||
target: 'evyd13/wasdat_code'
|
||||
},
|
||||
'maartenwut/wonderland': {
|
||||
target: 'evyd13/wonderland'
|
||||
},
|
||||
'mechlovin/hannah910': {
|
||||
target: 'mechlovin/hannah910/rev1'
|
||||
},
|
||||
'mechlovin/adelais/rgb_led': {
|
||||
target: 'mechlovin/adelais/rgb_led/rev1'
|
||||
},
|
||||
'mechlovin/adelais/standard_led': {
|
||||
target: 'mechlovin/adelais/standard_led/rev2'
|
||||
},
|
||||
'mechlovin/delphine': {
|
||||
target: 'mechlovin/delphine/mono_led'
|
||||
},
|
||||
'mechlovin/hannah60rgb': {
|
||||
target: 'mechlovin/hannah60rgb/rev1'
|
||||
},
|
||||
'melgeek/z70ultra': {
|
||||
target: 'melgeek/z70ultra/rev1'
|
||||
},
|
||||
'mechlovin/hannah65': {
|
||||
target: 'mechlovin/hannah65/rev1'
|
||||
},
|
||||
model01: {
|
||||
target: 'keyboardio/model01'
|
||||
},
|
||||
m0lly: {
|
||||
target: 'tkc/m0lly'
|
||||
},
|
||||
'montsinger/rebound': {
|
||||
target: 'montsinger/rebound/rev1'
|
||||
},
|
||||
nomu30: {
|
||||
target: 'nomu30/rev1'
|
||||
},
|
||||
'noxary/268_2': {
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
oddball: {
|
||||
target: 'oddball/v1'
|
||||
},
|
||||
omnikey_blackheart: {
|
||||
target: 'omnikey_bh'
|
||||
},
|
||||
'pabile/p20': {
|
||||
target: 'pabile/p20/ver1'
|
||||
},
|
||||
'pancake/feather': {
|
||||
target: 'spaceman/pancake/feather'
|
||||
},
|
||||
'pancake/promicro': {
|
||||
target: 'spaceman/pancake/promicro'
|
||||
},
|
||||
'percent/canoe': {
|
||||
layouts: {
|
||||
LAYOUT_iso: 'LAYOUT_65_iso_blocker'
|
||||
}
|
||||
},
|
||||
plaid: {
|
||||
target: 'dm9records/plaid'
|
||||
},
|
||||
plain60: {
|
||||
target: 'maartenwut/plain60'
|
||||
},
|
||||
'ploopyco/trackball': {
|
||||
target: 'ploopyco/trackball/rev1_005'
|
||||
},
|
||||
polilla: {
|
||||
target: 'polilla/rev1'
|
||||
},
|
||||
'preonic/rev1': {
|
||||
layouts: {
|
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
|
||||
}
|
||||
},
|
||||
'preonic/rev2': {
|
||||
layouts: {
|
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
|
||||
}
|
||||
},
|
||||
'preonic/rev3': {
|
||||
layouts: {
|
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
|
||||
}
|
||||
},
|
||||
'primekb/prime_l': {
|
||||
target: 'primekb/prime_l/v1'
|
||||
},
|
||||
'primekb/prime_l_v2': {
|
||||
target: 'primekb/prime_l/v2'
|
||||
},
|
||||
'projectkb/alice': {
|
||||
target: 'projectkb/alice/rev1'
|
||||
},
|
||||
'rama/koyu': {
|
||||
target: 'wilba_tech/rama_works_koyu'
|
||||
},
|
||||
'rama/m6_a': {
|
||||
target: 'wilba_tech/rama_works_m6_a'
|
||||
},
|
||||
'rama/m6_b': {
|
||||
target: 'wilba_tech/rama_works_m6_b'
|
||||
},
|
||||
'rama/m10_b': {
|
||||
target: 'wilba_tech/rama_works_m10_b'
|
||||
},
|
||||
'rama/m60_a': {
|
||||
target: 'wilba_tech/rama_works_m60_a'
|
||||
},
|
||||
'rama/u80_a': {
|
||||
target: 'wilba_tech/rama_works_u80_a'
|
||||
},
|
||||
'ramonimbao/herringbone': {
|
||||
target: 'ramonimbao/herringbone/v1'
|
||||
},
|
||||
'rgbkb/pan': {
|
||||
target: 'rgbkb/pan/rev1/32a'
|
||||
},
|
||||
'rgbkb/pan/rev1': {
|
||||
target: 'rgbkb/pan/rev1/32a'
|
||||
},
|
||||
romac: {
|
||||
target: 'kingly_keys/romac'
|
||||
},
|
||||
ropro: {
|
||||
target: 'kingly_keys/ropro'
|
||||
},
|
||||
satan: {
|
||||
target: 'gh60/satan'
|
||||
},
|
||||
skog: {
|
||||
target: 'percent/skog'
|
||||
},
|
||||
speedo: {
|
||||
target: 'cozykeys/speedo/v2'
|
||||
},
|
||||
stoutgat: {
|
||||
target: 'tkw/stoutgat/v1'
|
||||
},
|
||||
suihankey: {
|
||||
target: 'suihankey/split/alpha'
|
||||
},
|
||||
ta65: {
|
||||
target: 'maartenwut/ta65'
|
||||
},
|
||||
tartan: {
|
||||
target: 'dm9records/tartan'
|
||||
},
|
||||
tkc1800: {
|
||||
target: 'tkc/tkc1800'
|
||||
},
|
||||
'tkw/stoutgat/v2': {
|
||||
target: 'tkw/stoutgat/v2/f411'
|
||||
},
|
||||
underscore33: {
|
||||
target: 'underscore33/rev1'
|
||||
},
|
||||
vinta: {
|
||||
layouts: {
|
||||
LAYOUT_67_ansi: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
wasdat: {
|
||||
target: 'maartenwut/wasdat'
|
||||
},
|
||||
'westfoxtrot/cypher': {
|
||||
target: 'westfoxtrot/cypher/rev1'
|
||||
},
|
||||
'whale/sk': {
|
||||
target: 'whale/sk/v3'
|
||||
},
|
||||
'xelus/dawn60': {
|
||||
target: 'xelus/dawn60/rev1'
|
||||
},
|
||||
'xelus/valor': {
|
||||
target: 'xelus/valor/rev1'
|
||||
},
|
||||
yd60mq: {
|
||||
target: 'yd60mq/12led'
|
||||
},
|
||||
ymd75: {
|
||||
target: 'ymd75/rev1'
|
||||
},
|
||||
z150_blackheart: {
|
||||
target: 'z150_bh'
|
||||
},
|
||||
zeal60: {
|
||||
target: 'wilba_tech/zeal60'
|
||||
},
|
||||
zeal65: {
|
||||
target: 'wilba_tech/zeal65'
|
||||
}
|
||||
}
|
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"processor": {
|
||||
"type": "string",
|
||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F411", "STM32G431", "STM32G474", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66F18", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L433", "STM32L443", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||
},
|
||||
"board": {
|
||||
"type": "string",
|
||||
@@ -34,7 +34,7 @@
|
||||
},
|
||||
"bootloader": {
|
||||
"type": "string",
|
||||
"enum": ["atmel-dfu", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "stm32-dfu", "stm32duino", "unknown", "USBasp"]
|
||||
"enum": ["atmel-dfu", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "stm32-dfu", "stm32duino", "unknown", "USBasp", "tinyuf2"]
|
||||
},
|
||||
"diode_direction": {
|
||||
"type": "string",
|
||||
@@ -88,7 +88,7 @@
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"enum": ["LAYOUT"]
|
||||
"enum": ["LAYOUT", "LAYOUT_planck_1x2uC"]
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
@@ -299,6 +299,28 @@
|
||||
"pattern": "^[0-9A-F]x[0-9A-F][0-9A-F][0-9A-F][0-9A-F]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"qmk_lufa_bootloader": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"esc_output": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
},
|
||||
"esc_input": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
},
|
||||
"led": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
},
|
||||
"speaker": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ Four times a year QMK runs a process for merging Breaking Changes. A Breaking Ch
|
||||
|
||||
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||
|
||||
### Relocated Keyboards :id-relocated-keyboards
|
||||
### Relocated Keyboards :id=relocated-keyboards
|
||||
|
||||
#### The Key Company project consolidation ([#9547](https://github.com/qmk/qmk_firmware/pull/9547))
|
||||
#### relocating boards by flehrad to flehrad/ folder ([#9635](https://github.com/qmk/qmk_firmware/pull/9635))
|
||||
|
@@ -5,7 +5,7 @@ Four times a year QMK runs a process for merging Breaking Changes. A Breaking Ch
|
||||
|
||||
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||
|
||||
### Relocated Keyboards :id-relocated-keyboards
|
||||
### Relocated Keyboards :id=relocated-keyboards
|
||||
|
||||
#### Reduce Helix keyboard build variation ([#8669](https://github.com/qmk/qmk_firmware/pull/8669))
|
||||
|
||||
|
192
docs/ChangeLog/20210529.md
Normal file
192
docs/ChangeLog/20210529.md
Normal file
@@ -0,0 +1,192 @@
|
||||
# QMK Breaking Changes - 2021 May 29 Changelog
|
||||
|
||||
## Notable Changes :id=notable-changes
|
||||
|
||||
### RGB Matrix support for split common ([#11055](https://github.com/qmk/qmk_firmware/pull/11055)) :id=rgb-matrix-split-common
|
||||
|
||||
Split boards can now use RGB Matrix without defining a custom matrix.
|
||||
|
||||
### Teensy 3.6 support ([#12258](https://github.com/qmk/qmk_firmware/pull/12258)) :id=teensy-3-6-support
|
||||
|
||||
Added support for MK66F18 (Teensy 3.6) microcontroller.
|
||||
|
||||
### New command: qmk console ([#12828](https://github.com/qmk/qmk_firmware/pull/12828)) :id=new-command-qmk-console
|
||||
|
||||
A new `qmk console` command has been added for attaching to your keyboard's console. It operates similiarly to QMK Toolbox by allowing you to connect to one or more keyboard consoles to display debugging messages.
|
||||
|
||||
### Improved command: qmk config :id=improve-command-qmk-config
|
||||
|
||||
We've updated the `qmk config` command to show only the configuration items you have actually set. You can now display (almost) all of the available configuration options, along with their default values, using `qmk config -a`.
|
||||
|
||||
### LED Matrix Improvements ([#12509](https://github.com/qmk/qmk_firmware/pull/12509), [#12580](https://github.com/qmk/qmk_firmware/pull/12580), [#12588](https://github.com/qmk/qmk_firmware/pull/12588), [#12633](https://github.com/qmk/qmk_firmware/pull/12633), [#12651](https://github.com/qmk/qmk_firmware/pull/12651), [#12685](https://github.com/qmk/qmk_firmware/pull/12685)) :id=led-matrix-improvements
|
||||
|
||||
LED Matrix has been improved with effects, CIE1931 curves, and a task system.
|
||||
|
||||
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||
|
||||
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
||||
|
||||
* Durgod keyboard refactor in preparation for adding additional durgod keyboards ([#11978](https://github.com/qmk/qmk_firmware/pull/11978))
|
||||
* Updated Function96 with V2 files and removed chconf.h and halconf.h ([#12613](https://github.com/qmk/qmk_firmware/pull/12613))
|
||||
* [Keyboard] updated a vendor name / fixed minor keymap issues ([#12881](https://github.com/qmk/qmk_firmware/pull/12881))
|
||||
* [Keyboard] Corne - Remove legacy revision support ([#12226](https://github.com/qmk/qmk_firmware/pull/12226))
|
||||
|
||||
The following keyboards have had their source moved within QMK:
|
||||
|
||||
Old Keyboard Name | New Keyboard Name
|
||||
:---------------- | :----------------
|
||||
crkbd/rev1/common | crkbd/rev1
|
||||
function96 | function96/v1
|
||||
nckiibs/flatbread60 | delikeeb/flatbread60
|
||||
nckiibs/vaguettelite | delikeeb/vaguettelite
|
||||
nckiibs/vanana/rev1 | delikeeb/vanana/rev1
|
||||
nckiibs/vanana/rev2 | delikeeb/vanana/rev2
|
||||
nckiibs/vaneela | delikeeb/vaneela
|
||||
nckiibs/vaneelaex | delikeeb/vaneelaex
|
||||
nckiibs/waaffle/rev3/elite_c | delikeeb/waaffle/rev3/elite_c
|
||||
nckiibs/waaffle/rev3/pro_micro | delikeeb/waaffle/rev3/pro_micro
|
||||
|
||||
The [Function96 V2](https://github.com/qmk/qmk_firmware/tree/0.13.0/keyboards/function96/v2) has also been added as part of these changes.
|
||||
|
||||
The codebase for the [Durgod K320](https://github.com/qmk/qmk_firmware/tree/0.13.0/keyboards/durgod/k320) has been reworked in anticipation of additional Durgod keyboards gaining QMK support.
|
||||
|
||||
Additionally, the `crkbd/rev1/legacy` keyboard has been removed.
|
||||
|
||||
### Bootmagic Deprecation and Refactor ([#12172](https://github.com/qmk/qmk_firmware/pull/12172)) :id=bootmagic-deprecation-and-refactor
|
||||
|
||||
QMK has decided to deprecate the full Bootmagic feature and leave Bootmagic Lite as the only remaining option.
|
||||
|
||||
This pull request changes the behavior of `BOOTMAGIC_ENABLE` such that specifying `BOOTMAGIC_ENABLE = yes` enables Bootmagic Lite instead of full Bootmagic.
|
||||
|
||||
If attempts to use Bootmagic functionality result in unexpected behavior, check your `rules.mk` file and change the `BOOTMAGIC_ENABLE` setting to specify either `lite` or `full`.
|
||||
|
||||
#### Tentative Deprecation Schedule
|
||||
|
||||
This is the current planned roadmap for the behavior of `BOOTMAGIC_ENABLE`:
|
||||
|
||||
- From 2021 May 29, setting `BOOTMAGIC_ENABLE = yes` will enable Bootmagic Lite instead of full Bootmagic.
|
||||
- From 2021 Aug 28, `BOOTMAGIC_ENABLE` must be either `yes`, `lite`, or `no` – setting `BOOTMAGIC_ENABLE = full` will cause compilation to fail.
|
||||
- From 2021 Nov 27, `BOOTMAGIC_ENABLE` must be either `yes` or `no` – setting `BOOTMAGIC_ENABLE = lite` will cause compilation to fail.
|
||||
|
||||
### Removal of LAYOUT_kc ([#12160](https://github.com/qmk/qmk_firmware/pull/12160)) :id=removal-of-layout-kc
|
||||
|
||||
We've removed support for `LAYOUT_kc` macros, if your keymap uses one you will need to update it use a regular `LAYOUT` macro.
|
||||
|
||||
### Encoder callbacks are now boolean ([#12805](https://github.com/qmk/qmk_firmware/pull/12805), [#12985](https://github.com/qmk/qmk_firmware/pull/12985)) :id=encoder-callback-boolean
|
||||
|
||||
To allow for keyboards to override (or not) keymap level code the `encoder_update_kb` function has been changed from `void` to `bool`. You will need to update your function definition to reflect this and ensure that you return a `true` or `false` value.
|
||||
|
||||
Example code before change:
|
||||
|
||||
```c
|
||||
void encoder_update_kb(uint8_t index, bool clockwise) {
|
||||
encoder_update_user(index, clockwise);
|
||||
}
|
||||
```
|
||||
|
||||
Example code after change:
|
||||
|
||||
```c
|
||||
bool encoder_update_kb(uint8_t index, bool clockwise) {
|
||||
return encoder_update_user(index, clockwise);
|
||||
}
|
||||
```
|
||||
|
||||
## Core Changes :id=core-changes
|
||||
|
||||
### Fixes :id=core-fixes
|
||||
|
||||
* Fix connection issue in split keyboards when slave and OLED display are connected via I2C (fixes #9335) ([#11487](https://github.com/qmk/qmk_firmware/pull/11487))
|
||||
* Terrazzo: Fix wrong LED Matrix function names ([#12561](https://github.com/qmk/qmk_firmware/pull/12561))
|
||||
* Apply the "NO_LIMITED_CONTROLLER_CONNECT" fix to atmega16u2 ([#12482](https://github.com/qmk/qmk_firmware/pull/12482))
|
||||
* Fix comment parsing ([#12750](https://github.com/qmk/qmk_firmware/pull/12750))
|
||||
* Turn OLED off on suspend in soundmonster Corne keymap ([#10419](https://github.com/qmk/qmk_firmware/pull/10419))
|
||||
* Fixup build errors on `develop` branch. ([#12723](https://github.com/qmk/qmk_firmware/pull/12723))
|
||||
* Fix syntax error when compiling for ARM ([#12866](https://github.com/qmk/qmk_firmware/pull/12866))
|
||||
* Add missing LED Matrix suspend code to suspend.c ([#12878](https://github.com/qmk/qmk_firmware/pull/12878))
|
||||
* Fix spelling mistake regarding LED Matrix in split_common. ([#12888](https://github.com/qmk/qmk_firmware/pull/12888))
|
||||
* [Keymap] Fix QWERTY/DVORAK status output for kzar keymap ([#12895](https://github.com/qmk/qmk_firmware/pull/12895))
|
||||
* Fixup housekeeping from being invoked twice per loop. ([#12933](https://github.com/qmk/qmk_firmware/pull/12933))
|
||||
* wait for matrix row signal to go HIGH for every row ([#12945](https://github.com/qmk/qmk_firmware/pull/12945))
|
||||
* ensure we do not conflict with existing keymap aliases ([#12976](https://github.com/qmk/qmk_firmware/pull/12976))
|
||||
* [Keyboard] Fix Terrazzo build failure ([#12977](https://github.com/qmk/qmk_firmware/pull/12977))
|
||||
* Do not hard set config in CPTC files ([#11864](https://github.com/qmk/qmk_firmware/pull/11864))
|
||||
|
||||
### Additions and Enhancements :id=core-additions
|
||||
|
||||
* ARM - Refactor SLEEP_LED to support more platforms ([#8403](https://github.com/qmk/qmk_firmware/pull/8403))
|
||||
* Add ability to toggle One Shot functionality ([#4198](https://github.com/qmk/qmk_firmware/pull/4198))
|
||||
* Add RGB Matrix support to Split Common ([#11055](https://github.com/qmk/qmk_firmware/pull/11055))
|
||||
* Add support for complementary outputs to the ChibiOS WS2812 PWM driver ([#11988](https://github.com/qmk/qmk_firmware/pull/11988))
|
||||
* Enable RGB Matrix for Corne ([#12091](https://github.com/qmk/qmk_firmware/pull/12091))
|
||||
* Set default OLED Update Interval for Split Keyboards to improve matrix scan performance ([#12107](https://github.com/qmk/qmk_firmware/pull/12107))
|
||||
* Add support for MK66F18 (Teensy 3.6) micro controller ([#12258](https://github.com/qmk/qmk_firmware/pull/12258))
|
||||
* Split RGB Matrix support for RGBKB Zygomorph ([#11083](https://github.com/qmk/qmk_firmware/pull/11083))
|
||||
* Add baudrate and circular buffer to ARM WS2812 SPI config ([#12216](https://github.com/qmk/qmk_firmware/pull/12216))
|
||||
* Add keyboard level weak function for slave matrix scan ([#12317](https://github.com/qmk/qmk_firmware/pull/12317))
|
||||
* Add link to schematic on EasyEDA for XD60 ([#12018](https://github.com/qmk/qmk_firmware/pull/12018))
|
||||
* Add Config functions for LED Matrix ([#12361](https://github.com/qmk/qmk_firmware/pull/12361))
|
||||
* Add pin definitions for MK66F18 ([#12419](https://github.com/qmk/qmk_firmware/pull/12419))
|
||||
* add kinesis/kint36 keyboard ([#10171](https://github.com/qmk/qmk_firmware/pull/10171))
|
||||
* Add support for producing UF2-format binaries. ([#12435](https://github.com/qmk/qmk_firmware/pull/12435))
|
||||
* Implement CIE1931 curve for LED Matrix ([#12417](https://github.com/qmk/qmk_firmware/pull/12417))
|
||||
* Change `BOOTMAGIC_ENABLE=yes` to use Bootmagic Lite ([#12172](https://github.com/qmk/qmk_firmware/pull/12172))
|
||||
* Add kzar keymap for Kinesis Advantage ([#12444](https://github.com/qmk/qmk_firmware/pull/12444))
|
||||
* LED Matrix: suspend code ([#12509](https://github.com/qmk/qmk_firmware/pull/12509))
|
||||
* LED Matrix: Task system ([#12580](https://github.com/qmk/qmk_firmware/pull/12580))
|
||||
* Add missing RGB_MODE_TWINKLE / RGB_M_TW keycodes ([#11935](https://github.com/qmk/qmk_firmware/pull/11935))
|
||||
* Enhancement of WPM feature ([#11727](https://github.com/qmk/qmk_firmware/pull/11727))
|
||||
* Add Per Key functionality for AutoShift ([#11536](https://github.com/qmk/qmk_firmware/pull/11536))
|
||||
* LED Matrix: Reactive effect buffers & advanced indicators ([#12588](https://github.com/qmk/qmk_firmware/pull/12588))
|
||||
* LED Matrix: support for Split keyboards ([#12633](https://github.com/qmk/qmk_firmware/pull/12633))
|
||||
* add setting to enable infinite timeout for leader key ([#6580](https://github.com/qmk/qmk_firmware/pull/6580), [#12721](https://github.com/qmk/qmk_firmware/pull/12721 "Fix bad PR merge for #6580"))
|
||||
* Update ADC driver for STM32F1xx, STM32F3xx, STM32F4xx ([#12403](https://github.com/qmk/qmk_firmware/pull/12403))
|
||||
* Add initial support for tinyuf2 bootloader (when hosted on F411 blackpill) ([#12600](https://github.com/qmk/qmk_firmware/pull/12600))
|
||||
* Add support for STM32F446 MCU ([#12619](https://github.com/qmk/qmk_firmware/pull/12619))
|
||||
* Add STM32L433 and L443 support ([#12063](https://github.com/qmk/qmk_firmware/pull/12063))
|
||||
* Added OLED fade out support ([#12086](https://github.com/qmk/qmk_firmware/pull/12086))
|
||||
* New command: `qmk console` ([#12828](https://github.com/qmk/qmk_firmware/pull/12828))
|
||||
* LED Matrix: Effects! ([#12651](https://github.com/qmk/qmk_firmware/pull/12651))
|
||||
* Add setup, clone, and env to the list of commands we allow even with broken modules ([#12868](https://github.com/qmk/qmk_firmware/pull/12868))
|
||||
* LED Matrix: Documentation ([#12685](https://github.com/qmk/qmk_firmware/pull/12685))
|
||||
* Add function to allow repeated blinking of one layer ([#12237](https://github.com/qmk/qmk_firmware/pull/12237))
|
||||
* Add support for up to 4 IS31FL3733 drivers ([#12342](https://github.com/qmk/qmk_firmware/pull/12342))
|
||||
* Convert Encoder callbacks to be boolean functions ([#12805](https://github.com/qmk/qmk_firmware/pull/12805), [#12985](https://github.com/qmk/qmk_firmware/pull/12985))
|
||||
* [Keymap] Update to Drashna keymap and user code (based on develop) ([#12936](https://github.com/qmk/qmk_firmware/pull/12936))
|
||||
* Add Full-duplex serial driver for ARM boards ([#9842](https://github.com/qmk/qmk_firmware/pull/9842))
|
||||
* Document LED_MATRIX_FRAMEBUFFER_EFFECTS ([#12987](https://github.com/qmk/qmk_firmware/pull/12987))
|
||||
* Backlight: add defines for default level and breathing state ([#12560](https://github.com/qmk/qmk_firmware/pull/12560), [#13024](https://github.com/qmk/qmk_firmware/pull/13024))
|
||||
* Add dire message about LUFA mass storage bootloader ([#13014](https://github.com/qmk/qmk_firmware/pull/13014))
|
||||
|
||||
### Clean-ups and Optimizations :id=core-optimizations
|
||||
|
||||
* Overhaul bootmagic logic to have single entrypoint ([#8532](https://github.com/qmk/qmk_firmware/pull/8532))
|
||||
* Refactor of USB code within split_common ([#11890](https://github.com/qmk/qmk_firmware/pull/11890))
|
||||
* Begin the process of deprecating `bin/qmk` in favor of the global CLI ([#12109](https://github.com/qmk/qmk_firmware/pull/12109))
|
||||
* LED Matrix: decouple from Backlight ([#12054](https://github.com/qmk/qmk_firmware/pull/12054))
|
||||
* Remove `FUNC()` ([#12161](https://github.com/qmk/qmk_firmware/pull/12161))
|
||||
* Move gpio wait logic to wait.h ([#12067](https://github.com/qmk/qmk_firmware/pull/12067))
|
||||
* LED Matrix: Clean up includes ([#12197](https://github.com/qmk/qmk_firmware/pull/12197))
|
||||
* Consistently use bin/qmk when that script is called ([#12286](https://github.com/qmk/qmk_firmware/pull/12286))
|
||||
* LED Matrix: Additional common_features.mk tweaks ([#12187](https://github.com/qmk/qmk_firmware/pull/12187))
|
||||
* LED Matrix: Fix up eeconfig code ([#12327](https://github.com/qmk/qmk_firmware/pull/12327))
|
||||
* Big quantum_keycodes cleanup ([#12249](https://github.com/qmk/qmk_firmware/pull/12249))
|
||||
* Fix up builds that are now too big for `develop` branch. ([#12495](https://github.com/qmk/qmk_firmware/pull/12495))
|
||||
* [Keyboard] kint36: switch to sym_eager_pk debouncing ([#12626](https://github.com/qmk/qmk_firmware/pull/12626))
|
||||
* [Keyboard] kint2pp: reduce input latency by ≈10ms ([#12625](https://github.com/qmk/qmk_firmware/pull/12625))
|
||||
* eeprom driver: Refactor where eeprom driver initialisation (and EEPROM emulation initialisation) occurs to make it non-target-specific. ([#12671](https://github.com/qmk/qmk_firmware/pull/12671))
|
||||
* Change RGB/LED Matrix to use a simple define for USB suspend ([#12697](https://github.com/qmk/qmk_firmware/pull/12697), [#12770](https://github.com/qmk/qmk_firmware/pull/12770 "Fixing transport's led/rgb matrix suspend state logic"))
|
||||
* Remove pointless SERIAL_LINK_ENABLE rules ([#12846](https://github.com/qmk/qmk_firmware/pull/12846))
|
||||
* Make Swap Hands use PROGMEM ([#12284](https://github.com/qmk/qmk_firmware/pull/12284))
|
||||
* Remove KEYMAP and LAYOUT_kc ([#12160](https://github.com/qmk/qmk_firmware/pull/12160))
|
||||
* Rename `point_t` -> `led_point_t` ([#12864](https://github.com/qmk/qmk_firmware/pull/12864))
|
||||
* Deprecate `send_unicode_hex_string()` ([#12602](https://github.com/qmk/qmk_firmware/pull/12602))
|
||||
* [Keyboard] Remove redundant legacy and common headers for crkbd ([#13023](https://github.com/qmk/qmk_firmware/pull/13023))
|
||||
|
||||
### QMK Infrastructure and Internals :id=qmk-internals
|
||||
|
||||
* trivial change to trigger api update ([`b15288fb87`](https://github.com/qmk/qmk_firmware/commit/b15288fb87))
|
||||
* fix some references to bin/qmk that slipped in ([#12832](https://github.com/qmk/qmk_firmware/pull/12832))
|
||||
* Resolve a number of warnings in `qmk generate-api` ([#12833](https://github.com/qmk/qmk_firmware/pull/12833))
|
||||
* Fix another bin/qmk reference ([#12856](https://github.com/qmk/qmk_firmware/pull/12856))
|
||||
* Use milc.subcommand.config instead of qmk.cli.config ([#12915](https://github.com/qmk/qmk_firmware/pull/12915))
|
@@ -29,6 +29,7 @@
|
||||
* [Overview](cli.md)
|
||||
* [Configuration](cli_configuration.md)
|
||||
* [Commands](cli_commands.md)
|
||||
* [Tab Completion](cli_tab_complete.md)
|
||||
|
||||
* Using QMK
|
||||
* Guides
|
||||
@@ -107,6 +108,7 @@
|
||||
* [Haptic Feedback](feature_haptic_feedback.md)
|
||||
* [Joystick](feature_joystick.md)
|
||||
* [LED Indicators](feature_led_indicators.md)
|
||||
* [MIDI](feature_midi.md)
|
||||
* [Proton C Conversion](proton_c_conversion.md)
|
||||
* [PS/2 Mouse](feature_ps2_mouse.md)
|
||||
* [Split Keyboard](feature_split_keyboard.md)
|
||||
@@ -119,7 +121,7 @@
|
||||
* Breaking Changes
|
||||
* [Overview](breaking_changes.md)
|
||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||
* [Most Recent ChangeLog](ChangeLog/20210227.md "QMK v0.12.0 - 2021 Feb 27")
|
||||
* [Most Recent ChangeLog](ChangeLog/20210529.md "QMK v0.13.0 - 2021 May 29")
|
||||
* [Past Breaking Changes](breaking_changes_history.md)
|
||||
|
||||
* C Development
|
||||
|
@@ -47,73 +47,79 @@ Note that some of these pins are doubled-up on ADCs with the same channel. This
|
||||
|
||||
Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-indexed, whereas the F3 has 4 ADCs and the channels are 1-indexed. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
|
||||
|
||||
|ADC|Channel|STM32F0xx|STM32F3xx|
|
||||
|---|-------|---------|---------|
|
||||
|1 |0 |`A0` | |
|
||||
|1 |1 |`A1` |`A0` |
|
||||
|1 |2 |`A2` |`A1` |
|
||||
|1 |3 |`A3` |`A2` |
|
||||
|1 |4 |`A4` |`A3` |
|
||||
|1 |5 |`A5` |`F4` |
|
||||
|1 |6 |`A6` |`C0` |
|
||||
|1 |7 |`A7` |`C1` |
|
||||
|1 |8 |`B0` |`C2` |
|
||||
|1 |9 |`B1` |`C3` |
|
||||
|1 |10 |`C0` |`F2` |
|
||||
|1 |11 |`C1` | |
|
||||
|1 |12 |`C2` | |
|
||||
|1 |13 |`C3` | |
|
||||
|1 |14 |`C4` | |
|
||||
|1 |15 |`C5` | |
|
||||
|1 |16 | | |
|
||||
|2 |1 | |`A4` |
|
||||
|2 |2 | |`A5` |
|
||||
|2 |3 | |`A6` |
|
||||
|2 |4 | |`A7` |
|
||||
|2 |5 | |`C4` |
|
||||
|2 |6 | |`C0` |
|
||||
|2 |7 | |`C1` |
|
||||
|2 |8 | |`C2` |
|
||||
|2 |9 | |`C3` |
|
||||
|2 |10 | |`F2` |
|
||||
|2 |11 | |`C5` |
|
||||
|2 |12 | |`B2` |
|
||||
|2 |13 | | |
|
||||
|2 |14 | | |
|
||||
|2 |15 | | |
|
||||
|2 |16 | | |
|
||||
|3 |1 | |`B1` |
|
||||
|3 |2 | |`E9` |
|
||||
|3 |3 | |`E13` |
|
||||
|3 |4 | | |
|
||||
|3 |5 | | |
|
||||
|3 |6 | |`E8` |
|
||||
|3 |7 | |`D10` |
|
||||
|3 |8 | |`D11` |
|
||||
|3 |9 | |`D12` |
|
||||
|3 |10 | |`D13` |
|
||||
|3 |11 | |`D14` |
|
||||
|3 |12 | |`B0` |
|
||||
|3 |13 | |`E7` |
|
||||
|3 |14 | |`E10` |
|
||||
|3 |15 | |`E11` |
|
||||
|3 |16 | |`E12` |
|
||||
|4 |1 | |`E14` |
|
||||
|4 |2 | |`B12` |
|
||||
|4 |3 | |`B13` |
|
||||
|4 |4 | |`B14` |
|
||||
|4 |5 | |`B15` |
|
||||
|4 |6 | |`E8` |
|
||||
|4 |7 | |`D10` |
|
||||
|4 |8 | |`D11` |
|
||||
|4 |9 | |`D12` |
|
||||
|4 |10 | |`D13` |
|
||||
|4 |11 | |`D14` |
|
||||
|4 |12 | |`D8` |
|
||||
|4 |13 | |`D9` |
|
||||
|4 |14 | | |
|
||||
|4 |15 | | |
|
||||
|4 |16 | | |
|
||||
|ADC|Channel|STM32F0xx|STM32F1xx|STM32F3xx|STM32F4xx|
|
||||
|---|-------|---------|---------|---------|---------|
|
||||
|1 |0 |`A0` |`A0` | |`A0` |
|
||||
|1 |1 |`A1` |`A1` |`A0` |`A1` |
|
||||
|1 |2 |`A2` |`A2` |`A1` |`A2` |
|
||||
|1 |3 |`A3` |`A3` |`A2` |`A3` |
|
||||
|1 |4 |`A4` |`A4` |`A3` |`A4` |
|
||||
|1 |5 |`A5` |`A5` |`F4` |`A5` |
|
||||
|1 |6 |`A6` |`A6` |`C0` |`A6` |
|
||||
|1 |7 |`A7` |`A7` |`C1` |`A7` |
|
||||
|1 |8 |`B0` |`B0` |`C2` |`B0` |
|
||||
|1 |9 |`B1` |`B1` |`C3` |`B1` |
|
||||
|1 |10 |`C0` |`C0` |`F2` |`C0` |
|
||||
|1 |11 |`C1` |`C1` | |`C1` |
|
||||
|1 |12 |`C2` |`C2` | |`C2` |
|
||||
|1 |13 |`C3` |`C3` | |`C3` |
|
||||
|1 |14 |`C4` |`C4` | |`C4` |
|
||||
|1 |15 |`C5` |`C5` | |`C5` |
|
||||
|1 |16 | | | | |
|
||||
|2 |0 | |`A0`¹ | |`A0`² |
|
||||
|2 |1 | |`A1`¹ |`A4` |`A1`² |
|
||||
|2 |2 | |`A2`¹ |`A5` |`A2`² |
|
||||
|2 |3 | |`A3`¹ |`A6` |`A3`² |
|
||||
|2 |4 | |`A4`¹ |`A7` |`A4`² |
|
||||
|2 |5 | |`A5`¹ |`C4` |`A5`² |
|
||||
|2 |6 | |`A6`¹ |`C0` |`A6`² |
|
||||
|2 |7 | |`A7`¹ |`C1` |`A7`² |
|
||||
|2 |8 | |`B0`¹ |`C2` |`B0`² |
|
||||
|2 |9 | |`B1`¹ |`C3` |`B1`² |
|
||||
|2 |10 | |`C0`¹ |`F2` |`C0`² |
|
||||
|2 |11 | |`C1`¹ |`C5` |`C1`² |
|
||||
|2 |12 | |`C2`¹ |`B2` |`C2`² |
|
||||
|2 |13 | |`C3`¹ | |`C3`² |
|
||||
|2 |14 | |`C4`¹ | |`C4`² |
|
||||
|2 |15 | |`C5`¹ | |`C5`² |
|
||||
|2 |16 | | | | |
|
||||
|3 |0 | |`A0`¹ | |`A0`² |
|
||||
|3 |1 | |`A1`¹ |`B1` |`A1`² |
|
||||
|3 |2 | |`A2`¹ |`E9` |`A2`² |
|
||||
|3 |3 | |`A3`¹ |`E13` |`A3`² |
|
||||
|3 |4 | |`F6`¹ | |`F6`² |
|
||||
|3 |5 | |`F7`¹ |`B13` |`F7`² |
|
||||
|3 |6 | |`F8`¹ |`E8` |`F8`² |
|
||||
|3 |7 | |`F9`¹ |`D10` |`F9`² |
|
||||
|3 |8 | |`F10`¹ |`D11` |`F10`² |
|
||||
|3 |9 | | |`D12` |`F3`² |
|
||||
|3 |10 | |`C0`¹ |`D13` |`C0`² |
|
||||
|3 |11 | |`C1`¹ |`D14` |`C1`² |
|
||||
|3 |12 | |`C2`¹ |`B0` |`C2`² |
|
||||
|3 |13 | |`C3`¹ |`E7` |`C3`² |
|
||||
|3 |14 | | |`E10` |`F4`² |
|
||||
|3 |15 | | |`E11` |`F5`² |
|
||||
|3 |16 | | |`E12` | |
|
||||
|4 |1 | | |`E14` | |
|
||||
|4 |2 | | |`E15` | |
|
||||
|4 |3 | | |`B12` | |
|
||||
|4 |4 | | |`B14` | |
|
||||
|4 |5 | | |`B15` | |
|
||||
|4 |6 | | |`E8` | |
|
||||
|4 |7 | | |`D10` | |
|
||||
|4 |8 | | |`D11` | |
|
||||
|4 |9 | | |`D12` | |
|
||||
|4 |10 | | |`D13` | |
|
||||
|4 |11 | | |`D14` | |
|
||||
|4 |12 | | |`D8` | |
|
||||
|4 |13 | | |`D9` | |
|
||||
|4 |14 | | | | |
|
||||
|4 |15 | | | | |
|
||||
|4 |16 | | | | |
|
||||
|
||||
<sup>¹ As of ChibiOS 20.3.4, the ADC driver for STM32F1xx devices supports only ADC1, therefore any configurations involving ADC2 or ADC3 cannot actually be used. In particular, pins `F6`…`F10`, which are present at least on some STM32F103x[C-G] devices, cannot be used as ADC inputs because of this driver limitation.</sup>
|
||||
|
||||
<sup>² Not all STM32F4xx devices have ADC2 and/or ADC3, therefore some configurations shown in this table may be unavailable; in particular, pins `F4`…`F10` cannot be used as ADC inputs on devices which do not have ADC3. Check the device datasheet to confirm which pin functions are supported.</sup>
|
||||
|
||||
## Functions
|
||||
|
||||
@@ -141,10 +147,10 @@ Also note that the F0 and F3 use different numbering schemes. The F0 has a singl
|
||||
|
||||
The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.
|
||||
|
||||
|`#define` |Type |Default |Description |
|
||||
|---------------------|------|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`ADC_CIRCULAR_BUFFER`|`bool`|`false` |If `true`, then the implementation will use a circular buffer. |
|
||||
|`ADC_NUM_CHANNELS` |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`. |
|
||||
|`ADC_BUFFER_DEPTH` |`int` |`2` |Sets the depth of each result. Since we are only getting a 12-bit result by default, we set this to 2 bytes so we can contain our one value. This could be set to 1 if you opt for an 8-bit or lower result.|
|
||||
|`ADC_SAMPLING_RATE` |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. |
|
||||
|`ADC_RESOLUTION` |`int` |`ADC_CFGR1_RES_12BIT`|The resolution of your result. We choose 12 bit by default, but you can opt for 12, 10, 8, or 6 bit. |
|
||||
|`#define` |Type |Default |Description |
|
||||
|---------------------|------|----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`ADC_CIRCULAR_BUFFER`|`bool`|`false` |If `true`, then the implementation will use a circular buffer. |
|
||||
|`ADC_NUM_CHANNELS` |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`. |
|
||||
|`ADC_BUFFER_DEPTH` |`int` |`2` |Sets the depth of each result. Since we are only getting a 10-bit result by default, we set this to 2 bytes so we can contain our one value. This could be set to 1 if you opt for an 8-bit or lower result.|
|
||||
|`ADC_SAMPLING_RATE` |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. |
|
||||
|`ADC_RESOLUTION` |`int` |`ADC_CFGR1_RES_10BIT` or `ADC_CFGR_RES_10BITS`|The resolution of your result. We choose 10 bit by default, but you can opt for 12, 10, 8, or 6 bit. Different MCUs use slightly different names for the resolution constants. |
|
||||
|
@@ -6,6 +6,7 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
||||
|
||||
## What has been included in past Breaking Changes?
|
||||
|
||||
* [2021 May 29](ChangeLog/20210529.md)
|
||||
* [2021 Feb 27](ChangeLog/20210227.md)
|
||||
* [2020 Nov 28](ChangeLog/20201128.md)
|
||||
* [2020 Aug 29](ChangeLog/20200829.md)
|
||||
@@ -15,16 +16,16 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
||||
|
||||
## When is the next Breaking Change?
|
||||
|
||||
The next Breaking Change is scheduled for February 27, 2021.
|
||||
The next Breaking Change is scheduled for August 28, 2021.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* [x] 2021 Feb 27 - `develop` is created. Each push to `master` is subsequently merged to `develop`
|
||||
* [ ] 2021 May 01 - `develop` closed to new PR's.
|
||||
* [ ] 2021 May 01 - Call for testers.
|
||||
* [ ] 2021 May 27 - `master` is locked, no PR's merged.
|
||||
* [ ] 2021 May 29 - Merge `develop` to `master`.
|
||||
* [ ] 2021 May 29 - `master` is unlocked. PR's can be merged again.
|
||||
* [x] 2021 May 29 - `develop` is created. Each push to `master` is subsequently merged to `develop`
|
||||
* [ ] 2021 Jul 31 - `develop` closed to new PR's.
|
||||
* [ ] 2021 Jul 31 - Call for testers.
|
||||
* [ ] 2021 Aug 26 - `master` is locked, no PR's merged.
|
||||
* [ ] 2021 Aug 28 - Merge `develop` to `master`.
|
||||
* [ ] 2021 Aug 28 - `master` is unlocked. PR's can be merged again.
|
||||
|
||||
## What changes will be included?
|
||||
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||
|
||||
* [2021 May 29](ChangeLog/20210529.md) - version 0.13.0
|
||||
* [2021 Feb 27](ChangeLog/20210227.md) - version 0.12.0
|
||||
* [2020 Nov 28](ChangeLog/20201128.md) - version 0.11.0
|
||||
* [2020 Aug 29](ChangeLog/20200829.md) - version 0.10.0
|
||||
|
@@ -107,6 +107,54 @@ This command lets you configure the behavior of QMK. For the full `qmk config` d
|
||||
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
|
||||
```
|
||||
|
||||
## `qmk console`
|
||||
|
||||
This command lets you connect to keyboard consoles to get debugging messages. It only works if your keyboard firmware has been compiled with `CONSOLE_ENABLED=yes`.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk console [-d <pid>:<vid>[:<index>]] [-l] [-n] [-t] [-w <seconds>]
|
||||
```
|
||||
|
||||
**Examples**:
|
||||
|
||||
Connect to all available keyboards and show their console messages:
|
||||
|
||||
```
|
||||
qmk console
|
||||
```
|
||||
|
||||
List all devices:
|
||||
|
||||
```
|
||||
qmk console -l
|
||||
```
|
||||
|
||||
Show only messages from clueboard/66/rev3 keyboards:
|
||||
|
||||
```
|
||||
qmk console -d C1ED:2370
|
||||
```
|
||||
|
||||
Show only messages from the second clueboard/66/rev3:
|
||||
|
||||
```
|
||||
qmk console -d C1ED:2370:2
|
||||
```
|
||||
|
||||
Show timestamps and VID:PID instead of names:
|
||||
|
||||
```
|
||||
qmk console -n -t
|
||||
```
|
||||
|
||||
Disable bootloader messages:
|
||||
|
||||
```
|
||||
qmk console --no-bootloaders
|
||||
```
|
||||
|
||||
## `qmk doctor`
|
||||
|
||||
This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to.
|
||||
@@ -131,6 +179,16 @@ Check your environment and report problems only:
|
||||
|
||||
qmk doctor -n
|
||||
|
||||
## `qmk format-json`
|
||||
|
||||
Formats a JSON file in a (mostly) human-friendly way. Will usually correctly detect the format of the JSON (info.json or keymap.json) but you can override this with `--format` if neccesary.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk format-json [-f FORMAT] <json_file>
|
||||
```
|
||||
|
||||
## `qmk info`
|
||||
|
||||
Displays information about keyboards and keymaps in QMK. You can use this to get information about a keyboard, show the layouts, display the underlying key matrix, or to pretty-print JSON keymaps.
|
||||
@@ -170,7 +228,7 @@ qmk json2c [-o OUTPUT] filename
|
||||
## `qmk c2json`
|
||||
|
||||
Creates a keymap.json from a keymap.c.
|
||||
**Note:** Parsing C source files is not easy, therefore this subcommand may not work your keymap. In some cases not using the C pre-processor helps.
|
||||
**Note:** Parsing C source files is not easy, therefore this subcommand may not work with your keymap. In some cases not using the C pre-processor helps.
|
||||
|
||||
**Usage**:
|
||||
|
||||
@@ -218,6 +276,18 @@ This command is directory aware. It will automatically fill in KEYBOARD if you a
|
||||
qmk list-keymaps -kb planck/ez
|
||||
```
|
||||
|
||||
## `qmk new-keyboard`
|
||||
|
||||
This command creates a new keyboard based on available templates.
|
||||
|
||||
This command will prompt for input to guide you though the generation process.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk new-keyboard
|
||||
```
|
||||
|
||||
## `qmk new-keymap`
|
||||
|
||||
This command creates a new keymap based on a keyboard's existing default keymap.
|
||||
|
27
docs/cli_tab_complete.md
Normal file
27
docs/cli_tab_complete.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Tab Completion for QMK
|
||||
|
||||
If you are using Bash 4.2 or later, Zsh, or FiSH you can enable Tab Completion for the QMK CLI. This will let you tab complete the names of flags, keyboards, files, and other `qmk` options.
|
||||
|
||||
## Setup
|
||||
|
||||
There are several ways you can setup tab completion.
|
||||
|
||||
### For Your User Only
|
||||
|
||||
Add this to the end of your `.profile` or `.bashrc`:
|
||||
|
||||
source ~/qmk_firmware/util/qmk_tab_complete.sh
|
||||
|
||||
If you put `qmk_firmware` into another location you will need to adjust this path.
|
||||
|
||||
### System Wide Symlink
|
||||
|
||||
If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script:
|
||||
|
||||
`ln -s ~/qmk_firmware/util/qmk_tab_complete.sh /etc/profile.d/qmk_tab_complete.sh`
|
||||
|
||||
### System Wide Copy
|
||||
|
||||
In some cases a symlink may not work. Instead you can copy the file directly into place. Be aware that updates to the tab complete script may happen from time to time, you will want to recopy the file periodically.
|
||||
|
||||
cp util/qmk_tab_complete.sh /etc/profile.d
|
@@ -28,8 +28,11 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
||||
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
||||
* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
|
||||
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
||||
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
||||
* [STM32L433](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||
* [STM32L443](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
|
@@ -78,10 +78,10 @@ This is a C header file that is one of the first things included, and will persi
|
||||
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* Deprecated. Use `#define AUDIO_PIN B5`, or use `#define AUDIO_PIN_ALT B5` if a `C` pin is enabled with `AUDIO_PIN`
|
||||
* `#define B6_AUDIO`
|
||||
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* enables audio on pin B6 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* Deprecated. Use `#define AUDIO_PIN B6`, or use `#define AUDIO_PIN_ALT B6` if a `C` pin is enabled with `AUDIO_PIN`
|
||||
* `#define B7_AUDIO`
|
||||
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* enables audio on pin B7 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* Deprecated. Use `#define AUDIO_PIN B7`, or use `#define AUDIO_PIN_ALT B7` if a `C` pin is enabled with `AUDIO_PIN`
|
||||
* `#define BACKLIGHT_PIN B7`
|
||||
* pin of the backlight
|
||||
|
@@ -109,6 +109,19 @@ If you can't get this 'Listening:' message try building with `CONSOLE_ENABLE=yes
|
||||
|
||||
You may need privileges to access the device an OS like Linux. Try `sudo hid_listen`.
|
||||
|
||||
On many Linux distros you can avoid having to run hid_listen as root
|
||||
by creating a file called `/etc/udev/rules.d/70-hid-listen.rules` with
|
||||
the following content:
|
||||
|
||||
```
|
||||
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="def1", TAG+="uaccess", RUN{builtin}+="uaccess"
|
||||
```
|
||||
|
||||
Replace abcd and def1 with your keyboard's vendor and product id,
|
||||
letters must be lowercase. The `RUN{builtin}+="uaccess"` part is only
|
||||
needed for older distros.
|
||||
|
||||
|
||||
## Can't Get Message on Console
|
||||
Check:
|
||||
- *hid_listen* finds your device. See above.
|
||||
|
@@ -23,6 +23,141 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
|
||||
|
||||
You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
|
||||
|
||||
# Checking Modifier State :id=checking-modifier-state
|
||||
|
||||
The current modifier state can mainly be accessed with two functions: `get_mods()` for normal modifiers and modtaps and `get_oneshot_mods()` for one-shot modifiers (unless they're held, in which case they act like normal modifier keys).
|
||||
|
||||
The presence of one or more specific modifiers in the current modifier state can be detected by ANDing the modifier state with a mod mask corresponding to the set of modifiers you want to match for. The reason why bitwise operators are used is that the modifier state is stored as a single byte in the format (GASC)<sub>R</sub>(GASC)<sub>L</sub>.
|
||||
|
||||
Thus, to give an example, `01000010` would be the internal representation of LShift+RAlt.
|
||||
For more information on bitwise operators in C, click [here](https://en.wikipedia.org/wiki/Bitwise_operations_in_C) to open the Wikipedia page on the topic.
|
||||
|
||||
In practice, this means that you can check whether a given modifier is active with `get_mods() & MOD_BIT(KC_<modifier>)` (see the [list of modifier keycodes](keycodes_basic.md#modifiers)) or with `get_mods() & MOD_MASK_<modifier>` if the difference between left and right hand modifiers is not important and you want to match both. Same thing can be done for one-shot modifiers if you replace `get_mods()` with `get_oneshot_mods()`.
|
||||
|
||||
To check that *only* a specific set of mods is active at a time, AND the modifier state and your desired mod mask as explained above and compare the result to the mod mask itself: `get_mods() & <mod mask> == <mod mask>`.
|
||||
|
||||
For example, let's say you want to trigger a piece of custom code if one-shot left control and one-shot left shift are on but every other one-shot mods are off. To do so, you can compose the desired mod mask by combining the mod bits for left control and shift with `(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` and then plug it in: `get_oneshot_mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`. Using `MOD_MASK_CS` instead for the mod bitmask would have forced you to press four modifier keys (both versions of control and shift) to fulfill the condition.
|
||||
|
||||
The full list of mod masks is as follows:
|
||||
|
||||
| Mod Mask Name | Matching Modifiers |
|
||||
|--------------------|------------------------------------------------|
|
||||
| `MOD_MASK_CTRL` | LCTRL , RCTRL |
|
||||
| `MOD_MASK_SHIFT` | LSHIFT , RSHIFT |
|
||||
| `MOD_MASK_ALT` | LALT , RALT |
|
||||
| `MOD_MASK_GUI` | LGUI , RGUI |
|
||||
| `MOD_MASK_CS` | CTRL , SHIFT |
|
||||
| `MOD_MASK_CA` | (L/R)CTRL , (L/R)ALT |
|
||||
| `MOD_MASK_CG` | (L/R)CTRL , (L/R)GUI |
|
||||
| `MOD_MASK_SA` | (L/R)SHIFT , (L/R)ALT |
|
||||
| `MOD_MASK_SG` | (L/R)SHIFT , (L/R)GUI |
|
||||
| `MOD_MASK_AG` | (L/R)ALT , (L/R)GUI |
|
||||
| `MOD_MASK_CSA` | (L/R)CTRL , (L/R)SHIFT , (L/R)ALT |
|
||||
| `MOD_MASK_CSG` | (L/R)CTRL , (L/R)SHIFT , (L/R)GUI |
|
||||
| `MOD_MASK_CAG` | (L/R)CTRL , (L/R)ALT , (L/R)GUI |
|
||||
| `MOD_MASK_SAG` | (L/R)SHIFT , (L/R)ALT , (L/R)GUI |
|
||||
| `MOD_MASK_CSAG` | (L/R)CTRL , (L/R)SHIFT , (L/R)ALT , (L/R)GUI |
|
||||
|
||||
Aside from accessing the currently active modifiers using `get_mods()`, there exists some other functions you can use to modify the modifier state, where the `mods` argument refers to the modifiers bitmask.
|
||||
|
||||
* `add_mods(mods)`: Enable `mods` without affecting any other modifiers
|
||||
* `register_mods(mods)`: Like `add_mods` but send a keyboard report immediately.
|
||||
* `del_mods(mods)`: Disable `mods` without affecting any other modifiers
|
||||
* `unregister_mods(mods)`: Like `del_mods` but send a keyboard report immediately.
|
||||
* `set_mods(mods)`: Overwrite current modifier state with `mods`
|
||||
* `clear_mods()`: Reset the modifier state by disabling all modifiers
|
||||
|
||||
Similarly, in addition to `get_oneshot_mods()`, there also exists these functions for one-shot mods:
|
||||
|
||||
* `add_oneshot_mods(mods)`: Enable `mods` without affecting any other one-shot modifiers
|
||||
* `del_oneshot_mods(mods)`: Disable `mods` without affecting any other one-shot modifiers
|
||||
* `set_oneshot_mods(mods)`: Overwrite current one-shot modifier state with `mods`
|
||||
* `clear_oneshot_mods()`: Reset the one-shot modifier state by disabling all one-shot modifiers
|
||||
|
||||
## Examples :id=examples
|
||||
|
||||
The following examples use [advanced macro functions](feature_macros.md#advanced-macro-functions) which you can read more about in the [documentation page on macros](feature_macros.md).
|
||||
|
||||
### Alt + Escape for Alt + Tab :id=alt-escape-for-alt-tab
|
||||
|
||||
Simple example where chording Left Alt with `KC_ESC` makes it behave like `KC_TAB` for alt-tabbing between applications. This example strictly checks if only Left Alt is active, meaning you can't do Alt+Shift+Esc to switch between applications in reverse order. Also keep in mind that this removes the ability to trigger the actual Alt+Escape keyboard shortcut, though it keeps the ability to do AltGr+Escape.
|
||||
|
||||
```c
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
|
||||
case KC_ESC:
|
||||
// Detect the activation of only Left Alt
|
||||
if ((get_mods() & MOD_BIT(KC_LALT)) == MOD_BIT(KC_LALT)) {
|
||||
if (record->event.pressed) {
|
||||
// No need to register KC_LALT because it's already active.
|
||||
// The Alt modifier will apply on this KC_TAB.
|
||||
register_code(KC_TAB);
|
||||
} else {
|
||||
unregister_code(KC_TAB);
|
||||
}
|
||||
// Do not let QMK process the keycode further
|
||||
return false;
|
||||
}
|
||||
// Else, let QMK process the KC_ESC keycode as usual
|
||||
return true;
|
||||
|
||||
}
|
||||
return true;
|
||||
};
|
||||
```
|
||||
|
||||
### Shift + Backspace for Delete :id=shift-backspace-for-delete
|
||||
|
||||
Advanced example where the original behaviour of shift is cancelled when chorded with `KC_BSPC` and is instead fully replaced by `KC_DEL`. Two main variables are created to make this work well: `mod_state` and `delkey_registered`. The first one stores the modifier state and is used to restore it after registering `KC_DEL`. The second variable is a boolean variable (true or false) which keeps track of the status of `KC_DEL` to manage the release of the whole Backspace/Delete key correctly.
|
||||
|
||||
As opposed to the previous example, this doesn't use strict modifier checking. Pressing `KC_BSPC` while one or two shifts are active is enough to trigger this custom code, regardless of the state of other modifiers. That approach offers some perks: Ctrl+Shift+Backspace lets us delete the next word (Ctrl+Delete) and Ctrl+Alt+Shift+Backspace lets us execute the Ctrl+Alt+Del keyboard shortcut.
|
||||
|
||||
```c
|
||||
// Initialize variable holding the binary
|
||||
// representation of active modifiers.
|
||||
uint8_t mod_state;
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
// Store the current modifier state in the variable for later reference
|
||||
mod_state = get_mods();
|
||||
switch (keycode) {
|
||||
|
||||
case KC_BSPC:
|
||||
{
|
||||
// Initialize a boolean variable that keeps track
|
||||
// of the delete key status: registered or not?
|
||||
static bool delkey_registered;
|
||||
if (record->event.pressed) {
|
||||
// Detect the activation of either shift keys
|
||||
if (mod_state & MOD_MASK_SHIFT) {
|
||||
// First temporarily canceling both shifts so that
|
||||
// shift isn't applied to the KC_DEL keycode
|
||||
del_mods(MOD_MASK_SHIFT);
|
||||
register_code(KC_DEL);
|
||||
// Update the boolean variable to reflect the status of KC_DEL
|
||||
delkey_registered = true;
|
||||
// Reapplying modifier state so that the held shift key(s)
|
||||
// still work even after having tapped the Backspace/Delete key.
|
||||
set_mods(mod_state);
|
||||
return false;
|
||||
}
|
||||
} else { // on release of KC_BSPC
|
||||
// In case KC_DEL is still being sent even after the release of KC_BSPC
|
||||
if (delkey_registered) {
|
||||
unregister_code(KC_DEL);
|
||||
delkey_registered = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Let QMK process the KC_BSPC keycode as usual outside of shift
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
};
|
||||
```
|
||||
|
||||
# Legacy Content :id=legacy-content
|
||||
|
||||
This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
|
||||
|
@@ -8,7 +8,7 @@ To activate this feature, add `AUDIO_ENABLE = yes` to your `rules.mk`.
|
||||
On Atmega32U4 based boards, up to two simultaneous tones can be rendered.
|
||||
With one speaker connected to a PWM capable pin on PORTC driven by timer 3 and the other on one of the PWM pins on PORTB driven by timer 1.
|
||||
|
||||
The following pins can be configured as audio outputs in `config.h` - for one speaker set eiter one out of:
|
||||
The following pins can be configured as audio outputs in `config.h` - for one speaker set either one out of:
|
||||
|
||||
* `#define AUDIO_PIN C4`
|
||||
* `#define AUDIO_PIN C5`
|
||||
@@ -166,7 +166,7 @@ The available keycodes for audio are:
|
||||
!> These keycodes turn all of the audio functionality on and off. Turning it off means that audio feedback, audio clicky, music mode, etc. are disabled, completely.
|
||||
|
||||
## Tempo
|
||||
the 'speed' at which SONGs are played is dictated by the set Tempo, which is measured in beats-per-minute. Note lenghts are defined relative to that.
|
||||
the 'speed' at which SONGs are played is dictated by the set Tempo, which is measured in beats-per-minute. Note lengths are defined relative to that.
|
||||
The initial/default tempo is set to 120 bpm, but can be configured by setting `TEMPO_DEFAULT` in `config.c`.
|
||||
There is also a set of functions to modify the tempo from within the user/keymap code:
|
||||
```c
|
||||
@@ -291,7 +291,7 @@ You can configure the default, min and max frequencies, the stepping and built i
|
||||
|--------|---------------|-------------|
|
||||
| `AUDIO_CLICKY_FREQ_DEFAULT` | 440.0f | Sets the default/starting audio frequency for the clicky sounds. |
|
||||
| `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). |
|
||||
| `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the the highest frequency. Too high may result in coworkers attacking you. |
|
||||
| `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the highest frequency. Too high may result in coworkers attacking you. |
|
||||
| `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. This is a multiplicative factor. The default steps the frequency up/down by a musical minor third. |
|
||||
| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. |
|
||||
| `AUDIO_CLICKY_DELAY_DURATION` | 1 | An integer note duration where 1 is 1/16th of the tempo, or a sixty-fourth note (see `quantum/audio/musical_notes.h` for implementation details). The main clicky effect will be delayed by this duration. Adjusting this to values around 6-12 will help compensate for loud switches. |
|
||||
@@ -301,8 +301,7 @@ You can configure the default, min and max frequencies, the stepping and built i
|
||||
|
||||
## MIDI Functionality
|
||||
|
||||
This is still a WIP, but check out `quantum/process_keycode/process_midi.c` to see what's happening. Enable from the Makefile.
|
||||
|
||||
See [MIDI](feature_midi.md)
|
||||
|
||||
## Audio Keycodes
|
||||
|
||||
@@ -319,114 +318,3 @@ This is still a WIP, but check out `quantum/process_keycode/process_midi.c` to s
|
||||
|`MU_OFF` | |Turns off Music Mode |
|
||||
|`MU_TOG` | |Toggles Music Mode |
|
||||
|`MU_MOD` | |Cycles through the music modes |
|
||||
|
||||
<!-- FIXME: this formatting needs work
|
||||
|
||||
## Audio
|
||||
|
||||
```c
|
||||
#ifdef AUDIO_ENABLE
|
||||
AU_ON,
|
||||
AU_OFF,
|
||||
AU_TOG,
|
||||
|
||||
// Music mode on/off/toggle
|
||||
MU_ON,
|
||||
MU_OFF,
|
||||
MU_TOG,
|
||||
|
||||
// Music voice iterate
|
||||
MUV_IN,
|
||||
MUV_DE,
|
||||
#endif
|
||||
```
|
||||
|
||||
### Midi
|
||||
|
||||
#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
|
||||
MI_ON, // send midi notes when music mode is enabled
|
||||
MI_OFF, // don't send midi notes when music mode is enabled
|
||||
#endif
|
||||
|
||||
MIDI_TONE_MIN,
|
||||
MIDI_TONE_MAX
|
||||
|
||||
MI_C = MIDI_TONE_MIN,
|
||||
MI_Cs,
|
||||
MI_Db = MI_Cs,
|
||||
MI_D,
|
||||
MI_Ds,
|
||||
MI_Eb = MI_Ds,
|
||||
MI_E,
|
||||
MI_F,
|
||||
MI_Fs,
|
||||
MI_Gb = MI_Fs,
|
||||
MI_G,
|
||||
MI_Gs,
|
||||
MI_Ab = MI_Gs,
|
||||
MI_A,
|
||||
MI_As,
|
||||
MI_Bb = MI_As,
|
||||
MI_B,
|
||||
|
||||
MIDI_TONE_KEYCODE_OCTAVES > 1
|
||||
|
||||
where x = 1-5:
|
||||
MI_C_x,
|
||||
MI_Cs_x,
|
||||
MI_Db_x = MI_Cs_x,
|
||||
MI_D_x,
|
||||
MI_Ds_x,
|
||||
MI_Eb_x = MI_Ds_x,
|
||||
MI_E_x,
|
||||
MI_F_x,
|
||||
MI_Fs_x,
|
||||
MI_Gb_x = MI_Fs_x,
|
||||
MI_G_x,
|
||||
MI_Gs_x,
|
||||
MI_Ab_x = MI_Gs_x,
|
||||
MI_A_x,
|
||||
MI_As_x,
|
||||
MI_Bb_x = MI_As_x,
|
||||
MI_B_x,
|
||||
|
||||
MI_OCT_Nx 1-2
|
||||
MI_OCT_x 0-7
|
||||
MIDI_OCTAVE_MIN = MI_OCT_N2,
|
||||
MIDI_OCTAVE_MAX = MI_OCT_7,
|
||||
MI_OCTD, // octave down
|
||||
MI_OCTU, // octave up
|
||||
|
||||
MI_TRNS_Nx 1-6
|
||||
MI_TRNS_x 0-6
|
||||
MIDI_TRANSPOSE_MIN = MI_TRNS_N6,
|
||||
MIDI_TRANSPOSE_MAX = MI_TRNS_6,
|
||||
MI_TRNSD, // transpose down
|
||||
MI_TRNSU, // transpose up
|
||||
|
||||
MI_VEL_x 1-10
|
||||
MIDI_VELOCITY_MIN = MI_VEL_1,
|
||||
MIDI_VELOCITY_MAX = MI_VEL_9,
|
||||
MI_VELD, // velocity down
|
||||
MI_VELU, // velocity up
|
||||
|
||||
MI_CHx 1-16
|
||||
MIDI_CHANNEL_MIN = MI_CH1
|
||||
MIDI_CHANNEL_MAX = MI_CH16,
|
||||
MI_CHD, // previous channel
|
||||
MI_CHU, // next channel
|
||||
|
||||
MI_ALLOFF, // all notes off
|
||||
|
||||
MI_SUS, // sustain
|
||||
MI_PORT, // portamento
|
||||
MI_SOST, // sostenuto
|
||||
MI_SOFT, // soft pedal
|
||||
MI_LEG, // legato
|
||||
|
||||
MI_MOD, // modulation
|
||||
MI_MODSD, // decrease modulation speed
|
||||
MI_MODSU, // increase modulation speed
|
||||
#endif // MIDI_ADVANCED
|
||||
|
||||
-->
|
||||
|
@@ -109,6 +109,33 @@ Do not Auto Shift numeric keys, zero through nine.
|
||||
|
||||
Do not Auto Shift alpha characters, which include A through Z.
|
||||
|
||||
### Auto Shift Per Key
|
||||
|
||||
This is a function that allows you to determine which keys shold be autoshifted, much like the tap-hold keys.
|
||||
|
||||
The default function looks like this:
|
||||
|
||||
```c
|
||||
bool get_auto_shifted_key(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
# ifndef NO_AUTO_SHIFT_ALPHA
|
||||
case KC_A ... KC_Z:
|
||||
# endif
|
||||
# ifndef NO_AUTO_SHIFT_NUMERIC
|
||||
case KC_1 ... KC_0:
|
||||
# endif
|
||||
# ifndef NO_AUTO_SHIFT_SPECIAL
|
||||
case KC_TAB:
|
||||
case KC_MINUS ... KC_SLASH:
|
||||
case KC_NONUS_BSLASH:
|
||||
# endif
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
```
|
||||
This functionality is enabled by default, and does not need a define.
|
||||
|
||||
### AUTO_SHIFT_REPEAT (simple define)
|
||||
|
||||
Enables keyrepeat.
|
||||
|
@@ -62,15 +62,17 @@ Valid driver values are `pwm`, `software`, `custom` or `no`. See below for help
|
||||
|
||||
To configure the backlighting, `#define` these in your `config.h`:
|
||||
|
||||
| Define | Default | Description |
|
||||
|------------------------|---------------|-------------------------------------------------------------------------------------------------------------------|
|
||||
| `BACKLIGHT_PIN` | *Not defined* | The pin that controls the LED(s) |
|
||||
| `BACKLIGHT_LEVELS` | `3` | The number of brightness levels (maximum 31 excluding off) |
|
||||
| `BACKLIGHT_CAPS_LOCK` | *Not defined* | Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|
||||
| `BACKLIGHT_BREATHING` | *Not defined* | Enable backlight breathing, if supported |
|
||||
| `BREATHING_PERIOD` | `6` | The length of one backlight "breath" in seconds |
|
||||
| `BACKLIGHT_ON_STATE` | `1` | The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
|
||||
| `BACKLIGHT_LIMIT_VAL ` | `255` | The maximum duty cycle of the backlight -- `255` allows for full brightness, any lower will decrease the maximum. |
|
||||
|Define |Default |Description |
|
||||
|-----------------------------|------------------|-----------------------------------------------------------------------------------------------------------------|
|
||||
|`BACKLIGHT_PIN` |*Not defined* |The pin that controls the LED(s) |
|
||||
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 31 excluding off) |
|
||||
|`BACKLIGHT_CAPS_LOCK` |*Not defined* |Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|
||||
|`BACKLIGHT_BREATHING` |*Not defined* |Enable backlight breathing, if supported |
|
||||
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|
||||
|`BACKLIGHT_ON_STATE` |`1` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
|
||||
|`BACKLIGHT_LIMIT_VAL` |`255` |The maximum duty cycle of the backlight -- `255` allows for full brightness, any lower will decrease the maximum.|
|
||||
|`BACKLIGHT_DEFAULT_LEVEL` |`BACKLIGHT_LEVELS`|The default backlight level to use upon clearing the EEPROM |
|
||||
|`BACKLIGHT_DEFAULT_BREATHING`|*Not defined* |Whether to enable backlight breathing upon clearing the EEPROM |
|
||||
|
||||
Unless you are designing your own keyboard, you generally should not need to change the `BACKLIGHT_PIN` or `BACKLIGHT_ON_STATE`.
|
||||
|
||||
@@ -171,7 +173,7 @@ BACKLIGHT_DRIVER = software
|
||||
|
||||
#### Multiple Backlight Pins :id=multiple-backlight-pins
|
||||
|
||||
Most keyboards have only one backlight pin which control all backlight LEDs (especially if the backlight is connected to an hardware PWM pin).
|
||||
Most keyboards have only one backlight pin which controls all backlight LEDs (especially if the backlight is connected to a hardware PWM pin).
|
||||
In software PWM, it is possible to define multiple backlight pins, which will be turned on and off at the same time during the PWM duty cycle.
|
||||
|
||||
This feature allows to set, for instance, the Caps Lock LED's (or any other controllable LED) brightness at the same level as the other LEDs of the backlight. This is useful if you have mapped Control in place of Caps Lock and you need the Caps Lock LED to be part of the backlight instead of being activated when Caps Lock is on, as it is usually wired to a separate pin from the backlight.
|
||||
|
@@ -53,15 +53,15 @@ If you are using different pinouts for the encoders on each half of a split keyb
|
||||
The callback functions can be inserted into your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
void encoder_update_kb(uint8_t index, bool clockwise) {
|
||||
encoder_update_user(index, clockwise);
|
||||
bool encoder_update_kb(uint8_t index, bool clockwise) {
|
||||
return encoder_update_user(index, clockwise);
|
||||
}
|
||||
```
|
||||
|
||||
or `keymap.c`:
|
||||
|
||||
```c
|
||||
void encoder_update_user(uint8_t index, bool clockwise) {
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (index == 0) { /* First encoder */
|
||||
if (clockwise) {
|
||||
tap_code(KC_PGDN);
|
||||
@@ -75,9 +75,29 @@ void encoder_update_user(uint8_t index, bool clockwise) {
|
||||
tap_code(KC_UP);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
!> If you return `true`, this will allow the keyboard level code to run, as well. Returning `false` will override the keyboard level code. Depending on how the keyboard level function is set up.
|
||||
|
||||
## Hardware
|
||||
|
||||
The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground.
|
||||
|
||||
## Multiple Encoders
|
||||
|
||||
Multiple encoders may share pins so long as each encoder has a distinct pair of pins.
|
||||
|
||||
For example you can support two encoders using only 3 pins like this
|
||||
```
|
||||
#define ENCODERS_PAD_A { B1, B1 }
|
||||
#define ENCODERS_PAD_B { B2, B3 }
|
||||
```
|
||||
|
||||
You could even support three encoders using only three pins (one per encoder) however in this configuration, rotating two encoders which share pins simultaneously will often generate incorrect output. For example:
|
||||
```
|
||||
#define ENCODERS_PAD_A { B1, B1, B2 }
|
||||
#define ENCODERS_PAD_B { B2, B3, B3 }
|
||||
```
|
||||
Here rotating Encoder 0 `B1 B2` and Encoder 1 `B1 B3` could be interpreted as rotating Encoder 2 `B2 B3` or `B3 B2` depending on the timing. This may still be a useful configuration depending on your use case
|
||||
|
@@ -19,12 +19,10 @@ These functions allow you to activate layers in various ways. Note that layers a
|
||||
|
||||
### Caveats :id=caveats
|
||||
|
||||
Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Specifically, dual function keys like `LT` and `MT` use a 16 bit keycode. 4 bits are used for the function identifier, the next 12 are divided into the parameters. Layer Tap uses 4 bits for the layer (and is why it's limited to layers 0-15, actually), while Mod Tap does the same, 4 bits for the identifier, 4 bits for which mods are used, and all of them use 8 bits for the keycode. Because of this, the keycode used is limited to `0xFF` (0-255), which are the basic keycodes only.
|
||||
Currently, the `layer` argument of `LT()` is limited to layers 0-15, and the `kc` argument to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. This is because QMK uses 16-bit keycodes, of which 4 bits are used for the function identifier and 4 bits for the layer, leaving only 8 bits for the keycode.
|
||||
|
||||
Expanding this would be complicated, at best. Moving to a 32-bit keycode would solve a lot of this, but would double the amount of space that the keymap matrix uses. And it could potentially cause issues, too. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
|
||||
|
||||
Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
|
||||
|
||||
## Working with Layers :id=working-with-layers
|
||||
|
||||
Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems.
|
||||
|
@@ -72,6 +72,19 @@ SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
|
||||
}
|
||||
```
|
||||
|
||||
## Infinite Leader key timeout
|
||||
|
||||
Sometimes your leader key is not on a comfortable places as the rest of keys on your sequence. Imagine that your leader key is one of your outer top right keys, you may need to reposition your hand just to reach your leader key.
|
||||
This can make typing the entire sequence on time hard even if you are able to type most of the sequence fast. For example, if your sequence is `Leader + asd` typing `asd` fast is very easy once you have your hands in your home row. However starting the sequence in time after moving your hand out of the home row to reach the leader key and back is not.
|
||||
To remove the stress this situation produces to your hands you can enable an infinite timeout just for the leader key. This mean that, after you hit the leader key you will have an infinite amount of time to start the rest of the sequence, allowing you to proper position your hands on the best position to type the rest of the sequence comfortably.
|
||||
This infinite timeout only affects the leader key, so in our previous example of `Leader + asd` you will have an infinite amount of time between `Leader` and `a`, but once you start the sequence the timeout you have configured (global or per key) will work normally.
|
||||
This way you can configure a very short `LEADER_TIMEOUT` but still have plenty of time to position your hands.
|
||||
|
||||
In order to enable this, place this in your `config.h`:
|
||||
```c
|
||||
#define LEADER_NO_TIMEOUT
|
||||
```
|
||||
|
||||
## Strict Key Processing
|
||||
|
||||
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
|
||||
@@ -92,7 +105,7 @@ void leader_start(void) {
|
||||
}
|
||||
|
||||
void leader_end(void) {
|
||||
// sequence ended (no success/failuer detection)
|
||||
// sequence ended (no success/failure detection)
|
||||
}
|
||||
```
|
||||
|
||||
|
@@ -1,14 +1,14 @@
|
||||
# LED Matrix Lighting
|
||||
# LED Matrix Lighting :id=led-matrix-lighting
|
||||
|
||||
This feature allows you to use LED matrices driven by external drivers. It hooks into the backlight system so you can use the same keycodes as backlighting to control it.
|
||||
|
||||
If you want to use RGB LED's you should use the [RGB Matrix Subsystem](feature_rgb_matrix.md) instead.
|
||||
|
||||
## Driver configuration
|
||||
## Driver configuration :id=driver-configuration
|
||||
---
|
||||
### IS31FL3731 :id=is31fl3731
|
||||
|
||||
### IS31FL3731
|
||||
|
||||
There is basic support for addressable LED matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`:
|
||||
There is basic support for addressable LED matrix lighting with the I2C IS31FL3731 LED controller. To enable it, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
LED_MATRIX_ENABLE = yes
|
||||
@@ -19,7 +19,7 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_<N>
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages | 100 |
|
||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `LED_DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
|
||||
| `DRIVER_LED_TOTAL` | (Required) How many LED lights are present across all drivers | |
|
||||
@@ -42,59 +42,336 @@ Here is an example using 2 drivers.
|
||||
#define LED_DRIVER_ADDR_2 0b1110110
|
||||
|
||||
#define LED_DRIVER_COUNT 2
|
||||
#define LED_DRIVER_1_LED_COUNT 25
|
||||
#define LED_DRIVER_2_LED_COUNT 24
|
||||
#define DRIVER_LED_TOTAL LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL
|
||||
#define LED_DRIVER_1_LED_TOTAL 25
|
||||
#define LED_DRIVER_2_LED_TOTAL 24
|
||||
#define DRIVER_LED_TOTAL (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)
|
||||
```
|
||||
|
||||
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
|
||||
!> Note the parentheses, this is so when `LED_DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`.
|
||||
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | LED address
|
||||
* | | */
|
||||
{ 0, C1_1 },
|
||||
{ 0, C1_15 },
|
||||
// ...
|
||||
}
|
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | LED address
|
||||
* | | */
|
||||
{ 0, C1_1 },
|
||||
{ 0, C1_15 },
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
||||
|
||||
## Keycodes
|
||||
---
|
||||
|
||||
All LED matrix keycodes are currently shared with the [backlight system](feature_backlight.md).
|
||||
|
||||
## LED Matrix Effects
|
||||
|
||||
Currently no LED matrix effects have been created.
|
||||
|
||||
## Custom Layer Effects
|
||||
|
||||
Custom layer effects can be done by defining this in your `<keyboard>.c`:
|
||||
From this point forward the configuration is the same for all the drivers. The `led_config_t` struct provides a key electrical matrix to led index lookup table, what the physical position of each LED is on the board, and what type of key or usage the LED if the LED represents. Here is a brief example:
|
||||
|
||||
```c
|
||||
led_config_t g_led_config = { {
|
||||
// Key Matrix to LED Index
|
||||
{ 5, NO_LED, NO_LED, 0 },
|
||||
{ NO_LED, NO_LED, NO_LED, NO_LED },
|
||||
{ 4, NO_LED, NO_LED, 1 },
|
||||
{ 3, NO_LED, NO_LED, 2 }
|
||||
}, {
|
||||
// LED Index to Physical Position
|
||||
{ 188, 16 }, { 187, 48 }, { 149, 64 }, { 112, 64 }, { 37, 48 }, { 38, 16 }
|
||||
}, {
|
||||
// LED Index to Flag
|
||||
1, 4, 4, 4, 4, 1
|
||||
} };
|
||||
```
|
||||
|
||||
The first part, `// Key Matrix to LED Index`, tells the system what key this LED represents by using the key's electrical matrix row & col. The second part, `// LED Index to Physical Position` represents the LED's physical `{ x, y }` position on the keyboard. The default expected range of values for `{ x, y }` is the inclusive range `{ 0..224, 0..64 }`. This default expected range is due to effects that calculate the center of the keyboard for their animations. The easiest way to calculate these positions is imagine your keyboard is a grid, and the top left of the keyboard represents `{ x, y }` coordinate `{ 0, 0 }` and the bottom right of your keyboard represents `{ 224, 64 }`. Using this as a basis, you can use the following formula to calculate the physical position:
|
||||
|
||||
```c
|
||||
x = 224 / (NUMBER_OF_COLS - 1) * COL_POSITION
|
||||
y = 64 / (NUMBER_OF_ROWS - 1) * ROW_POSITION
|
||||
```
|
||||
|
||||
Where NUMBER_OF_COLS, NUMBER_OF_ROWS, COL_POSITION, & ROW_POSITION are all based on the physical layout of your keyboard, not the electrical layout.
|
||||
|
||||
As mentioned earlier, the center of the keyboard by default is expected to be `{ 112, 32 }`, but this can be changed if you want to more accurately calculate the LED's physical `{ x, y }` positions. Keyboard designers can implement `#define LED_MATRIX_CENTER { 112, 32 }` in their config.h file with the new center point of the keyboard, or where they want it to be allowing more possibilities for the `{ x, y }` values. Do note that the maximum value for x or y is 255, and the recommended maximum is 224 as this gives animations runoff room before they reset.
|
||||
|
||||
`// LED Index to Flag` is a bitmask, whether or not a certain LEDs is of a certain type. It is recommended that LEDs are set to only 1 type.
|
||||
|
||||
## Flags :id=flags
|
||||
|
||||
|Define |Value |Description |
|
||||
|----------------------------|------|-------------------------------------------------|
|
||||
|`HAS_FLAGS(bits, flags)` |*n/a* |Evaluates to `true` if `bits` has all `flags` set|
|
||||
|`HAS_ANY_FLAGS(bits, flags)`|*n/a* |Evaluates to `true` if `bits` has any `flags` set|
|
||||
|`LED_FLAG_NONE` |`0x00`|If this LED has no flags |
|
||||
|`LED_FLAG_ALL` |`0xFF`|If this LED has all flags |
|
||||
|`LED_FLAG_MODIFIER` |`0x01`|If the LED is on a modifier key |
|
||||
|`LED_FLAG_KEYLIGHT` |`0x04`|If the LED is for key backlight |
|
||||
|`LED_FLAG_INDICATOR` |`0x08`|If the LED is for keyboard state indication |
|
||||
|
||||
## Keycodes :id=keycodes
|
||||
|
||||
All LED matrix keycodes are currently shared with the [Backlight feature](feature_backlight.md).
|
||||
|
||||
|Key |Description |
|
||||
|---------|-----------------------------|
|
||||
|`BL_TOGG`|Toggle LED Matrix on or off |
|
||||
|`BL_STEP`|Cycle through modes |
|
||||
|`BL_ON` |Turn on LED Matrix |
|
||||
|`BL_OFF` |Turn off LED Matrix |
|
||||
|`BL_INC` |Increase the brightness level|
|
||||
|`BL_DEC` |Decrease the brightness level|
|
||||
|
||||
## LED Matrix Effects :id=led-matrix-effects
|
||||
|
||||
These are the effects that are currently available:
|
||||
|
||||
```c
|
||||
enum led_matrix_effects {
|
||||
LED_MATRIX_NONE = 0,
|
||||
LED_MATRIX_SOLID = 1, // Static single val, no speed support
|
||||
LED_MATRIX_ALPHAS_MODS, // Static dual val, speed is val for LEDs marked as modifiers
|
||||
LED_MATRIX_BREATHING, // Cycling brightness animation
|
||||
LED_MATRIX_BAND, // Band fading brightness scrolling left to right
|
||||
LED_MATRIX_BAND_PINWHEEL, // 3 blade spinning pinwheel fades brightness
|
||||
LED_MATRIX_BAND_SPIRAL, // Spinning spiral fades brightness
|
||||
LED_MATRIX_CYCLE_LEFT_RIGHT, // Full gradient scrolling left to right
|
||||
LED_MATRIX_CYCLE_UP_DOWN, // Full gradient scrolling top to bottom
|
||||
LED_MATRIX_CYCLE_OUT_IN, // Full gradient scrolling out to in
|
||||
LED_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard
|
||||
#if defined(LED_MATRIX_KEYPRESSES) || defined(LED_MATRIX_KEYRELEASES)
|
||||
LED_MATRIX_SOLID_REACTIVE_SIMPLE, // Pulses keys hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_WIDE // Value pulses near a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTIWIDE // Value pulses near multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_CROSS // Value pulses the same column and row of a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTICROSS // Value pulses the same column and row of multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_NEXUS // Value pulses away on the same column and row of a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTINEXUS // Value pulses away on the same column and row of multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_SPLASH, // Value pulses away from a single key hit then fades out
|
||||
LED_MATRIX_SOLID_MULTISPLASH, // Value pulses away from multiple key hits then fades out
|
||||
#endif
|
||||
LED_MATRIX_WAVE_LEFT_RIGHT // Sine wave scrolling from left to right
|
||||
LED_MATRIX_WAVE_UP_DOWN // Sine wave scrolling from up to down
|
||||
LED_MATRIX_EFFECT_MAX
|
||||
};
|
||||
```
|
||||
|
||||
You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`:
|
||||
|
||||
|
||||
|Define |Description |
|
||||
|-------------------------------------------------------|-----------------------------------------------|
|
||||
|`#define DISABLE_LED_MATRIX_ALPHAS_MODS` |Disables `LED_MATRIX_ALPHAS_MODS` |
|
||||
|`#define DISABLE_LED_MATRIX_BREATHING` |Disables `LED_MATRIX_BREATHING` |
|
||||
|`#define DISABLE_LED_MATRIX_BAND` |Disables `LED_MATRIX_BAND` |
|
||||
|`#define DISABLE_LED_MATRIX_BAND_PINWHEEL` |Disables `LED_MATRIX_BAND_PINWHEEL` |
|
||||
|`#define DISABLE_LED_MATRIX_BAND_SPIRAL` |Disables `LED_MATRIX_BAND_SPIRAL` |
|
||||
|`#define DISABLE_LED_MATRIX_CYCLE_LEFT_RIGHT` |Disables `LED_MATRIX_CYCLE_LEFT_RIGHT` |
|
||||
|`#define DISABLE_LED_MATRIX_CYCLE_UP_DOWN` |Disables `LED_MATRIX_CYCLE_UP_DOWN` |
|
||||
|`#define DISABLE_LED_MATRIX_CYCLE_OUT_IN` |Disables `LED_MATRIX_CYCLE_OUT_IN` |
|
||||
|`#define DISABLE_LED_MATRIX_DUAL_BEACON` |Disables `LED_MATRIX_DUAL_BEACON` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE` |Disables `LED_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_WIDE` |Disables `LED_MATRIX_SOLID_REACTIVE_WIDE` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Disables `LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS` |Disables `LED_MATRIX_SOLID_REACTIVE_CROSS` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS` |Disables `LED_MATRIX_SOLID_REACTIVE_MULTICROSS`|
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS` |Disables `LED_MATRIX_SOLID_REACTIVE_NEXUS` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS` |Disables `LED_MATRIX_SOLID_REACTIVE_MULTINEXUS`|
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_SPLASH` |Disables `LED_MATRIX_SOLID_SPLASH` |
|
||||
|`#define DISABLE_LED_MATRIX_SOLID_MULTISPLASH` |Disables `LED_MATRIX_SOLID_MULTISPLASH` |
|
||||
|`#define DISABLE_LED_MATRIX_WAVE_LEFT_RIGHT` |Disables `LED_MATRIX_WAVE_LEFT_RIGHT` |
|
||||
|`#define DISABLE_LED_MATRIX_WAVE_UP_DOWN` |Disables `LED_MATRIX_WAVE_UP_DOWN` |
|
||||
|
||||
## Custom LED Matrix Effects :id=custom-led-matrix-effects
|
||||
|
||||
By setting `LED_MATRIX_CUSTOM_USER` (and/or `LED_MATRIX_CUSTOM_KB`) in `rules.mk`, new effects can be defined directly from userspace, without having to edit any QMK core files.
|
||||
|
||||
To declare new effects, create a new `led_matrix_user/kb.inc` that looks something like this:
|
||||
|
||||
`led_matrix_user.inc` should go in the root of the keymap directory.
|
||||
`led_matrix_kb.inc` should go in the root of the keyboard directory.
|
||||
|
||||
To use custom effects in your code, simply prepend `LED_MATRIX_CUSTOM_` to the effect name specified in `LED_MATRIX_EFFECT()`. For example, an effect declared as `LED_MATRIX_EFFECT(my_cool_effect)` would be referenced with:
|
||||
|
||||
```c
|
||||
led_matrix_mode(led_MATRIX_CUSTOM_my_cool_effect);
|
||||
```
|
||||
|
||||
```c
|
||||
// !!! DO NOT ADD #pragma once !!! //
|
||||
|
||||
// Step 1.
|
||||
// Declare custom effects using the LED_MATRIX_EFFECT macro
|
||||
// (note the lack of semicolon after the macro!)
|
||||
LED_MATRIX_EFFECT(my_cool_effect)
|
||||
LED_MATRIX_EFFECT(my_cool_effect2)
|
||||
|
||||
// Step 2.
|
||||
// Define effects inside the `LED_MATRIX_CUSTOM_EFFECT_IMPLS` ifdef block
|
||||
#ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
// e.g: A simple effect, self-contained within a single method
|
||||
static bool my_cool_effect(effect_params_t* params) {
|
||||
LED_MATRIX_USE_LIMITS(led_min, led_max);
|
||||
for (uint8_t i = led_min; i < led_max; i++) {
|
||||
led_matrix_set_value(i, 0xFF);
|
||||
}
|
||||
return led_max < DRIVER_LED_TOTAL;
|
||||
}
|
||||
|
||||
// e.g: A more complex effect, relying on external methods and state, with
|
||||
// dedicated init and run methods
|
||||
static uint8_t some_global_state;
|
||||
static void my_cool_effect2_complex_init(effect_params_t* params) {
|
||||
some_global_state = 1;
|
||||
}
|
||||
static bool my_cool_effect2_complex_run(effect_params_t* params) {
|
||||
LED_MATRIX_USE_LIMITS(led_min, led_max);
|
||||
for (uint8_t i = led_min; i < led_max; i++) {
|
||||
led_matrix_set_value(i, some_global_state++);
|
||||
}
|
||||
|
||||
return led_max < DRIVER_LED_TOTAL;
|
||||
}
|
||||
static bool my_cool_effect2(effect_params_t* params) {
|
||||
if (params->init) my_cool_effect2_complex_init(params);
|
||||
return my_cool_effect2_complex_run(params);
|
||||
}
|
||||
|
||||
#endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
```
|
||||
|
||||
For inspiration and examples, check out the built-in effects under `quantum/led_matrix_animations/`
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Additional `config.h` Options :id=additional-configh-options
|
||||
|
||||
```c
|
||||
#define LED_MATRIX_KEYPRESSES // reacts to keypresses
|
||||
#define LED_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
|
||||
#define LED_MATRIX_FRAMEBUFFER_EFFECTS // enable framebuffer effects
|
||||
#define LED_DISABLE_TIMEOUT 0 // number of milliseconds to wait until led automatically turns off
|
||||
#define LED_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
|
||||
#define LED_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
|
||||
#define LED_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||
#define LED_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||
#define LED_MATRIX_MAXIMUM_BRIGHTNESS 255 // limits maximum brightness of LEDs
|
||||
#define LED_MATRIX_STARTUP_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
|
||||
#define LED_MATRIX_STARTUP_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||
#define LED_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
|
||||
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||
// If LED_MATRIX_KEYPRESSES or LED_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||
```
|
||||
|
||||
## EEPROM storage :id=eeprom-storage
|
||||
|
||||
The EEPROM for it is currently shared with the RGB Matrix system (it's generally assumed only one feature would be used at a time), but could be configured to use its own 32bit address with:
|
||||
|
||||
```c
|
||||
#define EECONFIG_LED_MATRIX (uint32_t *)28
|
||||
```
|
||||
|
||||
Where `28` is an unused index from `eeconfig.h`.
|
||||
|
||||
### Direct Operation :id=direct-operation
|
||||
|Function |Description |
|
||||
|--------------------------------------------|-------------|
|
||||
|`led_matrix_set_value_all(v)` |Set all of the LEDs to the given value, where `v` is between 0 and 255 (not written to EEPROM) |
|
||||
|`led_matrix_set_value(index, v)` |Set a single LED to the given value, where `v` is between 0 and 255, and `index` is between 0 and `DRIVER_LED_TOTAL` (not written to EEPROM) |
|
||||
|
||||
### Disable/Enable Effects :id=disable-enable-effects
|
||||
|Function |Description |
|
||||
|--------------------------------------------|-------------|
|
||||
|`led_matrix_toggle()` |Toggle effect range LEDs between on and off |
|
||||
|`led_matrix_toggle_noeeprom()` |Toggle effect range LEDs between on and off (not written to EEPROM) |
|
||||
|`led_matrix_enable()` |Turn effect range LEDs on, based on their previous state |
|
||||
|`led_matrix_enable_noeeprom()` |Turn effect range LEDs on, based on their previous state (not written to EEPROM) |
|
||||
|`led_matrix_disable()` |Turn effect range LEDs off, based on their previous state |
|
||||
|`led_matrix_disable_noeeprom()` |Turn effect range LEDs off, based on their previous state (not written to EEPROM) |
|
||||
|
||||
### Change Effect Mode :id=change-effect-mode
|
||||
|Function |Description |
|
||||
|--------------------------------------------|-------------|
|
||||
|`led_matrix_mode(mode)` |Set the mode, if LED animations are enabled |
|
||||
|`led_matrix_mode_noeeprom(mode)` |Set the mode, if LED animations are enabled (not written to EEPROM) |
|
||||
|`led_matrix_step()` |Change the mode to the next LED animation in the list of enabled LED animations |
|
||||
|`led_matrix_step_noeeprom()` |Change the mode to the next LED animation in the list of enabled LED animations (not written to EEPROM) |
|
||||
|`led_matrix_step_reverse()` |Change the mode to the previous LED animation in the list of enabled LED animations |
|
||||
|`led_matrix_step_reverse_noeeprom()` |Change the mode to the previous LED animation in the list of enabled LED animations (not written to EEPROM) |
|
||||
|`led_matrix_increase_speed()` |Increase the speed of the animations |
|
||||
|`led_matrix_increase_speed_noeeprom()` |Increase the speed of the animations (not written to EEPROM) |
|
||||
|`led_matrix_decrease_speed()` |Decrease the speed of the animations |
|
||||
|`led_matrix_decrease_speed_noeeprom()` |Decrease the speed of the animations (not written to EEPROM) |
|
||||
|`led_matrix_set_speed(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 |
|
||||
|`led_matrix_set_speed_noeeprom(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 (not written to EEPROM) |
|
||||
|
||||
### Change Value :id=change-value
|
||||
|Function |Description |
|
||||
|--------------------------------------------|-------------|
|
||||
|`led_matrix_increase_val()` |Increase the value for effect range LEDs. This wraps around at maximum value |
|
||||
|`led_matrix_increase_val_noeeprom()` |Increase the value for effect range LEDs. This wraps around at maximum value (not written to EEPROM) |
|
||||
|`led_matrix_decrease_val()` |Decrease the value for effect range LEDs. This wraps around at minimum value |
|
||||
|`led_matrix_decrease_val_noeeprom()` |Decrease the value for effect range LEDs. This wraps around at minimum value (not written to EEPROM) |
|
||||
|
||||
### Query Current Status :id=query-current-status
|
||||
|Function |Description |
|
||||
|---------------------------------|---------------------------|
|
||||
|`led_matrix_is_enabled()` |Gets current on/off status |
|
||||
|`led_matrix_get_mode()` |Gets current mode |
|
||||
|`led_matrix_get_val()` |Gets current val |
|
||||
|`led_matrix_get_speed()` |Gets current speed |
|
||||
|`led_matrix_get_suspend_state()` |Gets current suspend state |
|
||||
|
||||
## Callbacks :id=callbacks
|
||||
|
||||
### Indicators :id=indicators
|
||||
|
||||
If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `led_matrix_indicators_kb` or `led_matrix_indicators_user` function for that:
|
||||
```c
|
||||
void led_matrix_indicators_kb(void) {
|
||||
led_matrix_set_index_value(index, value);
|
||||
led_matrix_set_color(index, value);
|
||||
}
|
||||
```
|
||||
|
||||
A similar function works in the keymap as `led_matrix_indicators_user`.
|
||||
In addition, there are the advanced indicator functions. These are aimed at those with heavily customized displays, where rendering every LED per cycle is expensive. This includes a special macro to help make this easier to use: `LED_MATRIX_INDICATOR_SET_VALUE(i, v)`.
|
||||
|
||||
## Suspended State
|
||||
```c
|
||||
void led_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
||||
LED_MATRIX_INDICATOR_SET_VALUE(index, value);
|
||||
}
|
||||
```
|
||||
|
||||
To use the suspend feature, add this to your `<keyboard>.c`:
|
||||
## Suspended State :id=suspended-state
|
||||
To use the suspend feature, make sure that `#define LED_DISABLE_WHEN_USB_SUSPENDED true` is added to the `config.h` file.
|
||||
|
||||
Additionally add this to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
void suspend_power_down_kb(void) {
|
||||
led_matrix_set_suspend_state(true);
|
||||
suspend_power_down_user();
|
||||
}
|
||||
|
||||
void suspend_wakeup_init_kb(void) {
|
||||
led_matrix_set_suspend_state(false);
|
||||
suspend_wakeup_init_user();
|
||||
}
|
||||
```
|
||||
```
|
||||
or add this to your `keymap.c`:
|
||||
```c
|
||||
void suspend_power_down_user(void) {
|
||||
led_matrix_set_suspend_state(true);
|
||||
}
|
||||
|
||||
void suspend_wakeup_init_user(void) {
|
||||
led_matrix_set_suspend_state(false);
|
||||
}
|
||||
```
|
||||
|
@@ -209,7 +209,7 @@ SEND_STRING(".."SS_TAP(X_END));
|
||||
|
||||
There are some functions you may find useful in macro-writing. Keep in mind that while you can write some fairly advanced code within a macro, if your functionality gets too complex you may want to define a custom keycode instead. Macros are meant to be simple.
|
||||
|
||||
?> You can also use the functions described in [Useful functions](ref_functions.md) for additional functionality. For example `reset_keyboard()` allows you to reset the keyboard as part of a macro.
|
||||
?> You can also use the functions described in [Useful function](ref_functions.md) and [Checking modifier state](feature_advanced_keycodes#checking-modifier-state) for additional functionality. For example, `reset_keyboard()` allows you to reset the keyboard as part of a macro and `get_mods() & MOD_MASK_SHIFT` lets you check for the existence of active shift modifiers.
|
||||
|
||||
### `record->event.pressed`
|
||||
|
||||
|
260
docs/feature_midi.md
Normal file
260
docs/feature_midi.md
Normal file
@@ -0,0 +1,260 @@
|
||||
# MIDI
|
||||
|
||||
## Usage
|
||||
|
||||
First, enable MIDI by adding the following to your `rules.mk`:
|
||||
|
||||
```makefile
|
||||
MIDI_ENABLE = yes
|
||||
```
|
||||
|
||||
There are two MIDI systems in QMK: basic and advanced. With basic MIDI you will only be able to send Note On and Note Off messages using the note keycodes, meaning that keycodes like `MI_OCTU` and `MI_OCTD` will not work. Advanced MIDI allows you to do things like octave shifts, channel changes, velocity changes, modulation, and more.
|
||||
|
||||
### Basic MIDI
|
||||
|
||||
To enable basic MIDI, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define MIDI_BASIC
|
||||
```
|
||||
|
||||
### Advanced MIDI
|
||||
|
||||
To enable advanced MIDI, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define MIDI_ADVANCED
|
||||
```
|
||||
|
||||
#### Sending Control Change (CC) Messages
|
||||
|
||||
If you're aiming to emulate the features of something like a Launchpad or other MIDI controller you'll need to access the internal MIDI device directly.
|
||||
|
||||
Because there are so many possible CC messages, not all of them are implemented as keycodes. Additionally, you might need to provide more than just two values that you would get from a keycode (pressed and released) - for example, the analog values from a fader or a potentiometer. So, you will need to implement [custom keycodes](feature_macros.md) if you want to use them in your keymap directly using `process_record_user()`.
|
||||
|
||||
|
||||
For reference of all the possible control code numbers see [MIDI Specification](#midi-specification)
|
||||
|
||||
#### Example code for using Generic On Off Switches as per MIDI Specification.
|
||||
```c
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
extern MidiDevice midi_device;
|
||||
|
||||
// MIDI CC codes for generic on/off switches (80, 81, 82, 83)
|
||||
// Off: 0-63
|
||||
// On: 64-127
|
||||
|
||||
#define MIDI_CC_OFF 0
|
||||
#define MIDI_CC_ON 127
|
||||
|
||||
enum custom_keycodes {
|
||||
MIDI_CC80 = SAFE_RANGE,
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case MIDI_CC80:
|
||||
if (record->event.pressed) {
|
||||
midi_send_cc(&midi_device, midi_config.channel, 80, ON);
|
||||
} else {
|
||||
midi_send_cc(&midi_device, midi_config.channel, 80, OFF);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
LAYOUT(
|
||||
// ...
|
||||
MIDI_CC80,
|
||||
// ...
|
||||
)
|
||||
};
|
||||
```
|
||||
|
||||
### Keycodes
|
||||
|
||||
|Keycode |Aliases |Description |
|
||||
|------------|---------|---------------------------------|
|
||||
|`MI_ON` | |Turn MIDI on |
|
||||
|`MI_OFF` | |Turn MIDI off |
|
||||
|`MI_TOG` | |Toggle MIDI enabled |
|
||||
|`MI_C` | |C octave 0 |
|
||||
|`MI_Cs` |`MI_Db` |C♯/D♭ octave 0 |
|
||||
|`MI_D` | |D octave 0 |
|
||||
|`MI_Ds` |`MI_Eb` |D♯/E♭ octave 0 |
|
||||
|`MI_E` | |E octave 0 |
|
||||
|`MI_F` | |F octave 0 |
|
||||
|`MI_Fs` |`MI_Gb` |F♯/G♭ octave 0 |
|
||||
|`MI_G` | |G octave 0 |
|
||||
|`MI_Gs` |`MI_Gs` |G♯/A♭ octave 0 |
|
||||
|`MI_A` | |A octave 0 |
|
||||
|`MI_As` |`MI_Bb` |A♯/B♭ octave 0 |
|
||||
|`MI_B` | |B octave 0 |
|
||||
|`MI_C_1` | |C octave 1 |
|
||||
|`MI_Cs_1` |`MI_Db_1`|C♯/D♭ octave 1 |
|
||||
|`MI_D_1` | |D octave 1 |
|
||||
|`MI_Ds_1` |`MI_Eb_1`|D♯/E♭ octave 1 |
|
||||
|`MI_E_1` | |E octave 1 |
|
||||
|`MI_F_1` | |F octave 1 |
|
||||
|`MI_Fs_1` |`MI_Gb_1`|F♯/G♭ octave 1 |
|
||||
|`MI_G_1` | |G octave 1 |
|
||||
|`MI_Gs_1` |`MI_Ab_1`|G♯/A♭ octave 1 |
|
||||
|`MI_A_1` | |A octave 1 |
|
||||
|`MI_As_1` |`MI_Bb_1`|A♯/B♭ octave 1 |
|
||||
|`MI_B_1` | |B octave 1 |
|
||||
|`MI_C_2` | |C octave 2 |
|
||||
|`MI_Cs_2` |`MI_Db_2`|C♯/D♭ octave 2 |
|
||||
|`MI_D_2` | |D octave 2 |
|
||||
|`MI_Ds_2` |`MI_Eb_2`|D♯/E♭ octave 2 |
|
||||
|`MI_E_2` | |E octave 2 |
|
||||
|`MI_F_2` | |F octave 2 |
|
||||
|`MI_Fs_2` |`MI_Gb_2`|F♯/G♭ octave 2 |
|
||||
|`MI_G_2` | |G octave 2 |
|
||||
|`MI_Gs_2` |`MI_Ab_2`|G♯/A♭ octave 2 |
|
||||
|`MI_A_2` | |A octave 2 |
|
||||
|`MI_As_2` |`MI_Bb_2`|A♯/B♭ octave 2 |
|
||||
|`MI_B_2` | |B octave 2 |
|
||||
|`MI_C_3` | |C octave 3 |
|
||||
|`MI_Cs_3` |`MI_Db_3`|C♯/D♭ octave 3 |
|
||||
|`MI_D_3` | |D octave 3 |
|
||||
|`MI_Ds_3` |`MI_Eb_3`|D♯/E♭ octave 3 |
|
||||
|`MI_E_3` | |E octave 3 |
|
||||
|`MI_F_3` | |F octave 3 |
|
||||
|`MI_Fs_3` |`MI_Gb_3`|F♯/G♭ octave 3 |
|
||||
|`MI_G_3` | |G octave 3 |
|
||||
|`MI_Gs_3` |`MI_Ab_3`|G♯/A♭ octave 3 |
|
||||
|`MI_A_3` | |A octave 3 |
|
||||
|`MI_As_3` |`MI_Bb_3`|A♯/B♭ octave 3 |
|
||||
|`MI_B_3` | |B octave 3 |
|
||||
|`MI_C_4` | |C octave 4 |
|
||||
|`MI_Cs_4` |`MI_Db_4`|C♯/D♭ octave 4 |
|
||||
|`MI_D_4` | |D octave 4 |
|
||||
|`MI_Ds_4` |`MI_Eb_4`|D♯/E♭ octave 4 |
|
||||
|`MI_E_4` | |E octave 4 |
|
||||
|`MI_F_4` | |F octave 4 |
|
||||
|`MI_Fs_4` |`MI_Gb_4`|F♯/G♭ octave 4 |
|
||||
|`MI_G_4` | |G octave 4 |
|
||||
|`MI_Gs_4` |`MI_Ab_4`|G♯/A♭ octave 4 |
|
||||
|`MI_A_4` | |A octave 4 |
|
||||
|`MI_As_4` |`MI_Bb_4`|A♯/B♭ octave 4 |
|
||||
|`MI_B_4` | |B octave 4 |
|
||||
|`MI_C_5` | |C octave 5 |
|
||||
|`MI_Cs_5` |`MI_Db_5`|C♯/D♭ octave 5 |
|
||||
|`MI_D_5` | |D octave 5 |
|
||||
|`MI_Ds_5` |`MI_Eb_5`|D♯/E♭ octave 5 |
|
||||
|`MI_E_5` | |E octave 5 |
|
||||
|`MI_F_5` | |F octave 5 |
|
||||
|`MI_Fs_5` |`MI_Gb_5`|F♯/G♭ octave 5 |
|
||||
|`MI_G_5` | |G octave 5 |
|
||||
|`MI_Gs_5` |`MI_Ab_5`|G♯/A♭ octave 5 |
|
||||
|`MI_A_5` | |A octave 5 |
|
||||
|`MI_As_5` |`MI_Bb_5`|A♯/B♭ octave 5 |
|
||||
|`MI_B_5` | |B octave 5 |
|
||||
|`MI_OCT_N2` | |Set octave to -2 |
|
||||
|`MI_OCT_N1` | |Set octave to -1 |
|
||||
|`MI_OCT_0` | |Set octave to 0 |
|
||||
|`MI_OCT_1` | |Set octave to 1 |
|
||||
|`MI_OCT_2` | |Set octave to 2 |
|
||||
|`MI_OCT_3` | |Set octave to 3 |
|
||||
|`MI_OCT_4` | |Set octave to 4 |
|
||||
|`MI_OCT_5` | |Set octave to 5 |
|
||||
|`MI_OCT_6` | |Set octave to 6 |
|
||||
|`MI_OCT_7` | |Set octave to 7 |
|
||||
|`MI_OCTD` | |Move down an octave |
|
||||
|`MI_OCTU` | |Move up an octave |
|
||||
|`MI_TRNS_N6`| |Set transposition to -6 semitones|
|
||||
|`MI_TRNS_N5`| |Set transposition to -5 semitones|
|
||||
|`MI_TRNS_N4`| |Set transposition to -4 semitones|
|
||||
|`MI_TRNS_N3`| |Set transposition to -3 semitones|
|
||||
|`MI_TRNS_N2`| |Set transposition to -2 semitones|
|
||||
|`MI_TRNS_N1`| |Set transposition to -1 semitone |
|
||||
|`MI_TRNS_0` | |No transposition |
|
||||
|`MI_TRNS_1` | |Set transposition to +1 semitone |
|
||||
|`MI_TRNS_2` | |Set transposition to +2 semitones|
|
||||
|`MI_TRNS_3` | |Set transposition to +3 semitones|
|
||||
|`MI_TRNS_4` | |Set transposition to +4 semitones|
|
||||
|`MI_TRNS_5` | |Set transposition to +5 semitones|
|
||||
|`MI_TRNS_6` | |Set transposition to +6 semitones|
|
||||
|`MI_TRNSD` | |Decrease transposition |
|
||||
|`MI_TRNSU` | |Increase transposition |
|
||||
|`MI_VEL_0` | |Set velocity to 0 |
|
||||
|`MI_VEL_1` | |Set velocity to 12 |
|
||||
|`MI_VEL_2` | |Set velocity to 25 |
|
||||
|`MI_VEL_3` | |Set velocity to 38 |
|
||||
|`MI_VEL_4` | |Set velocity to 51 |
|
||||
|`MI_VEL_5` | |Set velocity to 64 |
|
||||
|`MI_VEL_6` | |Set velocity to 76 |
|
||||
|`MI_VEL_7` | |Set velocity to 89 |
|
||||
|`MI_VEL_8` | |Set velocity to 102 |
|
||||
|`MI_VEL_9` | |Set velocity to 114 |
|
||||
|`MI_VEL_10` | |Set velocity to 127 |
|
||||
|`MI_VELD` | |Decrease velocity |
|
||||
|`MI_VELU` | |Increase velocity |
|
||||
|`MI_CH1` | |Set channel to 1 |
|
||||
|`MI_CH2` | |Set channel to 2 |
|
||||
|`MI_CH3` | |Set channel to 3 |
|
||||
|`MI_CH4` | |Set channel to 4 |
|
||||
|`MI_CH5` | |Set channel to 5 |
|
||||
|`MI_CH6` | |Set channel to 6 |
|
||||
|`MI_CH7` | |Set channel to 7 |
|
||||
|`MI_CH8` | |Set channel to 8 |
|
||||
|`MI_CH9` | |Set channel to 9 |
|
||||
|`MI_CH10` | |Set channel to 10 |
|
||||
|`MI_CH11` | |Set channel to 11 |
|
||||
|`MI_CH12` | |Set channel to 12 |
|
||||
|`MI_CH13` | |Set channel to 13 |
|
||||
|`MI_CH14` | |Set channel to 14 |
|
||||
|`MI_CH15` | |Set channel to 15 |
|
||||
|`MI_CH16` | |Set channel to 16 |
|
||||
|`MI_CHD` | |Decrease channel |
|
||||
|`MI_CHU` | |Increase channel |
|
||||
|`MI_ALLOFF` | |Stop all notes |
|
||||
|`MI_SUS` | |Sustain |
|
||||
|`MI_PORT` | |Portmento |
|
||||
|`MI_SOST` | |Sostenuto |
|
||||
|`MI_SOFT` | |Soft Pedal |
|
||||
|`MI_LEG` | |Legato |
|
||||
|`MI_MOD` | |Modulation |
|
||||
|`MI_MODSD` | |Decrease modulation speed |
|
||||
|`MI_MODSU` | |Increase modulation speed |
|
||||
|`MI_BENDD` | |Bend pitch down |
|
||||
|`MI_BENDU` | |Bend pitch up |
|
||||
|
||||
### Configuration
|
||||
|
||||
Certain values are stored in the `midi_config` struct. This configuration is not persisted to EEPROM. By default, these values are:
|
||||
|
||||
|Configuration |Value|Comments |
|
||||
|-------------------|-----|-------------------------|
|
||||
|Octave |`4` |Corresponds to `MI_OCT_2`|
|
||||
|Transposition |`0` | |
|
||||
|Velocity |`127`| |
|
||||
|Channel |`0` | |
|
||||
|Modulation Interval|`8` | |
|
||||
|
||||
For the above, the `MI_C` keycode will produce a C3 (note number 48), and so on.
|
||||
|
||||
### References
|
||||
#### MIDI Specification
|
||||
|
||||
* [MIDI.org](https://www.midi.org/specifications-old/item/table-1-summary-of-midi-message)
|
||||
* [CMU MIDI Programmer's Reference](https://www.cs.cmu.edu/~music/cmsip/readings/MIDI%20tutorial%20for%20programmers.html)
|
||||
#### QMK C Files
|
||||
|
||||
* `quantum/process_keycode/process_midi.c`
|
||||
* `quantum/quantum_keycodes.h`
|
||||
* `tmk_core/protocol/midi.h`
|
||||
* `tmk_core/protocol/midi.c`
|
||||
* `tmk_core/protocol/qmk_midi.c`
|
||||
* `tmk_core/protocol/midi_device.h`
|
||||
|
||||
<!--
|
||||
#### QMK Internals (Autogenerated)
|
||||
|
||||
* [Internals/MIDI Device Setup Process](internals_midi_device_setup_process.md)
|
||||
* [Internals/MIDI Device](internals_midi_device.md)
|
||||
* [Internals/MIDI Util](internals_midi_util.md)
|
||||
-->
|
@@ -145,6 +145,8 @@ void oled_task_user(void) {
|
||||
|`OLED_FONT_WIDTH` |`6` |The font width |
|
||||
|`OLED_FONT_HEIGHT` |`8` |The font height (untested) |
|
||||
|`OLED_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||
|`OLED_FADE_OUT` |*Not defined* |Enables fade out animation. Use together with `OLED_TIMEOUT`. |
|
||||
|`OLED_FADE_OUT_INTERVAL` |`0` |The speed of fade out animation, from 0 to 15. Larger values are slower. |
|
||||
|`OLED_SCROLL_TIMEOUT` |`0` |Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||
|`OLED_SCROLL_TIMEOUT_RIGHT`|*Not defined* |Scroll timeout direction is right when defined, left when undefined. |
|
||||
|`OLED_IC` |`OLED_IC_SSD1306`|Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. |
|
||||
|
@@ -15,7 +15,20 @@ RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = IS31FL3731
|
||||
```
|
||||
|
||||
Configure the hardware via your `config.h`:
|
||||
You can use between 1 and 4 IS31FL3731 IC's. Do not specify `DRIVER_ADDR_<N>` defines for IC's that are not present on your keyboard. You can define the following items in `config.h`:
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
|
||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
|
||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
|
||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
|
||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
```c
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
@@ -36,8 +49,6 @@ Configure the hardware via your `config.h`:
|
||||
|
||||
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
|
||||
|
||||
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
|
||||
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
@@ -53,12 +64,10 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
}
|
||||
```
|
||||
|
||||
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731.h`. The `driver` is the index of the driver you defined in your `config.h` (`0` or `1` right now).
|
||||
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3`).
|
||||
|
||||
---
|
||||
### IS31FL3733/IS31FL3737 :id=is31fl3733is31fl3737
|
||||
|
||||
!> For the IS31FL3737, replace all instances of `IS31FL3733` below with `IS31FL3737`.
|
||||
### IS31FL3733 :id=is31fl3733
|
||||
|
||||
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3733 RGB controller. To enable it, add this to your `rules.mk`:
|
||||
|
||||
@@ -67,7 +76,24 @@ RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = IS31FL3733
|
||||
```
|
||||
|
||||
Configure the hardware via your `config.h`:
|
||||
You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` defines for IC's that are not present on your keyboard. You can define the following items in `config.h`:
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
|
||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
|
||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
|
||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
|
||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
|
||||
| `DRIVER_SYNC_1` | (Optional) Sync configuration for the first RGB driver | 0 |
|
||||
| `DRIVER_SYNC_2` | (Optional) Sync configuration for the second RGB driver | 0 |
|
||||
| `DRIVER_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 |
|
||||
| `DRIVER_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
```c
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
@@ -81,6 +107,58 @@ Configure the hardware via your `config.h`:
|
||||
// ADDR2 represents A3:A2 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR2)(ADDR1)
|
||||
#define DRIVER_ADDR_1 0b1010000
|
||||
#define DRIVER_ADDR_2 0b1010011
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
#define DRIVER_1_LED_TOTAL 58
|
||||
#define DRIVER_2_LED_TOTAL 10
|
||||
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
```
|
||||
|
||||
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
|
||||
|
||||
Currently only 4 drivers are supported, but it would be trivial to support all 8 combinations.
|
||||
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | R location
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, B_1, A_1, C_1},
|
||||
....
|
||||
}
|
||||
```
|
||||
|
||||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||
|
||||
---
|
||||
### IS31FL3737 :id=is31fl3737
|
||||
|
||||
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`:
|
||||
|
||||
```makefile
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = IS31FL3737
|
||||
```
|
||||
|
||||
Configure the hardware via your `config.h`:
|
||||
|
||||
```c
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0000 <-> GND
|
||||
// 0101 <-> SCL
|
||||
// 1010 <-> SDA
|
||||
// 1111 <-> VCC
|
||||
// ADDR represents A3:A0 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR)
|
||||
#define DRIVER_ADDR_1 0b1010000
|
||||
#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons.
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
@@ -105,7 +183,7 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
}
|
||||
```
|
||||
|
||||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0` right now).
|
||||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0` right now).
|
||||
|
||||
---
|
||||
|
||||
@@ -254,6 +332,9 @@ enum rgb_matrix_effects {
|
||||
RGB_MATRIX_RAINBOW_PINWHEELS, // Full dual gradients spinning two halfs of keyboard
|
||||
RGB_MATRIX_RAINDROPS, // Randomly changes a single key's hue
|
||||
RGB_MATRIX_JELLYBEAN_RAINDROPS, // Randomly changes a single key's hue and saturation
|
||||
RGB_MATRIX_HUE_BREATHING, // Hue shifts up a slight ammount at the same time, then shifts back
|
||||
RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
|
||||
RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
|
||||
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
|
||||
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
|
||||
RGB_MATRIX_DIGITAL_RAIN, // That famous computer simulation
|
||||
@@ -283,6 +364,7 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|
||||
|-------------------------------------------------------|-----------------------------------------------|
|
||||
|`#define DISABLE_RGB_MATRIX_ALPHAS_MODS` |Disables `RGB_MATRIX_ALPHAS_MODS` |
|
||||
|`#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN` |Disables `RGB_MATRIX_GRADIENT_UP_DOWN` |
|
||||
|`#define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT` |Disables `MATRIX_GRADIENT_LEFT_RIGHT` |
|
||||
|`#define DISABLE_RGB_MATRIX_BREATHING` |Disables `RGB_MATRIX_BREATHING` |
|
||||
|`#define DISABLE_RGB_MATRIX_BAND_SAT` |Disables `RGB_MATRIX_BAND_SAT` |
|
||||
|`#define DISABLE_RGB_MATRIX_BAND_VAL` |Disables `RGB_MATRIX_BAND_VAL` |
|
||||
@@ -293,20 +375,23 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_ALL` |Disables `RGB_MATRIX_CYCLE_ALL` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT` |Disables `RGB_MATRIX_CYCLE_LEFT_RIGHT` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN` |Disables `RGB_MATRIX_CYCLE_UP_DOWN` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |Disables `RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN` |Disables `RGB_MATRIX_CYCLE_OUT_IN` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL` |Disables `RGB_MATRIX_CYCLE_OUT_IN_DUAL` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |Disables `RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |
|
||||
|`#define DISABLE_RGB_MATRIX_DUAL_BEACON` |Disables `RGB_MATRIX_DUAL_BEACON` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL` |Disables `RGB_MATRIX_CYCLE_PINWHEEL` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_SPIRAL` |Disables `RGB_MATRIX_CYCLE_SPIRAL` |
|
||||
|`#define DISABLE_RGB_MATRIX_DUAL_BEACON` |Disables `RGB_MATRIX_DUAL_BEACON` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_BEACON` |Disables `RGB_MATRIX_RAINBOW_BEACON` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS` |Disables `RGB_MATRIX_RAINBOW_PINWHEELS` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINDROPS` |Disables `RGB_MATRIX_RAINDROPS` |
|
||||
|`#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Disables `RGB_MATRIX_JELLYBEAN_RAINDROPS` |
|
||||
|`#define DISABLE_RGB_MATRIX_HUE_BREATHING` |Disables `RGB_MATRIX_HUE_BREATHING` |
|
||||
|`#define DISABLE_RGB_MATRIX_HUE_PENDULUM` |Disables `RGB_MATRIX_HUE_PENDULUM` |
|
||||
|`#define DISABLE_RGB_MATRIX_HUE_WAVE ` |Disables `RGB_MATRIX_HUE_WAVE ` |
|
||||
|`#define DISABLE_RGB_MATRIX_TYPING_HEATMAP` |Disables `RGB_MATRIX_TYPING_HEATMAP` |
|
||||
|`#define DISABLE_RGB_MATRIX_DIGITAL_RAIN` |Disables `RGB_MATRIX_DIGITAL_RAIN` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE` |Disables `RGB_MATRIX_SOLID_REACTIVE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |Disables `RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE` |Disables `RGB_MATRIX_SOLID_REACTIVE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE` |Disables `RGB_MATRIX_SOLID_REACTIVE_WIDE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Disables `RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS` |Disables `RGB_MATRIX_SOLID_REACTIVE_CROSS` |
|
||||
@@ -391,7 +476,7 @@ static bool my_cool_effect2(effect_params_t* params) {
|
||||
#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
```
|
||||
|
||||
For inspiration and examples, check out the built-in effects under `quantum/rgb_matrix_animation/`
|
||||
For inspiration and examples, check out the built-in effects under `quantum/rgb_matrix_animations/`
|
||||
|
||||
|
||||
## Colors :id=colors
|
||||
@@ -427,9 +512,10 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
|
||||
```c
|
||||
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
|
||||
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
|
||||
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS // enable framebuffer effects
|
||||
#define RGB_DISABLE_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
|
||||
#define RGB_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
|
||||
#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
|
||||
#define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
|
||||
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
|
||||
@@ -439,11 +525,13 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
|
||||
#define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||
#define RGB_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
|
||||
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
||||
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||
```
|
||||
|
||||
## EEPROM storage :id=eeprom-storage
|
||||
|
||||
The EEPROM for it is currently shared with the RGBLIGHT system (it's generally assumed only one RGB would be used at a time), but could be configured to use its own 32bit address with:
|
||||
The EEPROM for it is currently shared with the LED Matrix system (it's generally assumed only one feature would be used at a time), but could be configured to use its own 32bit address with:
|
||||
|
||||
```c
|
||||
#define EECONFIG_RGB_MATRIX (uint32_t *)28
|
||||
|
@@ -74,6 +74,7 @@ Changing the **Value** sets the overall brightness.<br>
|
||||
|`RGB_MODE_XMAS` |`RGB_M_X` |Christmas animation mode |
|
||||
|`RGB_MODE_GRADIENT`|`RGB_M_G` |Static gradient animation mode |
|
||||
|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode |
|
||||
|`RGB_MODE_TWINKLE` |`RGB_M_TW`|Twinkle animation mode |
|
||||
|
||||
!> By default, if you have both the RGB Light and the [RGB Matrix](feature_rgb_matrix.md) feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
||||
|
||||
@@ -309,6 +310,18 @@ void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
}
|
||||
```
|
||||
|
||||
You can also use `rgblight_blink_layer_repeat` to specify the amount of times the layer is supposed to blink. Using the layers from above,
|
||||
```c
|
||||
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case DEBUG:
|
||||
rgblight_blink_layer_repeat(debug_enable ? 0 : 1, 200, 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
||||
|
||||
### Overriding RGB Lighting on/off status
|
||||
|
||||
Normally lighting layers are not shown when RGB Lighting is disabled (e.g. with `RGB_TOG` keycode). If you would like lighting layers to work even when the RGB Lighting is otherwise off, add `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF` to your `config.h`.
|
||||
@@ -359,9 +372,9 @@ rgblight_set(); // Utility functions do not call rgblight_set() automatically, s
|
||||
|
||||
Example:
|
||||
```c
|
||||
rgblight_sethsv(HSV_WHITE, 0); // led 0
|
||||
rgblight_sethsv(HSV_RED, 1); // led 1
|
||||
rgblight_sethsv(HSV_GREEN, 2); // led 2
|
||||
rgblight_sethsv_at(HSV_WHITE, 0); // led 0
|
||||
rgblight_sethsv_at(HSV_RED, 1); // led 1
|
||||
rgblight_sethsv_at(HSV_GREEN, 2); // led 2
|
||||
// The above functions automatically calls rgblight_set(), so there is no need to call it explicitly.
|
||||
// Note that it is inefficient to call repeatedly.
|
||||
```
|
||||
|
@@ -60,6 +60,7 @@ The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0/D1/D2/D3 (aka
|
||||
The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0/pin 3 and PD1/pin 2, respectively) between the two Pro Micros.
|
||||
|
||||
The pull-up resistors may be placed on either half. If you wish to use the halves independently, it is also possible to use 4 resistors and have the pull-ups in both halves.
|
||||
Note that the total resistance for the connected system should be within spec at 2.2k-10kOhm, with an 'ideal' at 4.7kOhm, regardless of the placement and number.
|
||||
|
||||
<img alt="sk-i2c-connection-mono" src="https://user-images.githubusercontent.com/2170248/92297182-92b98580-ef77-11ea-9d7d-d6033914af43.JPG" width="50%"/>
|
||||
|
||||
@@ -109,6 +110,10 @@ Normally, when a diode is connected to an intersection, it is judged to be left.
|
||||
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
|
||||
```
|
||||
|
||||
Note that adding a diode at a previously unused intersection will effectively tell the firmware that there is a key held down at that point. You can instruct qmk to ignore that intersection by defining `MATRIX_MASKED` and then defining a `matrix_row_t matrix_mask[MATRIX_ROWS]` array in your keyboard config. Each bit of a single value (starting form the least-significant bit) is used to tell qmk whether or not to pay attention to key presses at that intersection.
|
||||
|
||||
While `MATRIX_MASKED` isn't necessary to use `SPLIT_HAND_MATRIX_GRID` successfully, without it you may experience issues trying to suspend your computer with your keyboard attached as the matrix will always report at least one key-press.
|
||||
|
||||
#### Handedness by EEPROM
|
||||
|
||||
This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout.
|
||||
@@ -129,6 +134,12 @@ However, you'll have to flash the EEPROM files for the correct hand to each cont
|
||||
* `:dfu-util-split-left`
|
||||
* `:dfu-util-split-right`
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
make crkbd:default:avrdude-split-left
|
||||
```
|
||||
|
||||
This setting is not changed when re-initializing the EEPROM using the `EEP_RST` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox]()'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files.
|
||||
|
||||
You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common).
|
||||
@@ -239,7 +250,12 @@ This sets how many LEDs are directly connected to each controller. The first nu
|
||||
```c
|
||||
#define SPLIT_USB_DETECT
|
||||
```
|
||||
This option changes the startup behavior to detect an active USB connection when delegating master/slave. If this operation times out, then the half is assume to be a slave. This is the default behavior for ARM, and required for AVR Teensy boards (due to hardware limitations).
|
||||
|
||||
Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and theres's USB communication, then that half assumes it is the master, otherwise it assumes it is the slave.
|
||||
|
||||
Without this option, the master is the half that can detect voltage on the physical USB connection (VBUS detection).
|
||||
|
||||
Enabled by default on ChibiOS/ARM.
|
||||
|
||||
?> This setting will stop the ability to demo using battery packs.
|
||||
|
||||
@@ -255,9 +271,13 @@ This sets the poll frequency when detecting master/slave when using `SPLIT_USB_D
|
||||
|
||||
## Hardware Considerations and Mods
|
||||
|
||||
While most any Pro Micro can be used, micro controllers like the AVR Teensys and most (if not all) ARM boards require the Split USB Detect.
|
||||
Master/slave delegation is made either by detecting voltage on VBUS connection or waiting for USB communication (`SPLIT_USB_DETECT`). Pro Micro boards can use VBUS detection out of the box and be used with or without `SPLIT_USB_DETECT`.
|
||||
|
||||
However, with the Teensy 2.0 and Teensy++ 2.0, there is a simple hardware mod that you can perform to add VBUS detection, so you don't need the Split USB detection option.
|
||||
Many ARM boards, but not all, do not support VBUS detection. Because it is common that ARM boards lack VBUS detection, `SPLIT_USB_DETECT` is automatically defined on ARM targets (technically when ChibiOS is targetted).
|
||||
|
||||
### Teensy boards
|
||||
|
||||
Teensy boards lack VBUS detection out of the box and must have `SPLIT_USB_DETECT` defined. With the Teensy 2.0 and Teensy++ 2.0, there is a simple hardware mod that you can perform to add VBUS detection, so you don't need the `SPLIT_USB_DETECT` option.
|
||||
|
||||
You'll only need a few things:
|
||||
|
||||
|
@@ -7,7 +7,7 @@ The swap-hands action allows support for one-handed typing without requiring a s
|
||||
The configuration table is a simple 2-dimensional array to map from column/row to new column/row. Example `hand_swap_config` for Planck:
|
||||
|
||||
```C
|
||||
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
||||
const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
||||
{{11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
|
||||
{{11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
|
||||
{{11, 2}, {10, 2}, {9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}},
|
||||
|
@@ -76,7 +76,7 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
||||
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
|
||||
};
|
||||
|
||||
// Add tap dance item in place of a key code
|
||||
// Add tap dance item to your keymap in place of a keycode
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
// ...
|
||||
TD(TD_ESC_CAPS)
|
||||
@@ -206,20 +206,22 @@ You will need a few things that can be used for 'Quad Function Tap-Dance'.
|
||||
You'll need to add these to the top of your `keymap.c` file, before your keymap.
|
||||
|
||||
```c
|
||||
typedef enum {
|
||||
TD_NONE,
|
||||
TD_UNKNOWN,
|
||||
TD_SINGLE_TAP,
|
||||
TD_SINGLE_HOLD,
|
||||
TD_DOUBLE_TAP,
|
||||
TD_DOUBLE_HOLD,
|
||||
TD_DOUBLE_SINGLE_TAP, // Send two single taps
|
||||
TD_TRIPLE_TAP,
|
||||
TD_TRIPLE_HOLD
|
||||
} td_state_t;
|
||||
|
||||
typedef struct {
|
||||
bool is_press_action;
|
||||
uint8_t state;
|
||||
} tap;
|
||||
|
||||
enum {
|
||||
SINGLE_TAP = 1,
|
||||
SINGLE_HOLD,
|
||||
DOUBLE_TAP,
|
||||
DOUBLE_HOLD,
|
||||
DOUBLE_SINGLE_TAP, // Send two single taps
|
||||
TRIPLE_TAP,
|
||||
TRIPLE_HOLD
|
||||
};
|
||||
td_state_t state;
|
||||
} td_tap_t;
|
||||
|
||||
// Tap dance enums
|
||||
enum {
|
||||
@@ -227,7 +229,7 @@ enum {
|
||||
SOME_OTHER_DANCE
|
||||
};
|
||||
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state);
|
||||
|
||||
// For the x tap dance. Put it here so it can be used in any keymap
|
||||
void x_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||
@@ -261,61 +263,61 @@ Now, at the bottom of your `keymap.c` file, you'll need to add the following:
|
||||
* Letters used in common words as a double. For example 'p' in 'pepper'. If a tap dance function existed on the
|
||||
* letter 'p', the word 'pepper' would be quite frustating to type.
|
||||
*
|
||||
* For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested
|
||||
* For the third point, there does exist the 'TD_DOUBLE_SINGLE_TAP', however this is not fully tested
|
||||
*
|
||||
*/
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
if (state->count == 1) {
|
||||
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
||||
if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
|
||||
// Key has not been interrupted, but the key is still held. Means you want to send a 'HOLD'.
|
||||
else return SINGLE_HOLD;
|
||||
else return TD_SINGLE_HOLD;
|
||||
} else if (state->count == 2) {
|
||||
// DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
|
||||
// TD_DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
|
||||
// action when hitting 'pp'. Suggested use case for this return value is when you want to send two
|
||||
// keystrokes of the key, and not the 'double tap' action/macro.
|
||||
if (state->interrupted) return DOUBLE_SINGLE_TAP;
|
||||
else if (state->pressed) return DOUBLE_HOLD;
|
||||
else return DOUBLE_TAP;
|
||||
if (state->interrupted) return TD_DOUBLE_SINGLE_TAP;
|
||||
else if (state->pressed) return TD_DOUBLE_HOLD;
|
||||
else return TD_DOUBLE_TAP;
|
||||
}
|
||||
|
||||
// Assumes no one is trying to type the same letter three times (at least not quickly).
|
||||
// If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
|
||||
// an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
|
||||
// an exception here to return a 'TD_TRIPLE_SINGLE_TAP', and define that enum just like 'TD_DOUBLE_SINGLE_TAP'
|
||||
if (state->count == 3) {
|
||||
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
|
||||
else return TRIPLE_HOLD;
|
||||
} else return 8; // Magic number. At some point this method will expand to work for more presses
|
||||
if (state->interrupted || !state->pressed) return TD_TRIPLE_TAP;
|
||||
else return TD_TRIPLE_HOLD;
|
||||
} else return TD_UNKNOWN;
|
||||
}
|
||||
|
||||
// Create an instance of 'tap' for the 'x' tap dance.
|
||||
static tap xtap_state = {
|
||||
// Create an instance of 'td_tap_t' for the 'x' tap dance.
|
||||
static td_tap_t xtap_state = {
|
||||
.is_press_action = true,
|
||||
.state = 0
|
||||
.state = TD_NONE
|
||||
};
|
||||
|
||||
void x_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
xtap_state.state = cur_dance(state);
|
||||
switch (xtap_state.state) {
|
||||
case SINGLE_TAP: register_code(KC_X); break;
|
||||
case SINGLE_HOLD: register_code(KC_LCTRL); break;
|
||||
case DOUBLE_TAP: register_code(KC_ESC); break;
|
||||
case DOUBLE_HOLD: register_code(KC_LALT); break;
|
||||
case TD_SINGLE_TAP: register_code(KC_X); break;
|
||||
case TD_SINGLE_HOLD: register_code(KC_LCTRL); break;
|
||||
case TD_DOUBLE_TAP: register_code(KC_ESC); break;
|
||||
case TD_DOUBLE_HOLD: register_code(KC_LALT); break;
|
||||
// Last case is for fast typing. Assuming your key is `f`:
|
||||
// For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
|
||||
// In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
|
||||
case DOUBLE_SINGLE_TAP: tap_code(KC_X); register_code(KC_X);
|
||||
case TD_DOUBLE_SINGLE_TAP: tap_code(KC_X); register_code(KC_X);
|
||||
}
|
||||
}
|
||||
|
||||
void x_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||
switch (xtap_state.state) {
|
||||
case SINGLE_TAP: unregister_code(KC_X); break;
|
||||
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
|
||||
case DOUBLE_TAP: unregister_code(KC_ESC); break;
|
||||
case DOUBLE_HOLD: unregister_code(KC_LALT);
|
||||
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
|
||||
case TD_SINGLE_TAP: unregister_code(KC_X); break;
|
||||
case TD_SINGLE_HOLD: unregister_code(KC_LCTRL); break;
|
||||
case TD_DOUBLE_TAP: unregister_code(KC_ESC); break;
|
||||
case TD_DOUBLE_HOLD: unregister_code(KC_LALT);
|
||||
case TD_DOUBLE_SINGLE_TAP: unregister_code(KC_X);
|
||||
}
|
||||
xtap_state.state = 0;
|
||||
xtap_state.state = TD_NONE;
|
||||
}
|
||||
|
||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||
@@ -343,9 +345,11 @@ enum td_keycodes {
|
||||
|
||||
// Define a type containing as many tapdance states as you need
|
||||
typedef enum {
|
||||
SINGLE_TAP,
|
||||
SINGLE_HOLD,
|
||||
DOUBLE_SINGLE_TAP
|
||||
TD_NONE,
|
||||
TD_UNKNOWN,
|
||||
TD_SINGLE_TAP,
|
||||
TD_SINGLE_HOLD,
|
||||
TD_DOUBLE_SINGLE_TAP
|
||||
} td_state_t;
|
||||
|
||||
// Create a global instance of the tapdance state type
|
||||
@@ -354,7 +358,7 @@ static td_state_t td_state;
|
||||
// Declare your tapdance functions:
|
||||
|
||||
// Function to determine the current tapdance state
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state);
|
||||
|
||||
// `finished` and `reset` functions for each tapdance keycode
|
||||
void altlp_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||
@@ -365,14 +369,14 @@ Below your `LAYOUT`, define each of the tapdance functions:
|
||||
|
||||
```c
|
||||
// Determine the tapdance state to return
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
if (state->count == 1) {
|
||||
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
||||
else return SINGLE_HOLD;
|
||||
if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
|
||||
else return TD_SINGLE_HOLD;
|
||||
}
|
||||
|
||||
if (state->count == 2) return DOUBLE_SINGLE_TAP;
|
||||
else return 3; // Any number higher than the maximum state value you return above
|
||||
if (state->count == 2) return TD_DOUBLE_SINGLE_TAP;
|
||||
else return TD_UNKNOWN; // Any number higher than the maximum state value you return above
|
||||
}
|
||||
|
||||
// Handle the possible states for each tapdance keycode you define:
|
||||
@@ -380,13 +384,13 @@ uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
void altlp_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
td_state = cur_dance(state);
|
||||
switch (td_state) {
|
||||
case SINGLE_TAP:
|
||||
case TD_SINGLE_TAP:
|
||||
register_code16(KC_LPRN);
|
||||
break;
|
||||
case SINGLE_HOLD:
|
||||
case TD_SINGLE_HOLD:
|
||||
register_mods(MOD_BIT(KC_LALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
|
||||
break;
|
||||
case DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
|
||||
case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
|
||||
tap_code16(KC_LPRN);
|
||||
register_code16(KC_LPRN);
|
||||
}
|
||||
@@ -394,13 +398,13 @@ void altlp_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
|
||||
void altlp_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||
switch (td_state) {
|
||||
case SINGLE_TAP:
|
||||
case TD_SINGLE_TAP:
|
||||
unregister_code16(KC_LPRN);
|
||||
break;
|
||||
case SINGLE_HOLD:
|
||||
case TD_SINGLE_HOLD:
|
||||
unregister_mods(MOD_BIT(KC_LALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
|
||||
break;
|
||||
case DOUBLE_SINGLE_TAP:
|
||||
case TD_DOUBLE_SINGLE_TAP:
|
||||
unregister_code16(KC_LPRN);
|
||||
}
|
||||
}
|
||||
@@ -420,17 +424,19 @@ Tap Dance can be used to mimic MO(layer) and TG(layer) functionality. For this e
|
||||
The first step is to include the following code towards the beginning of your `keymap.c`:
|
||||
|
||||
```c
|
||||
// Define a type for as many tap dance states as you need
|
||||
typedef enum {
|
||||
TD_NONE,
|
||||
TD_UNKNOWN,
|
||||
TD_SINGLE_TAP,
|
||||
TD_SINGLE_HOLD,
|
||||
TD_DOUBLE_TAP
|
||||
} td_state_t;
|
||||
|
||||
typedef struct {
|
||||
bool is_press_action;
|
||||
uint8_t state;
|
||||
} tap;
|
||||
|
||||
// Define a type for as many tap dance states as you need
|
||||
enum {
|
||||
SINGLE_TAP = 1,
|
||||
SINGLE_HOLD,
|
||||
DOUBLE_TAP
|
||||
};
|
||||
td_state_t state;
|
||||
} td_tap_t;
|
||||
|
||||
enum {
|
||||
QUOT_LAYR, // Our custom tap dance key; add any other tap dance keys to this enum
|
||||
@@ -439,7 +445,7 @@ enum {
|
||||
// Declare the functions to be used with your tap dance key(s)
|
||||
|
||||
// Function associated with all tap dances
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state);
|
||||
|
||||
// Functions associated with individual tap dances
|
||||
void ql_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||
@@ -450,31 +456,31 @@ Towards the bottom of your `keymap.c`, include the following code:
|
||||
|
||||
```c
|
||||
// Determine the current tap dance state
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
if (state->count == 1) {
|
||||
if (!state->pressed) return SINGLE_TAP;
|
||||
else return SINGLE_HOLD;
|
||||
} else if (state->count == 2) return DOUBLE_TAP;
|
||||
else return 8;
|
||||
if (!state->pressed) return TD_SINGLE_TAP;
|
||||
else return TD_SINGLE_HOLD;
|
||||
} else if (state->count == 2) return TD_DOUBLE_TAP;
|
||||
else return TD_UNKNOWN;
|
||||
}
|
||||
|
||||
// Initialize tap structure associated with example tap dance key
|
||||
static tap ql_tap_state = {
|
||||
static td_tap_t ql_tap_state = {
|
||||
.is_press_action = true,
|
||||
.state = 0
|
||||
.state = TD_NONE
|
||||
};
|
||||
|
||||
// Functions that control what our tap dance key does
|
||||
void ql_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
ql_tap_state.state = cur_dance(state);
|
||||
switch (ql_tap_state.state) {
|
||||
case SINGLE_TAP:
|
||||
case TD_SINGLE_TAP:
|
||||
tap_code(KC_QUOT);
|
||||
break;
|
||||
case SINGLE_HOLD:
|
||||
case TD_SINGLE_HOLD:
|
||||
layer_on(_MY_LAYER);
|
||||
break;
|
||||
case DOUBLE_TAP:
|
||||
case TD_DOUBLE_TAP:
|
||||
// Check to see if the layer is already set
|
||||
if (layer_state_is(_MY_LAYER)) {
|
||||
// If already set, then switch it off
|
||||
@@ -489,10 +495,10 @@ void ql_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
|
||||
void ql_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||
// If the key was held down and now is released then switch off the layer
|
||||
if (ql_tap_state.state == SINGLE_HOLD) {
|
||||
if (ql_tap_state.state == TD_SINGLE_HOLD) {
|
||||
layer_off(_MY_LAYER);
|
||||
}
|
||||
ql_tap_state.state = 0;
|
||||
ql_tap_state.state = TD_NONE;
|
||||
}
|
||||
|
||||
// Associate our tap dance key with its functionality
|
||||
@@ -505,7 +511,7 @@ The above code is similar to that used in previous examples. The one point to no
|
||||
|
||||
The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
|
||||
|
||||
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
|
||||
The `case: TD_SINGLE_TAP` in `ql_finished` is similar to the above examples. The `TD_SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `TD_DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
|
||||
|
||||
`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (\~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
|
||||
|
||||
|
@@ -126,6 +126,8 @@ The following input modes are available:
|
||||
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
|
||||
By default, this mode uses Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) to start Unicode input, but this can be changed by defining [`UNICODE_KEY_LNX`](#input-key-configuration) with a different keycode. This might be required for IBus versions ≥1.5.15, where Ctrl+Shift+U behavior is consolidated into Ctrl+Shift+E.
|
||||
|
||||
Users who wish support in non-GTK apps without IBus may need to resort to a more indirect method, such as creating a custom keyboard layout ([more on this method](#custom-linux-layout)).
|
||||
|
||||
* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
|
||||
|
||||
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Reboot afterwards.
|
||||
@@ -228,7 +230,7 @@ send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
|
||||
|
||||
Example uses include sending Unicode strings when a key is pressed, as described in [Macros](feature_macros.md).
|
||||
|
||||
### `send_unicode_hex_string()`
|
||||
### `send_unicode_hex_string()` (Deprecated)
|
||||
|
||||
Similar to `send_unicode_string()`, but the characters are represented by their Unicode code points, written in hexadecimal and separated by spaces. For example, the table flip above would be achieved with:
|
||||
|
||||
@@ -270,3 +272,22 @@ AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
|
||||
|
||||
If you enable the US International layout on the system, it will use punctuation to accent the characters. For instance, typing "\`a" will result in à.
|
||||
You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout).
|
||||
|
||||
## Software keyboard layout on Linux :id=custom-linux-layout
|
||||
|
||||
This method does not require Unicode support on the keyboard itself but instead uses a custom keyboard layout for Xorg. This is how special characters are inserted by regular keyboards. This does not require IBus and works in practically all software. Help on creating a custom layout can be found [here](https://www.linux.com/news/creating-custom-keyboard-layouts-x11-using-xkb/), [here](http://karols.github.io/blog/2013/11/18/creating-custom-keyboard-layouts-for-linux/) and [here](https://wiki.archlinux.org/index.php/X_keyboard_extension). An example of how you could edit the `us` layout to gain 🤣 on `RALT(KC_R)`:
|
||||
|
||||
Edit the keyboard layout file `/usr/share/X11/xkb/symbols/us`.
|
||||
|
||||
Inside `xkb_symbols "basic" {`, add `include "level3(ralt_switch)"`.
|
||||
|
||||
Find the line defining the R key and add an entry to the list, making it look like this:
|
||||
```
|
||||
key <AD04> { [ r, R, U1F923 ] };
|
||||
```
|
||||
|
||||
Save the file and run the command `setxkbmap us` to reload the layout.
|
||||
|
||||
You can define one custom character for key defined in the layout, and another if you populate the fourth layer. Additional layers up to 8th are also possible.
|
||||
|
||||
This method is specific to the computer on which you set the custom layout. The custom keys will be available only when Xorg is running. To avoid accidents, you should always reload the layout using `setxkbmap`, otherwise an invalid layout could prevent you from logging into your system, locking you out.
|
||||
|
@@ -1,25 +1,62 @@
|
||||
# Word Per Minute (WPM) Calculcation
|
||||
|
||||
The WPM feature uses time between keystrokes to compute a rolling average words
|
||||
per minute rate and makes this available for various uses.
|
||||
The WPM feature uses time between keystrokes to compute a rolling average words per minute rate and makes this available for various uses.
|
||||
|
||||
Enable the WPM system by adding this to your `rules.mk`:
|
||||
|
||||
WPM_ENABLE = yes
|
||||
|
||||
For split keyboards using soft serial, the computed WPM
|
||||
score will be available on the master AND slave half.
|
||||
For split keyboards using soft serial, the computed WPM score will be available on the master AND slave half.
|
||||
|
||||
## Configuration
|
||||
|
||||
|Define |Default | Description |
|
||||
|-----------------------------|--------------|------------------------------------------------------------------------------------------|
|
||||
|`WPM_SMOOTHING` |`0.0487` | Sets the smoothing to about 40 keystrokes |
|
||||
|`WPM_ESTIMATED_WORD_SIZE` |`5` | This is the value used when estimating average word size (for regression and normal use) |
|
||||
|`WPM_ALLOW_COUNT_REGRESSOIN` |_Not defined_ | If defined allows the WPM to be decreased when hitting Delete or Backspace |
|
||||
## Public Functions
|
||||
|
||||
`uint8_t get_current_wpm(void);`
|
||||
This function returns the current WPM as an unsigned integer.
|
||||
|Function |Description |
|
||||
|--------------------------|--------------------------------------------------|
|
||||
|`get_current_wpm(void)` | Returns the current WPM as a value between 0-255 |
|
||||
|`set_current_wpm(x)` | Sets the current WPM to `x` (between 0-255) |
|
||||
|
||||
## Callbacks
|
||||
|
||||
## Customized keys for WPM calc
|
||||
By default, the WPM score only includes letters, numbers, space and some punctuation. If you want to change the set of characters considered as part of the WPM calculation, you can implement your own `bool wpm_keycode_user(uint16_t keycode)` and return true for any characters you would like included in the calculation, or false to not count that particular keycode.
|
||||
|
||||
By default, the WPM score only includes letters, numbers, space and some
|
||||
punctuation. If you want to change the set of characters considered as part of
|
||||
the WPM calculation, you can implement `wpm_keycode_user(uint16_t keycode)`
|
||||
and return true for any characters you would like included in the calculation,
|
||||
or false to not count that particular keycode.
|
||||
For instance, the default is:
|
||||
|
||||
```c
|
||||
bool wpm_keycode_user(uint16_t keycode) {
|
||||
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
|
||||
keycode = keycode & 0xFF;
|
||||
} else if (keycode > 0xFF) {
|
||||
keycode = 0;
|
||||
}
|
||||
if ((keycode >= KC_A && keycode <= KC_0) || (keycode >= KC_TAB && keycode <= KC_SLASH)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
Additionally, if `WPM_ALLOW_COUNT_REGRESSION` is defined, there is the `uint8_t wpm_regress_count(uint16_t keycode)` function that allows you to decrease the WPM. This is useful if you want to be able to penalize certain keycodes (or even combinations).
|
||||
|
||||
__attribute__((weak)) uint8_t wpm_regress_count(uint16_t keycode) {
|
||||
bool weak_modded = (keycode >= QK_LCTL && keycode < QK_LSFT) || (keycode >= QK_RCTL && keycode < QK_RSFT);
|
||||
|
||||
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
|
||||
keycode = keycode & 0xFF;
|
||||
} else if (keycode > 0xFF) {
|
||||
keycode = 0;
|
||||
}
|
||||
if (((get_mods() | get_oneshot_mods()) & MOD_MASK_CTRL} || weak_modded) && (keycode == KC_DEL || keycode == KC_BSPC)) {
|
||||
return WPM_ESTIMATED_WORD_SIZE;
|
||||
}
|
||||
if (keycode == KC_DEL || keycode == KC_BSPC) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@@ -249,3 +249,29 @@ Flashing sequence:
|
||||
2. Wait for the OS to detect the device
|
||||
3. Flash a .bin file
|
||||
4. Reset the device into application mode (may be done automatically)
|
||||
|
||||
## tinyuf2
|
||||
|
||||
Keyboards may opt into supporting the tinyuf2 bootloader. This is currently only supported on the F411 blackpill.
|
||||
|
||||
The `rules.mk` setting for this bootloader is `tinyuf2`, and can be specified at the keymap or user level.
|
||||
|
||||
To ensure compatibility with the tinyuf2 bootloader, make sure this block is present in your `rules.mk`:
|
||||
|
||||
```make
|
||||
# Bootloader selection
|
||||
BOOTLOADER = tinyuf2
|
||||
```
|
||||
|
||||
Compatible flashers:
|
||||
|
||||
* Any application able to copy a file from one place to another, such as _macOS Finder_ or _Windows Explorer_.
|
||||
|
||||
Flashing sequence:
|
||||
|
||||
1. Enter the bootloader using any of the following methods:
|
||||
* Tap the `RESET` keycode
|
||||
* Double-tap the `nRST` button on the PCB.
|
||||
2. Wait for the OS to detect the device
|
||||
3. Copy the .uf2 file to the new USB disk
|
||||
4. Wait for the keyboard to become available
|
||||
|
@@ -4,8 +4,9 @@ This project includes a Docker workflow that will allow you to build a new firmw
|
||||
|
||||
## Requirements
|
||||
|
||||
The main prerequisite is a working `docker` install.
|
||||
The main prerequisite is a working `docker` or `podman` install.
|
||||
* [Docker CE](https://docs.docker.com/install/#supported-platforms)
|
||||
* [Podman](https://podman.io/getting-started/installation)
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -38,6 +39,13 @@ util/docker_build.sh
|
||||
# Reads parameters as input (leave blank for all keyboards/keymaps)
|
||||
```
|
||||
|
||||
You can manually set which container runtime you want to use by setting the `RUNTIME` environment variable to it's name or path.
|
||||
By default docker or podman are automatically detected and docker is preferred over podman.
|
||||
|
||||
```bash
|
||||
RUNTIME="podman" util/docker_build.sh keyboard:keymap:target
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
### Why can't I flash on Windows/macOS
|
||||
|
@@ -22,8 +22,8 @@ The `<target>` means the following
|
||||
|
||||
The following targets are for developers:
|
||||
|
||||
* `show-path` shows the path of the source and object files.
|
||||
* `dump-vars` dumps the makefile variable.
|
||||
* `show_path` shows the path of the source and object files.
|
||||
* `dump_vars` dumps the makefile variable.
|
||||
* `objs-size` displays the size of individual object files.
|
||||
* `show_build_options` shows the options set in 'rules.mk'.
|
||||
* `check-md5` displays the md5 checksum of the generated binary file.
|
||||
|
@@ -155,6 +155,7 @@
|
||||
* [QMK への貢献](ja/contributing.md)
|
||||
* [QMK ドキュメントの翻訳](ja/translating.md)
|
||||
* [設定オプション](ja/config_options.md)
|
||||
* [データ駆動型コンフィギュレーション](ja/data_driven_config.md)
|
||||
* [Make ドキュメント](ja/getting_started_make_guide.md)
|
||||
* [ドキュメント ベストプラクティス](ja/documentation_best_practices.md)
|
||||
* [ドキュメント テンプレート](ja/documentation_templates.md)
|
||||
|
@@ -33,8 +33,11 @@ QMK は十分な容量のフラッシュメモリを備えた USB 対応 AVR ま
|
||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
||||
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
||||
* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
|
||||
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
||||
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
||||
* [STM32L433](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||
* [STM32L443](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# キーボードの挙動をカスタマイズする方法
|
||||
|
||||
<!---
|
||||
original document: 0.10.52:docs/custom_quantum_functions.md
|
||||
git diff 0.10.52 HEAD -- docs/custom_quantum_functions.md | cat
|
||||
original document: 0.12.41:docs/custom_quantum_functions.md
|
||||
git diff 0.12.41 HEAD -- docs/custom_quantum_functions.md | cat
|
||||
-->
|
||||
|
||||
多くの人にとって、カスタムキーボードはボタンの押下をコンピュータに送信するだけではありません。単純なボタンの押下やマクロよりも複雑なことを実行できるようにしたいでしょう。QMK にはコードを挿入したり、機能を上書きしたり、様々な状況でキーボードの挙動をカスタマイズできるフックがあります。
|
||||
@@ -190,6 +190,14 @@ void keyboard_post_init_user(void) {
|
||||
|
||||
カスタムマトリックススキャンコードが必要な場合は、この関数を使う必要があります。また、カスタムステータス出力 (LED あるいはディスプレイなど)や、ユーザが入力していない場合でも定期的にトリガーするその他の機能のために使うことができます。
|
||||
|
||||
# キーボードハウスキーピング :id=keyboard-housekeeping
|
||||
|
||||
* キーボード/リビジョン: `void housekeeping_task_kb(void)`
|
||||
* キーマップ: `void housekeeping_task_user(void)`
|
||||
|
||||
この関数は、全ての QMK 処理の最後に、次の繰り返しを開始する前に呼び出されます。`housekeeping_task_*` の関数が呼び出された時点で、QMK が最後のマトリックススキャンを処理したと、安全に見なすことができます -- レイヤーの状態が更新され、USB レポートが送信され、LED が更新され、表示が描画されています。
|
||||
|
||||
`matrix_scan_*` と同様に、これらは MCU が処理できる頻度で呼び出されます。キーボードの応答性を維持するために、これらの関数の呼び出し中にできるだけ何もしないことをお勧めします。実際に何か特別なものを実装する必要がある場合に動作を停止させる可能性があります。
|
||||
|
||||
# キーボードアイドリング/ウェイクコード
|
||||
|
||||
|
123
docs/ja/data_driven_config.md
Normal file
123
docs/ja/data_driven_config.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# データ駆動型コンフィギュレーション
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: 0.12.7:docs/data_driven_config.md
|
||||
git diff 0.12.7 HEAD -- docs/data_driven_config.md | cat
|
||||
-->
|
||||
|
||||
このページでは、QMK のデータ駆動型 JSON コンフィギュレーションシステムがどのように動作するかを説明します。これは、QMK 自体に取り組みたい開発者を対象としています。
|
||||
|
||||
## ヒストリー
|
||||
|
||||
これまで、QMK は、`rules.mk` と `config.h` の2つのメカニズムを組み合わせてコンフィギュレーションされてきました。
|
||||
この方法は、QMK がほんの一握りのキーボードをサポートしていたときは上手く機能していましたが、今では、サポートするキーボードは1500近くまで成長しました。
|
||||
`keyboards` の下だけで6000個の設定ファイルがあることが推定されます。
|
||||
これらのファイルの自由形式の性質と、重複を避けるために人々が使用してきたユニークなパターンが継続的なメンテナンスを困難にしており、また、多くのキーボードが時代遅れで時には理解が難しいパターンに従っています。
|
||||
|
||||
また、CLI に慣れていない人に QMK のパワーを提供することにも取り組んでおり、VIA などの他のプロジェクトでは、プログラムをインストールするのと同じくらい簡単に QMK を使用できるように取り組んでいます。
|
||||
これらのツールには、ユーザーが QMK を最大限に活用できるように、キーボードのレイアウト方法や使用可能なピンと機能に関する情報が必要です。
|
||||
その第一歩として `info.json` を導入しました。
|
||||
QMK API は、これら3つの情報源(`config.h`、` rules.mk`、および `info.json`)を、エンドユーザーツールが使用できる信頼できる単一の情報源に結合するための取り組みです。
|
||||
|
||||
これで、`info.json`から `rules.mk` と `config.h` の値を生成することがサポートされ、信頼できる単一の情報源を持つことができます。
|
||||
これにより、自動化されたツールを使用してキーボードを保守できるため、時間と保守作業を大幅に節約できます。
|
||||
|
||||
## 概要
|
||||
|
||||
C 側では何も変わりません。
|
||||
新しいルールを作成したり、定義したりする必要がある場合は、同じプロセスに従います。
|
||||
|
||||
1. `docs/config_options.md` に追加します。
|
||||
1. 適切なコアファイルにデフォルトを設定します。
|
||||
1. 必要に応じて ifdef 文を追加します。
|
||||
|
||||
次に、新しい構成のサポートを `info.json` に追加する必要があります。
|
||||
基本的なプロセスは次のとおりです。
|
||||
|
||||
1. `data/schemas/keyboards.jsonschema` のスキーマに追加します
|
||||
1. `data/maps` にマッピングを追加します
|
||||
1. (オプションおよび非推奨)構成を抽出/生成するコードを追加します。
|
||||
* `lib/python/qmk/info.py`
|
||||
* `lib/python/qmk/cli/generate/config_h.py`
|
||||
* `lib/python/qmk/cli/generate/rules_mk.py`
|
||||
|
||||
## info.json にオプションを追加する
|
||||
|
||||
このセクションでは、info.json に `config.h`/`rules.mk` の値のサポートを追加することについて説明します。
|
||||
|
||||
### スキーマに追加する
|
||||
|
||||
QMK では、[jsonschema](https:json-schema.org) のファイルを `data/schemas` に保持しています。
|
||||
キーボード固有の `info.json` ファイルに入る値は `keyboard.jsonschema` に保持されています。
|
||||
エンドユーザーが編集できるようにしたい値はすべてここに入れなければなりません。
|
||||
|
||||
場合によっては、新しいトップレベルキーを追加するだけで済みます。
|
||||
従うべきいくつかの例は、 `keyboard_name`、`maintainer`、 `processor`、および `url` です。
|
||||
これは、オプションが自己完結型で、他のオプションと直接関係がない場合に適しています。
|
||||
|
||||
その他の場合、1つの `object` の中に、似ているオプションを集める必要があります。
|
||||
これは、機能のサポートを追加する場合に特に当てはまります。
|
||||
このために従うべきいくつかの例は、`indicators`、`matrix_pins`、および `rgblight` です。
|
||||
新しいオプションを統合する方法がわからない場合は、[問題を開く](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=)か、[Discord で #cli に参加](https://discord.gg/heQPAgy)して、そこで会話を始めてください。
|
||||
|
||||
### マッピングを追加する
|
||||
|
||||
ほとんどの場合、単純なマッピングを追加することができます。
|
||||
これらは `data/mappings/info_config.json` と `data/mappings/info_rules.json` に JSON ファイルとして保持され、それぞれ `config.h` と `rules.mk` のマッピングを制御します。
|
||||
各マッピングは `config.h` または `rules.mk` 変数名をキーとし、値は以下のキーを持つハッシュです。
|
||||
|
||||
* `info_key`: (必須)この値の `info.json` 内の場所。 下記参照。
|
||||
* `value_type`: (オプション)デフォルトは `str`。 この変数の値の形式。 下記参照。
|
||||
* `to_json`: (オプション)デフォルトは `true`。 このマッピングを info.json から除外するには、`false` に設定します
|
||||
* `to_c`: (オプション)デフォルトは `true`。 このマッピングを config.h から除外するには、`false` に設定します
|
||||
* `warn_duplicate`: (オプション)デフォルトは `true`。 値が両方の場所に存在する場合に警告をオフにするには、`false` に設定します
|
||||
|
||||
#### Info Key
|
||||
|
||||
info.json 内の変数をアドレス指定するために JSON ドット表記を使用します。
|
||||
たとえば、`info_json["rgblight"]["split_count"]` にアクセスするには、`rgblight.split_count` を指定します。
|
||||
これにより、深くネストされたキーを単純な文字列でアドレス指定できます。
|
||||
|
||||
内部では [Dotty Dict](https://dotty-dict.readthedocs.io/en/latest/) を使用しています。これらの文字列がオブジェクトアクセスに変換される方法についてはそのドキュメントを参照してください。
|
||||
|
||||
#### Value Types
|
||||
|
||||
デフォルトでは、すべての値を単純な文字列として扱います。
|
||||
値がより複雑な場合は、次のいずれかのタイプを使用してデータをインテリジェントに解析できます。
|
||||
|
||||
* `array`: 文字列のコンマ区切りの配列
|
||||
* `array.int`: 整数のコンマ区切り配列
|
||||
* `int`: 整数
|
||||
* `hex`: 16進数としてフォーマットされた数値
|
||||
* `list`: 文字列のスペース区切りの配列
|
||||
* `mapping`: キーと値のペアのハッシュ
|
||||
|
||||
### 抽出するコードを追加する
|
||||
|
||||
ほとんどのユースケースは、上記のマッピングファイルによって解決できます。
|
||||
できない場合は、代わりに設定値を抽出するコードを書くことができます。
|
||||
|
||||
QMK が完全な `info.json` を生成するときはいつでも、`config.h` と `rules.mk` から情報を抽出します。
|
||||
あなたの新しい設定値のためのコードを `lib/python/qmk/info.py` に追加する必要があります。
|
||||
通常、これは、新しい `_extract_<feature>()` 関数を追加してから、 `_extract_config_h()` または `_extract_rules_mk()` のいずれかで関数を呼び出すことを意味します。
|
||||
|
||||
このファイルの編集方法がわからない場合、または Python に慣れていない場合は、[issue を開く](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=)か [Discord で #cli に参加](https://discord.gg/heQPAgy)すると、この部分を誰かが手伝ってくれるでしょう。
|
||||
|
||||
### 生成するコードを追加する
|
||||
|
||||
パズルの最後のピースは、ビルドシステムに新しいオプションを提供することです。
|
||||
これは、2つのファイルを生成することによって行われます。
|
||||
|
||||
* `.build/obj_<keyboard>/src/info_config.h`
|
||||
* `.build/obj_<keyboard>/src/rules.mk`
|
||||
|
||||
この2つのファイルは、次のコードによって生成されます。
|
||||
|
||||
* `lib/python/qmk/cli/generate/config_h.py`
|
||||
* `lib/python/qmk/cli/generate/rules_mk.py`
|
||||
|
||||
`config.h`値の場合、ルール用の関数を記述し、その関数を `generate_config_h()` で呼び出す必要があります。
|
||||
|
||||
`rules.mk` の新しいトップレベルの `info.json` キーがある場合は、`lib/python/qmk/cli/generate/rules_mk.py` の上部にある `info_to_rules` にキーを追加するだけです。
|
||||
それ以外の場合は、`generate_rules_mk()` で機能の新しい if ブロックを作成する必要があります。
|
@@ -1,8 +1,8 @@
|
||||
# レイヤー :id=layers
|
||||
|
||||
<!---
|
||||
original document: 0.9.43:docs/feature_layers.md
|
||||
git diff 0.9.43 HEAD -- docs/feature_layers.md | cat
|
||||
original document: 0.12.41:docs/feature_layers.md
|
||||
git diff 0.12.41 HEAD -- docs/feature_layers.md | cat
|
||||
-->
|
||||
|
||||
QMK ファームウェアの最も強力で良く使われている機能の一つは、レイヤーを使う機能です。ほとんどの人にとって、これはラップトップやタブレットキーボードにあるのと同じように、様々なキーを可能にするファンクションキーに相当します。
|
||||
@@ -24,12 +24,10 @@ QMK ファームウェアの最も強力で良く使われている機能の一
|
||||
|
||||
### 注意事項 :id=caveats
|
||||
|
||||
現在のところ、`LT()` と `MT()` は[基本的なキーコードセット](ja/keycodes_basic.md)に制限されています。つまり、`LCTL()`、`KC_TILD` あるいは `0xFF` より大きなキーコードを使うことができません。特に、`LT` と `MT` のような二重の機能キーは16ビットキーコードを使います。4ビットは機能の識別のために使われ、次の12ビットはパラメータに分かれます。レイヤータップはレイヤーに4ビットを使います(実はレイヤータップがレイヤー 0-15 に制限されている理由です)。モッドタップも同じですが、識別子に4ビット、モッドのために4ビットが使われ、全体でキーコードに8ビットを使います。このため、使用されるキーコードは `0xFF` (0-255) に制限され、基本的なキーコードのみです。
|
||||
現在のところ、`LT()` の `layer` 引数はレイヤー 0-15 に制限され、`kc` 引数は[基本的なキーコードセット](ja/keycodes_basic.md)に制限されています。つまり、`LCTL()`、`KC_TILD` あるいは `0xFF` より大きなキーコードを使うことができません。これは、QMK が16ビットのキーコードを使うためです。4ビットは機能の識別のために使われ、4ビットはレイヤーのために使われ、キーコードには8ビットしか残されていません。
|
||||
|
||||
これを拡張してもせいぜい複雑になるだけでしょう。32ビットキーコードに移行すると、これの多くが解決されますが、キーマップマトリックスが使用する領域が2倍になります。また、問題が起きる可能性もあります。タップしたキーコードにモディファイアを適用する必要がある場合は、[タップダンス](ja/feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys)を使うことができます。
|
||||
|
||||
さらに、モッドタップあるいはレイヤータップで少なくとも1つの右手用のモディファイアが指定された場合、指定された全てのモディファイアが右手用になるため、2つをうまく組み合わせて一致させることはできません。
|
||||
|
||||
## レイヤーとの連携 :id=working-with-layers
|
||||
|
||||
レイヤーを切り替える時は注意してください。(キーボードを取り外さずに)そのレイヤーを非アクティブにすることができずレイヤーから移動できなくなる可能性があります。最も一般的な問題を避けるためのガイドラインを作成しました。
|
||||
|
@@ -76,7 +76,7 @@ I2C IS31FL3731 RGB コントローラを使ったアドレス指定可能な LED
|
||||
カスタムレイヤー効果は `<keyboard>.c` 内で以下を定義することで行うことができます:
|
||||
|
||||
void led_matrix_indicators_kb(void) {
|
||||
led_matrix_set_index_value(index, value);
|
||||
led_matrix_set_value(index, value);
|
||||
}
|
||||
|
||||
同様の関数がキーマップ内で `led_matrix_indicators_user` として動作します。
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# ポインティングデバイス :id=pointing-device
|
||||
|
||||
<!---
|
||||
original document: 0.9.43:docs/feature_pointing_device.md
|
||||
git diff 0.9.43 HEAD -- docs/feature_pointing_device.md | cat
|
||||
original document: 0.12.41:docs/feature_pointing_device.md
|
||||
git diff 0.12.41 HEAD -- docs/feature_pointing_device.md | cat
|
||||
-->
|
||||
|
||||
ポインティングデバイスは汎用的な機能の総称です: システムポインタを移動します。マウスキーのような他のオプションも確かにありますが、これは簡単に変更可能で軽量であることを目指しています。機能を制御するためにカスタムキーを実装したり、他の周辺機器から情報を収集してここに直接挿入したりできます - QMK に処理を任せてください。
|
||||
@@ -24,7 +24,7 @@ report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つ
|
||||
* `mouseReport.y` - これは、y軸の動き(+ 上へ、- 下へ)を表す -127 から 127 (128ではなく、USB HID 仕様で定義されています)の符号付き整数です。
|
||||
* `mouseReport.v` - これは、垂直スクロール(+ 上へ、- 下へ)を表す -127 から 127 (128ではなく、USB HID 仕様で定義されています)の符号付き整数です。
|
||||
* `mouseReport.h` - これは、水平スクロール(+ 右へ、- 左へ)を表す -127 から 127 (128ではなく、USB HID 仕様で定義されています)の符号付き整数です。
|
||||
* `mouseReport.buttons` - これは uint8_t で、上位の5ビットを使っています。これらのビットはマウスボタンの状態を表します - ビット 3 はマウスボタン 5、ビット 7 はマウスボタン 1 です。
|
||||
* `mouseReport.buttons` - これは uint8_t で、8ビット全てを使っています。これらのビットはマウスボタンの状態を表します - ビット 0 はマウスボタン 1、ビット 7 はマウスボタン 8 です。
|
||||
|
||||
マウスレポートに必要な変更を行ったら、それを送信する必要があります:
|
||||
|
||||
@@ -32,6 +32,10 @@ report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つ
|
||||
|
||||
マウスレポートが送信されると、x、y、v、h のいずれの値も 0 に設定されます (これは `pointing_device_send()` で行われます。この挙動を回避するためにオーバーライドすることができます)。このように、ボタンの状態は持続しますが、動きは1度だけ起こります。さらにカスタマイズするために、`pointing_device_init` と `pointing_device_task` のどちらもオーバーライドすることができます。
|
||||
|
||||
さらに、デフォルトでは、`pointing_device_send()` はレポートが実際に変更された場合のみレポートを送信します。これにより、マウスレポートが継続的に送信されてホストシステムが起動されたままになることを防ぎます。この動作は、独自の `pointing_device_send()` 関数を作成することで変更できます。
|
||||
|
||||
また、`has_mouse_report_changed(new, old)` 関数を使って、レポートが変更されたかどうかを確認できます。(訳注:独自の `pointing_device_send()` 関数を作成する場合でも、その中で `has_mouse_report_changed(new, old)` 関数でチェックして、デフォルトの `pointing_device_send()` と類似の無駄なレポートの抑制をして、ホストシステムがスリープ状態に入れる余地を残すようにしておくのが良いでしょう。)
|
||||
|
||||
以下の例では、カスタムキーを使ってマウスをクリックし垂直および水平方向に127単位スクロールし、リリースされた時にそれを全て元に戻します - なぜならこれは完全に便利な機能だからです。いいですか、以下はひとつの例です:
|
||||
|
||||
```c
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# Raw HID
|
||||
|
||||
<!---
|
||||
original document: 0.10.47:docs/feature_rawhid.md
|
||||
git diff 0.10.47 HEAD -- docs/feature_rawhid.md | cat
|
||||
original document: 0.12.41:docs/feature_rawhid.md
|
||||
git diff 0.12.41 HEAD -- docs/feature_rawhid.md | cat
|
||||
-->
|
||||
|
||||
Raw HID は、HID インタフェースを介して QMK とホストコンピュータ間の双方向通信を可能にします。これには、キーマップをその場で切り替えたり、RGB LED の色とモードを変更したりなど、多くの潜在的な使用方法があります。
|
||||
@@ -34,7 +34,7 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
}
|
||||
```
|
||||
|
||||
`raw_hid_receive` はホストから最大長 `RAW_EPSIZE` の可変サイズのパケットを受信することができます。一方、`raw_hid_send` はパケットを厳密に `RAW_EPSIZE` の長さで送信するため、長さ `RAW_EPSIZE` のデータを使う必要があります。
|
||||
これら2つの関数は、ホストとの間で長さ `RAW_EPSIZE` バイトのパケットを送受信します (LUFA/ChibiOS/V-USB では 32、ATSAM では 64)。
|
||||
|
||||
ホスト側での作業を進める前に、raw 対応のファームウェアを書き込むようにしてください。
|
||||
|
||||
|
@@ -12,7 +12,7 @@
|
||||
設定テーブルは列/行から新しい列/行にマップするための単純な2次元配列です。Planck の `hand_swap_config` の例:
|
||||
|
||||
```C
|
||||
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
||||
const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
||||
{{11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
|
||||
{{11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
|
||||
{{11, 2}, {10, 2}, {9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}},
|
||||
|
@@ -2,8 +2,8 @@
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: 0.10.33:docs/hardware_avr.md
|
||||
git diff 0.10.33 HEAD -- docs/hardware_avr.md | cat
|
||||
original document: 0.12.41:docs/hardware_avr.md
|
||||
git diff 0.12.41 HEAD -- docs/hardware_avr.md | cat
|
||||
-->
|
||||
|
||||
このページでは QMK における AVR マイコンのサポートについて説明します。AVR マイコンには、Atmel 社製の atmega32u4、atmega32u2、at90usb1286 やその他のマイコンを含みます。AVR マイコンは、簡単に動かせるよう設計された8ビットの MCU です。キーボードでよく使用される AVR マイコンには USB 機能や大きなキーボードマトリックスのためのたくさんの GPIO を搭載しています。これらは、現在、キーボードで使われる最も一般的な MCU です。
|
||||
@@ -83,7 +83,7 @@ or open the directory in your favourite text editor.
|
||||
#define PRODUCT my_awesome_keyboard
|
||||
```
|
||||
|
||||
?> Windows や macOS では、`MANUFACTURER` と `PRODUCT` が USBデバイスのリストに表示されます。Linux 上の `lsusb` では、代わりにデフォルトで [USB ID Repository](http://www.linux-usb.org/usb-ids.html) によって維持されているリストからこれらを取得します。`lsusb -v` を使用するとデバイスから示された値を表示します。また、接続したときのカーネルログにも表示されます。
|
||||
?> Windows や macOS では、`MANUFACTURER` と `PRODUCT` が USBデバイスのリストに表示されます。Linux 上の `lsusb` では、代わりに [USB ID Repository](http://www.linux-usb.org/usb-ids.html) によって維持されているリストの値を優先します。デフォルトでは、リストに `VENDOR_ID` / `PRODUCT_ID` を含まない場合にのみ、`MANUFACTURER` と `PRODUCT` を使います。`sudo lsusb -v` を使用するとデバイスから示された値を表示します。また、接続したときのカーネルログにも表示されます。
|
||||
|
||||
### キーボードマトリックスの設定
|
||||
|
||||
|
574
docs/ja/keycodes.md
Normal file
574
docs/ja/keycodes.md
Normal file
@@ -0,0 +1,574 @@
|
||||
# キーコードの概要
|
||||
|
||||
<!---
|
||||
original document: 0.11.64:docs/keycodes.md
|
||||
git diff 0.11.64 HEAD -- docs/keycodes.md | cat
|
||||
-->
|
||||
|
||||
[キーマップ](ja/keymap.md) を定義するときは、それぞれのキーに有効な定義が必要です。このページは、QMK で使えるキーコードに相当するシンボルについて記述しています。
|
||||
|
||||
このページは参照のみです。それぞれのキーの種類毎のリンク先のページに、それぞれのキーの機能についてもっと詳細に記載しています。
|
||||
|
||||
## 基本的なキーコード :id=basic-keycodes
|
||||
|
||||
[基本的なキーコード](ja/keycodes_basic.md) も見てください。
|
||||
|
||||
?> 訳注: 以下の説明は、OS のキーボード配列の設定が「US」の場合のものです。OS のキーボード配列の設定が「JIS」の場合、一部のキーは下の表と異なる文字が入力されます。例えば、`KC_LBRC` は、OS のキーボード配列の設定が US であれば「`[` または `{`」が入力されますが、JIS の場合「`@` または <code>`</code>」が入力されます。
|
||||
?> これは、OS がキーボードから送信されたキーコードを解釈する際に、キーボード配列の設定によって対応する文字を変えるためです。もし、OS のキーボード配列の設定を JIS にする場合、`#include "keymap_jp.h"` を `keymap.c` に追加すると`JP_AT` のような JIS キーボードのキーキャップに対応したキーを指定できます。
|
||||
|
||||
|キー |エイリアス |説明 |Windows |macOS |Linux<sup>1</sup>|
|
||||
|-----------------------|------------------------------|-----------------------------------------|-------------|-------------|-----------------|
|
||||
|`KC_NO` |`XXXXXXX` |このキーを無視します (何もしません) 。 |*N/A* |*N/A* |*N/A* |
|
||||
|`KC_TRANSPARENT` |`KC_TRNS`, `_______` | 次に低いレイヤーの非透過キーを使う |*N/A* |*N/A* |*N/A* |
|
||||
|`KC_A` | |`a` と `A` |✔ |✔ |✔ |
|
||||
|`KC_B` | |`b` と `B` |✔ |✔ |✔ |
|
||||
|`KC_C` | |`c` と `C` |✔ |✔ |✔ |
|
||||
|`KC_D` | |`d` と `D` |✔ |✔ |✔ |
|
||||
|`KC_E` | |`e` と `E` |✔ |✔ |✔ |
|
||||
|`KC_F` | |`f` と `F` |✔ |✔ |✔ |
|
||||
|`KC_G` | |`g` と `G` |✔ |✔ |✔ |
|
||||
|`KC_H` | |`h` と `H` |✔ |✔ |✔ |
|
||||
|`KC_I` | |`i` と `I` |✔ |✔ |✔ |
|
||||
|`KC_J` | |`j` と `J` |✔ |✔ |✔ |
|
||||
|`KC_K` | |`k` と `K` |✔ |✔ |✔ |
|
||||
|`KC_L` | |`l` と `L` |✔ |✔ |✔ |
|
||||
|`KC_M` | |`m` と `M` |✔ |✔ |✔ |
|
||||
|`KC_N` | |`n` と `N` |✔ |✔ |✔ |
|
||||
|`KC_O` | |`o` と `O` |✔ |✔ |✔ |
|
||||
|`KC_P` | |`p` と `P` |✔ |✔ |✔ |
|
||||
|`KC_Q` | |`q` と `Q` |✔ |✔ |✔ |
|
||||
|`KC_R` | |`r` と `R` |✔ |✔ |✔ |
|
||||
|`KC_S` | |`s` と `S` |✔ |✔ |✔ |
|
||||
|`KC_T` | |`t` と `T` |✔ |✔ |✔ |
|
||||
|`KC_U` | |`u` と `U` |✔ |✔ |✔ |
|
||||
|`KC_V` | |`v` と `V` |✔ |✔ |✔ |
|
||||
|`KC_W` | |`w` と `W` |✔ |✔ |✔ |
|
||||
|`KC_X` | |`x` と `X` |✔ |✔ |✔ |
|
||||
|`KC_Y` | |`y` と `Y` |✔ |✔ |✔ |
|
||||
|`KC_Z` | |`z` と `Z` |✔ |✔ |✔ |
|
||||
|`KC_1` | |`1` と `!` |✔ |✔ |✔ |
|
||||
|`KC_2` | |`2` と `@` |✔ |✔ |✔ |
|
||||
|`KC_3` | |`3` と `#` |✔ |✔ |✔ |
|
||||
|`KC_4` | |`4` と `$` |✔ |✔ |✔ |
|
||||
|`KC_5` | |`5` と `%` |✔ |✔ |✔ |
|
||||
|`KC_6` | |`6` と `^` |✔ |✔ |✔ |
|
||||
|`KC_7` | |`7` と `&` |✔ |✔ |✔ |
|
||||
|`KC_8` | |`8` と `*` |✔ |✔ |✔ |
|
||||
|`KC_9` | |`9` と `(` |✔ |✔ |✔ |
|
||||
|`KC_0` | |`0` と `)` |✔ |✔ |✔ |
|
||||
|`KC_ENTER` |`KC_ENT` |Return (Enter) |✔ |✔ |✔ |
|
||||
|`KC_ESCAPE` |`KC_ESC` |Escape |✔ |✔ |✔ |
|
||||
|`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) |✔ |✔ |✔ |
|
||||
|`KC_TAB` | |Tab |✔ |✔ |✔ |
|
||||
|`KC_SPACE` |`KC_SPC` |Spacebar |✔ |✔ |✔ |
|
||||
|`KC_MINUS` |`KC_MINS` |`-` と `_` |✔ |✔ |✔ |
|
||||
|`KC_EQUAL` |`KC_EQL` |`=` と `+` |✔ |✔ |✔ |
|
||||
|`KC_LBRACKET` |`KC_LBRC` |`[` と `{` |✔ |✔ |✔ |
|
||||
|`KC_RBRACKET` |`KC_RBRC` |`]` と `}` |✔ |✔ |✔ |
|
||||
|`KC_BSLASH` |`KC_BSLS` |`\` と `\|` |✔ |✔ |✔ |
|
||||
|`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` と `~` |✔ |✔ |✔ |
|
||||
|`KC_SCOLON` |`KC_SCLN` |`;` と `:` |✔ |✔ |✔ |
|
||||
|`KC_QUOTE` |`KC_QUOT` |`'` と `"` |✔ |✔ |✔ |
|
||||
|`KC_GRAVE` |`KC_GRV`, `KC_ZKHK` |<code>`</code> と `~`, JIS 全角/半角 |✔ |✔ |✔ |
|
||||
|`KC_COMMA` |`KC_COMM` |`,` と `<` |✔ |✔ |✔ |
|
||||
|`KC_DOT` | |`.` と `>` |✔ |✔ |✔ |
|
||||
|`KC_SLASH` |`KC_SLSH` |`/` と `?` |✔ |✔ |✔ |
|
||||
|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS` |Caps Lock |✔ |✔ |✔ |
|
||||
|`KC_F1` | |F1 |✔ |✔ |✔ |
|
||||
|`KC_F2` | |F2 |✔ |✔ |✔ |
|
||||
|`KC_F3` | |F3 |✔ |✔ |✔ |
|
||||
|`KC_F4` | |F4 |✔ |✔ |✔ |
|
||||
|`KC_F5` | |F5 |✔ |✔ |✔ |
|
||||
|`KC_F6` | |F6 |✔ |✔ |✔ |
|
||||
|`KC_F7` | |F7 |✔ |✔ |✔ |
|
||||
|`KC_F8` | |F8 |✔ |✔ |✔ |
|
||||
|`KC_F9` | |F9 |✔ |✔ |✔ |
|
||||
|`KC_F10` | |F10 |✔ |✔ |✔ |
|
||||
|`KC_F11` | |F11 |✔ |✔ |✔ |
|
||||
|`KC_F12` | |F12 |✔ |✔ |✔ |
|
||||
|`KC_PSCREEN` |`KC_PSCR` |Print Screen |✔ |✔<sup>2</sup>|✔ |
|
||||
|`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD` |Scroll Lock, 画面の明るさダウン (macOS) |✔ |✔<sup>2</sup>|✔ |
|
||||
|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, 画面の明るさアップ (macOS) |✔ |✔<sup>2</sup>|✔ |
|
||||
|`KC_INSERT` |`KC_INS` |Insert |✔ | |✔ |
|
||||
|`KC_HOME` | |Home |✔ |✔ |✔ |
|
||||
|`KC_PGUP` | |Page Up |✔ |✔ |✔ |
|
||||
|`KC_DELETE` |`KC_DEL` |Forward Delete |✔ |✔ |✔ |
|
||||
|`KC_END` | |End |✔ |✔ |✔ |
|
||||
|`KC_PGDOWN` |`KC_PGDN` |Page Down |✔ |✔ |✔ |
|
||||
|`KC_RIGHT` |`KC_RGHT` |右矢印 |✔ |✔ |✔ |
|
||||
|`KC_LEFT` | |左矢印 |✔ |✔ |✔ |
|
||||
|`KC_DOWN` | |下矢印 |✔ |✔ |✔ |
|
||||
|`KC_UP` | |上矢印 |✔ |✔ |✔ |
|
||||
|`KC_NUMLOCK` |`KC_NLCK` |テンキー Num Lock と Clear |✔ |✔ |✔ |
|
||||
|`KC_KP_SLASH` |`KC_PSLS` |テンキー `/` |✔ |✔ |✔ |
|
||||
|`KC_KP_ASTERISK` |`KC_PAST` |テンキー `*` |✔ |✔ |✔ |
|
||||
|`KC_KP_MINUS` |`KC_PMNS` |テンキー `-` |✔ |✔ |✔ |
|
||||
|`KC_KP_PLUS` |`KC_PPLS` |テンキー `+` |✔ |✔ |✔ |
|
||||
|`KC_KP_ENTER` |`KC_PENT` |テンキー Enter |✔ |✔ |✔ |
|
||||
|`KC_KP_1` |`KC_P1` |テンキー `1` と End |✔ |✔ |✔ |
|
||||
|`KC_KP_2` |`KC_P2` |テンキー `2` と下矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_3` |`KC_P3` |テンキー `3` と Page Down |✔ |✔ |✔ |
|
||||
|`KC_KP_4` |`KC_P4` |テンキー `4` と左矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_5` |`KC_P5` |テンキー `5` |✔ |✔ |✔ |
|
||||
|`KC_KP_6` |`KC_P6` |テンキー `6` と右矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_7` |`KC_P7` |テンキー `7` と Home |✔ |✔ |✔ |
|
||||
|`KC_KP_8` |`KC_P8` |テンキー `8` と上矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_9` |`KC_P9` |テンキー `9` と Page Up |✔ |✔ |✔ |
|
||||
|`KC_KP_0` |`KC_P0` |テンキー `0` と Insert |✔ |✔ |✔ |
|
||||
|`KC_KP_DOT` |`KC_PDOT` |テンキー `.` と Delete |✔ |✔ |✔ |
|
||||
|`KC_NONUS_BSLASH` |`KC_NUBS` |Non-US `\` と `\|` |✔ |✔ |✔ |
|
||||
|`KC_APPLICATION` |`KC_APP` |アプリケーションキー (Windows コンテキストメニューキー) |✔ | |✔ |
|
||||
|`KC_POWER` | |システム電源 | |✔<sup>3</sup>|✔ |
|
||||
|`KC_KP_EQUAL` |`KC_PEQL` |テンキー `=` |✔ |✔ |✔ |
|
||||
|`KC_F13` | |F13 |✔ |✔ |✔ |
|
||||
|`KC_F14` | |F14 |✔ |✔ |✔ |
|
||||
|`KC_F15` | |F15 |✔ |✔ |✔ |
|
||||
|`KC_F16` | |F16 |✔ |✔ |✔ |
|
||||
|`KC_F17` | |F17 |✔ |✔ |✔ |
|
||||
|`KC_F18` | |F18 |✔ |✔ |✔ |
|
||||
|`KC_F19` | |F19 |✔ |✔ |✔ |
|
||||
|`KC_F20` | |F20 |✔ | |✔ |
|
||||
|`KC_F21` | |F21 |✔ | |✔ |
|
||||
|`KC_F22` | |F22 |✔ | |✔ |
|
||||
|`KC_F23` | |F23 |✔ | |✔ |
|
||||
|`KC_F24` | |F24 |✔ | |✔ |
|
||||
|`KC_EXECUTE` |`KC_EXEC` |Execute | | |✔ |
|
||||
|`KC_HELP` | |Help | | |✔ |
|
||||
|`KC_MENU` | |Menu | | |✔ |
|
||||
|`KC_SELECT` |`KC_SLCT` |Select | | |✔ |
|
||||
|`KC_STOP` | |Stop | | |✔ |
|
||||
|`KC_AGAIN` |`KC_AGIN` |Again | | |✔ |
|
||||
|`KC_UNDO` | |アンドゥ | | |✔ |
|
||||
|`KC_CUT` | |カット | | |✔ |
|
||||
|`KC_COPY` | |コピー | | |✔ |
|
||||
|`KC_PASTE` |`KC_PSTE` |ペースト | | |✔ |
|
||||
|`KC_FIND` | |検索 | | |✔ |
|
||||
|`KC__MUTE` | |ミュート | |✔ |✔ |
|
||||
|`KC__VOLUP` | |音量アップ | |✔ |✔ |
|
||||
|`KC__VOLDOWN` | |音量ダウン | |✔ |✔ |
|
||||
|`KC_LOCKING_CAPS` |`KC_LCAP` |Caps Lock のロック |✔ |✔ | |
|
||||
|`KC_LOCKING_NUM` |`KC_LNUM` |Num Lock のロック |✔ |✔ | |
|
||||
|`KC_LOCKING_SCROLL` |`KC_LSCR` |Scroll Lock のロック |✔ |✔ | |
|
||||
|`KC_KP_COMMA` |`KC_PCMM` |テンキー `,` | | |✔ |
|
||||
|`KC_KP_EQUAL_AS400` | |AS/400 キーボードのテンキー `=` | | | |
|
||||
|`KC_INT1` |`KC_RO` |JIS `\` と `_` |✔ | |✔ |
|
||||
|`KC_INT2` |`KC_KANA` |JIS カタカナ/ひらがな |✔ | |✔ |
|
||||
|`KC_INT3` |`KC_JYEN` |JIS `¥` と `\|` |✔ | |✔ |
|
||||
|`KC_INT4` |`KC_HENK` |JIS 変換 |✔ | |✔ |
|
||||
|`KC_INT5` |`KC_MHEN` |JIS 無変換 |✔ | |✔ |
|
||||
|`KC_INT6` | |JIS テンキー `,` | | |✔ |
|
||||
|`KC_INT7` | |International 7 | | | |
|
||||
|`KC_INT8` | |International 8 | | | |
|
||||
|`KC_INT9` | |International 9 | | | |
|
||||
|`KC_LANG1` |`KC_HAEN` |ハングル/英語 | | |✔ |
|
||||
|`KC_LANG2` |`KC_HANJ` |韓文漢字 | | |✔ |
|
||||
|`KC_LANG3` | |JIS カタカナ | | |✔ |
|
||||
|`KC_LANG4` | |JIS ひらがな | | |✔ |
|
||||
|`KC_LANG5` | |JIS 全角/半角 | | |✔ |
|
||||
|`KC_LANG6` | |Language 6 | | | |
|
||||
|`KC_LANG7` | |Language 7 | | | |
|
||||
|`KC_LANG8` | |Language 8 | | | |
|
||||
|`KC_LANG9` | |Language 9 | | | |
|
||||
|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase | | | |
|
||||
|`KC_SYSREQ` | |SysReq/Attention | | | |
|
||||
|`KC_CANCEL` | |Cancel | | | |
|
||||
|`KC_CLEAR` |`KC_CLR` |Clear | | |✔ |
|
||||
|`KC_PRIOR` | |Prior | | | |
|
||||
|`KC_RETURN` | |Return | | | |
|
||||
|`KC_SEPARATOR` | |Separator | | | |
|
||||
|`KC_OUT` | |Out | | | |
|
||||
|`KC_OPER` | |Oper | | | |
|
||||
|`KC_CLEAR_AGAIN` | |Clear/Again | | | |
|
||||
|`KC_CRSEL` | |CrSel/Props | | | |
|
||||
|`KC_EXSEL` | |ExSel | | | |
|
||||
|`KC_LCTRL` |`KC_LCTL` |左 Control |✔ |✔ |✔ |
|
||||
|`KC_LSHIFT` |`KC_LSFT` |左 Shift |✔ |✔ |✔ |
|
||||
|`KC_LALT` |`KC_LOPT` |左 Alt (Option) |✔ |✔ |✔ |
|
||||
|`KC_LGUI` |`KC_LCMD`, `KC_LWIN` |左 GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|
||||
|`KC_RCTRL` |`KC_RCTL` |右 Control |✔ |✔ |✔ |
|
||||
|`KC_RSHIFT` |`KC_RSFT` |右 Shift |✔ |✔ |✔ |
|
||||
|`KC_RALT` |`KC_ROPT`, `KC_ALGR` |右 Alt (Option/AltGr) |✔ |✔ |✔ |
|
||||
|`KC_RGUI` |`KC_RCMD`, `KC_RWIN` |右 GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|
||||
|`KC_SYSTEM_POWER` |`KC_PWR` |システム電源オフ |✔ |✔<sup>3</sup>|✔ |
|
||||
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |システムスリープ |✔ |✔<sup>3</sup>|✔ |
|
||||
|`KC_SYSTEM_WAKE` |`KC_WAKE` |システムスリープ解除 | |✔<sup>3</sup>|✔ |
|
||||
|`KC_AUDIO_MUTE` |`KC_MUTE` |ミュート |✔ |✔ |✔ |
|
||||
|`KC_AUDIO_VOL_UP` |`KC_VOLU` |音量アップ |✔ |✔<sup>4</sup>|✔ |
|
||||
|`KC_AUDIO_VOL_DOWN` |`KC_VOLD` |音量ダウン |✔ |✔<sup>4</sup>|✔ |
|
||||
|`KC_MEDIA_NEXT_TRACK` |`KC_MNXT` |次の曲へ |✔ |✔<sup>5</sup>|✔ |
|
||||
|`KC_MEDIA_PREV_TRACK` |`KC_MPRV` |前の曲へ |✔ |✔<sup>5</sup>|✔ |
|
||||
|`KC_MEDIA_STOP` |`KC_MSTP` |再生停止 |✔ | |✔ |
|
||||
|`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY` |再生/一時停止 |✔ |✔ |✔ |
|
||||
|`KC_MEDIA_SELECT` |`KC_MSEL` |Media Player 起動 |✔ | |✔ |
|
||||
|`KC_MEDIA_EJECT` |`KC_EJCT` |イジェクト | |✔ |✔ |
|
||||
|`KC_MAIL` | |メール起動 |✔ | |✔ |
|
||||
|`KC_CALCULATOR` |`KC_CALC` |電卓起動 |✔ | |✔ |
|
||||
|`KC_MY_COMPUTER` |`KC_MYCM` |マイコンピュータを開く |✔ | |✔ |
|
||||
|`KC_WWW_SEARCH` |`KC_WSCH` |ブラウザ検索 |✔ | |✔ |
|
||||
|`KC_WWW_HOME` |`KC_WHOM` |ブラウザホーム画面 |✔ | |✔ |
|
||||
|`KC_WWW_BACK` |`KC_WBAK` |ブラウザ戻る |✔ | |✔ |
|
||||
|`KC_WWW_FORWARD` |`KC_WFWD` |ブラウザ進む |✔ | |✔ |
|
||||
|`KC_WWW_STOP` |`KC_WSTP` |ブラウザ読み込み中止 |✔ | |✔ |
|
||||
|`KC_WWW_REFRESH` |`KC_WREF` |ブラウザ再読み込み |✔ | |✔ |
|
||||
|`KC_WWW_FAVORITES` |`KC_WFAV` |ブラウザお気に入り |✔ | |✔ |
|
||||
|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |次の曲へ |✔ |✔<sup>5</sup>|✔ |
|
||||
|`KC_MEDIA_REWIND` |`KC_MRWD` |前の曲へ |✔<sup>6</sup>|✔<sup>5</sup>|✔ |
|
||||
|`KC_BRIGHTNESS_UP` |`KC_BRIU` |画面の明るさアップ |✔ |✔ |✔ |
|
||||
|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |画面の明るさダウン |✔ |✔ |✔ |
|
||||
|
||||
<sup>1. Linux カーネル HID ドライバは [ほぼ全てのキーコード](https://github.com/torvalds/linux/blob/master/drivers/hid/hid-input.c) を識別しますが、デフォルトの関連付けは デスクトップ環境/ウィンドウマネージャによって決まります。</sup><br/>
|
||||
<sup>2. F13-F15 として取り扱われます。</sup><br/>
|
||||
<sup>3. 約3秒間押していると、プロンプトが表示されます。</sup><br/>
|
||||
<sup>4. Shift と Option を押していると、ボリュームレベルの細かいコントロールが可能になります。</sup><br/>
|
||||
<sup>5. iTunes では、タップすると1曲全体がスキップされます。押していると曲の中で早送り/巻き戻しになります。</sup><br/>
|
||||
<sup>6. Windows Media Player は巻き戻しキーを識別しませんが、VLC では早送り/巻き戻しキーで再生速度が変更されます。</sup>
|
||||
|
||||
## Quantum キーコード :id=quantum-keycodes
|
||||
|
||||
[Quantum キーコード](ja/quantum_keycodes.md#qmk-keycodes) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|--------------|-----------|---------------------------------------------------------|
|
||||
|`RESET` | |ファームウエア書き込みのためにキーボードをブートローダーモードにします |
|
||||
|`DEBUG` | |デバッグモードを切り替えます |
|
||||
|`EEPROM_RESET`|`EEP_RST` |キーボードの EEPROM (不揮発メモリ) を再初期化します |
|
||||
|
||||
## オーディオキー :id=audio-keys
|
||||
|
||||
[オーディオ](ja/feature_audio.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|----------------|------------|---------------------------------------|
|
||||
|`AU_ON` | |オーディオモードオン |
|
||||
|`AU_OFF` | |オーディオモードオフ |
|
||||
|`AU_TOG` | |オーディオモードを切り替えます |
|
||||
|`CLICKY_TOGGLE` |`CK_TOGG` |オーディオクリックモードを切り替えます |
|
||||
|`CLICKY_UP` |`CK_UP` |クリック音の周波数を増やします |
|
||||
|`CLICKY_DOWN` |`CK_DOWN` |クリック音の周波数を減らします |
|
||||
|`CLICKY_RESET` |`CK_RST` |周波数をデフォルトに再設定します |
|
||||
|`MU_ON` | |音楽モードをオンにします |
|
||||
|`MU_OFF` | |音楽モードをオフにします |
|
||||
|`MU_TOG` | |音楽モードを切り替えます |
|
||||
|`MU_MOD` | |音楽モードを循環します |
|
||||
|
||||
## バックライト :id=backlighting
|
||||
|
||||
[バックライト](ja/feature_backlight.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|---------|-------------------------------------|
|
||||
|`BL_TOGG`|バックライトをオンあるいはオフにする |
|
||||
|`BL_STEP`|バックライトレベルを循環する |
|
||||
|`BL_ON` |バックライトを最大輝度にセットする |
|
||||
|`BL_OFF` |バックライトをオフにする |
|
||||
|`BL_INC` |バックライトのレベルを上げる |
|
||||
|`BL_DEC` |バックライトのレベルを下げる |
|
||||
|`BL_BRTG`|バックライトの明滅動作を切り替える |
|
||||
|
||||
## ブートマジック :id=bootmagic
|
||||
|
||||
[ブートマジック](ja/feature_bootmagic.md) も見てください。
|
||||
|
||||
| キー | エイリアス| 説明 |
|
||||
|------------------------------------|-----------|-------------------------------------------------------|
|
||||
| `MAGIC_SWAP_CONTROL_CAPSLOCK` | `CL_SWAP` | Caps Lock と左 Control の入れ替え |
|
||||
| `MAGIC_UNSWAP_CONTROL_CAPSLOCK` | `CL_NORM` | Caps Lock と左 Control の入れ替えの解除 |
|
||||
| `MAGIC_CAPSLOCK_TO_CONTROL` | `CL_CTRL` | Caps Lock を Control として扱う |
|
||||
| `MAGIC_UNCAPSLOCK_TO_CONTROL` | `CL_CAPS` | Caps Lock を Control として扱うことを止める |
|
||||
| `MAGIC_SWAP_LCTL_LGUI` | `LCG_SWP` | 左 Control と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_LCTL_LGUI` | `LCG_NRM` | 左 Control と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_RCTL_RGUI` | `RCG_SWP` | 右 Control と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_RCTL_RGUI` | `RCG_NRM` | 右 Control と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_CTL_GUI` | `CG_SWAP` | 両側の Control と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_CTL_GUI` | `CG_NORM` | 両側の Control と GUI の入れ替えを解除 |
|
||||
| `MAGIC_TOGGLE_CTL_GUI` | `CG_TOGG` | 両側の Control と GUI の入れ替えの切り替え |
|
||||
| `MAGIC_SWAP_LALT_LGUI` | `LAG_SWP` | 左 Alt と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_LALT_LGUI` | `LAG_NRM` | 左 Alt と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_RALT_RGUI` | `RAG_SWP` | 右 Alt と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_RALT_RGUI` | `RAG_NRM` | 右 Alt と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_ALT_GUI` | `AG_SWAP` | 両側の Alt と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_ALT_GUI` | `AG_NORM` | 両側の Alt と GUI の入れ替えを解除 |
|
||||
| `MAGIC_TOGGLE_ALT_GUI` | `AG_TOGG` | 両側の Alt と GUI の入れ替えの切り替え |
|
||||
| `MAGIC_NO_GUI` | `GUI_OFF` | GUI キーを無効にする |
|
||||
| `MAGIC_UNNO_GUI` | `GUI_ON` | GUI キーを有効にする |
|
||||
| `MAGIC_SWAP_GRAVE_ESC` | `GE_SWAP` | <code>`</code> とエスケープの入れ替え |
|
||||
| `MAGIC_UNSWAP_GRAVE_ESC` | `GE_NORM` | <code>`</code> とエスケープの入れ替えを解除 |
|
||||
| `MAGIC_SWAP_BACKSLASH_BACKSPACE` | `BS_SWAP` | `\` と Backspace を入れ替え |
|
||||
| `MAGIC_UNSWAP_BACKSLASH_BACKSPACE` | `BS_NORM` | `\` と Backspace の入れ替えを解除する |
|
||||
| `MAGIC_HOST_NKRO` | `NK_ON` | N キーロールオーバーを有効にする |
|
||||
| `MAGIC_UNHOST_NKRO` | `NK_OFF` | N キーロールオーバーを無効にする |
|
||||
| `MAGIC_TOGGLE_NKRO` | `NK_TOGG` | N キーロールオーバーの有効・無効を切り替え |
|
||||
| `MAGIC_EE_HANDS_LEFT` | `EH_LEFT` | 分割キーボードのマスター側を左手に設定(`EE_HANDS` 用) |
|
||||
| `MAGIC_EE_HANDS_RIGHT` | `EH_RGHT` | 分割キーボードのマスター側を右手に設定(`EE_HANDS` 用) |
|
||||
|
||||
## Bluetooth :id=bluetooth
|
||||
|
||||
[Bluetooth](ja/feature_bluetooth.md) も見てください。
|
||||
|
||||
|
||||
|キー |説明 |
|
||||
|----------|--------------------------------------|
|
||||
|`OUT_AUTO`|USB と Bluetooth を自動的に切り替える |
|
||||
|`OUT_USB` |USB のみ |
|
||||
|`OUT_BT` |Bluetooth のみ |
|
||||
|
||||
## 動的マクロ :id=dynamic-macros
|
||||
|
||||
[動的マクロ](ja/feature_dynamic_macros.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|-----------------|---------|-------------------------------------|
|
||||
|`DYN_REC_START1` |`DM_REC1`|マクロ 1 の記録を開始します |
|
||||
|`DYN_REC_START2` |`DM_REC2`|マクロ 2 の記録を開始します |
|
||||
|`DYN_MACRO_PLAY1`|`DM_PLY1`|マクロ 1 を再生します |
|
||||
|`DYN_MACRO_PLAY2`|`DM_PLY2`|マクロ 2 を再生します |
|
||||
|`DYN_REC_STOP` |`DM_RSTP`|現在記録中のマクロの記録を終了します |
|
||||
|
||||
## グレイブエスケープ :id=grave-escape
|
||||
|
||||
[グレイブエスケープ](ja/feature_grave_esc.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|-----------|---------|------------------------------------------------------------------|
|
||||
|`GRAVE_ESC`|`KC_GESC`|押された場合に Escape。Shift あるいは GUI が押されたままの場合は <code>`</code>|
|
||||
|
||||
## キーロック :id=key-lock
|
||||
|
||||
[キーロック](ja/feature_key_lock.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|---------|--------------------------------------------------|
|
||||
|`KC_LOCK`|キーが再び押されるまで次のキーを押したままにします |
|
||||
|
||||
## レイヤー切り替え :id=layer-switching
|
||||
|
||||
[レイヤー切り替え](ja/feature_layers.md#switching-and-toggling-layers) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|----------------|--------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`DF(layer)` |指定されたレイヤーを基本 (デフォルト) レイヤーに設定する |
|
||||
|`MO(layer)` |キーを押したら一時的に `layer` を切り替える。(切り替え先のレイヤーには `KC_TRNS` が必要です) |
|
||||
|`OSL(layer)` |次のキーが押されるまで、一時的にレイヤーをアクティブにします。詳細は [ワンショットキー](ja/one_shot_keys.md) のとおり。 |
|
||||
|`LM(layer, mod)`|`mod` がアクティブな状態で (MO のように) 一時的にレイヤーをアクティブにします。ここでは、`mod` は mods_bit のことです。Mod については [こちら](ja/mod_tap.md) で見ることができます。実装例: `LM(LAYER_1, MOD_LALT)` |
|
||||
|`LT(layer, kc)` |押していると `layer` をオンにし、タップすると `kc` になります。 |
|
||||
|`TG(layer)` |`layer` のオン・オフを切り替え |
|
||||
|`TO(layer)` |`layer` をオンにして、デフォルトレイヤーを除く他のレイヤーをオフにします。 |
|
||||
|`TT(layer)` |複数回タップしない限り `MO` のように動作し、複数回タップすると `layer` をオンにトグルします。 |
|
||||
|
||||
## リーダーキー :id=leader-key
|
||||
|
||||
[リーダーキー](ja/feature_leader_key.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|---------|-------------------------------|
|
||||
|`KC_LEAD`|リーダーキーのシーケンスを開始 |
|
||||
|
||||
## マウスキー :id=mouse-keys
|
||||
|
||||
[マウスキー](ja/feature_mouse_keys.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|----------------|---------|-------------------------|
|
||||
|`KC_MS_UP` |`KC_MS_U`|マウスカーソルを上に移動 |
|
||||
|`KC_MS_DOWN` |`KC_MS_D`|マウスカーソルを下に移動 |
|
||||
|`KC_MS_LEFT` |`KC_MS_L`|マウスカーソルを左に移動 |
|
||||
|`KC_MS_RIGHT` |`KC_MS_R`|マウスカーソルを右に移動 |
|
||||
|`KC_MS_BTN1` |`KC_BTN1`|ボタン1を押す |
|
||||
|`KC_MS_BTN2` |`KC_BTN2`|ボタン2を押す |
|
||||
|`KC_MS_BTN3` |`KC_BTN3`|ボタン3を押す |
|
||||
|`KC_MS_BTN4` |`KC_BTN4`|ボタン4を押す |
|
||||
|`KC_MS_BTN5` |`KC_BTN5`|ボタン5を押す |
|
||||
|`KC_MS_WH_UP` |`KC_WH_U`|ホイールを向こう側に回転 |
|
||||
|`KC_MS_WH_DOWN` |`KC_WH_D`|ホイールを手前側に回転 |
|
||||
|`KC_MS_WH_LEFT` |`KC_WH_L`|ホイールを左に倒す |
|
||||
|`KC_MS_WH_RIGHT`|`KC_WH_R`|ホイールを右に倒す |
|
||||
|`KC_MS_ACCEL0` |`KC_ACL0`|速度を0に設定 |
|
||||
|`KC_MS_ACCEL1` |`KC_ACL1`|速度を1に設定 |
|
||||
|`KC_MS_ACCEL2` |`KC_ACL2`|速度を2に設定 |
|
||||
|
||||
## 修飾キー :id=modifiers
|
||||
|
||||
[修飾キー](ja/feature_advanced_keycodes.md#modifier-keys) も見てください。
|
||||
|
||||
| キー | エイリアス | 説明 |
|
||||
|------------|---------------------------------|---------------------------------------------------------------|
|
||||
| `LCTL(kc)` | `C(kc)` | 左 Control を押しながら `kc` を押します。 |
|
||||
| `LSFT(kc)` | `S(kc)` | 左 Shift を押しながら `kc` を押します。 |
|
||||
| `LALT(kc)` | `A(kc)`, `LOPT(kc)` | 左 Alt を押しながら `kc`を押します。 |
|
||||
| `LGUI(kc)` | `G(kc)`, `LCMD(kc)`, `LWIN(kc)` | 左 GUI を押しながら `kc` を押します。 |
|
||||
| `RCTL(kc)` | | 右 Control を押しながら `kc` を押します。 |
|
||||
| `RSFT(kc)` | | 右 Shift を押しながら `kc` を押します。 |
|
||||
| `RALT(kc)` | `ROPT(kc)`, `ALGR(kc)` | 右 Alt (AltGr) を押しながら `kc` を押します。 |
|
||||
| `RGUI(kc)` | `RCMD(kc)`, `LWIN(kc)` | 右 GUI を押しながら `kc` を押します。 |
|
||||
| `SGUI(kc)` | `SCMD(kc)`, `SWIN(kc)` | 左 Shift と GUI を押しながら `kc` を押します。 |
|
||||
| `LCA(kc)` | | 左 Control と Alt を押しながら `kc` を押します。 |
|
||||
| `LSA(kc)` | | 左 Shift と Alt を押しながら `kc` を押します。 |
|
||||
| `RSA(kc)` |`SAGR(kc)` | 右 Shift と Alt (AltGr) を押しながら `kc` を押します。 |
|
||||
| `RCS(kc)` | | 右 Control と Shift を押しながら `kc` を押します。 |
|
||||
| `LCAG(kc)` | | 左 Control、Alt、GUI を押しながら `kc` を押します。 |
|
||||
| `MEH(kc)` | | 左 Control、Shift、Alt を押しながら `kc` を押します。 |
|
||||
| `HYPR(kc)` | | 左 Control、Shift、Alt、GUI を押しながら `kc` を押します。 |
|
||||
| `KC_MEH` | | 左 Control、Shift、Alt |
|
||||
| `KC_HYPR` | | 左 Control、Shift、Alt、GUI |
|
||||
|
||||
|
||||
## モッドタップキー :id=mod-tap-keys
|
||||
|
||||
[モッドタップキー](ja/mod_tap.md) も見てください。
|
||||
|
||||
|キー |エイリアス | 説明 |
|
||||
|--------------|-------------------------------------------------------------------|------------------------------------------------------------------------|
|
||||
| `MT(mod, kc)`| |押したままの場合は `mod` 、タップした場合は `kc` |
|
||||
| `LCTL_T(kc)` | `CTL_T(kc)` | 押したままの場合は左 Control、タップした場合は `kc` |
|
||||
| `LSFT_T(kc)` | `SFT_T(kc)` | 押したままの場合は左 Shift、タップした場合は `kc` |
|
||||
| `LALT_T(kc)` | `LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` | 押したままの場合は左 Alt、タップした場合は `kc` |
|
||||
| `LGUI_T(kc)` | `LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)` | 押したままの場合は左 GUI、タップした場合は `kc` |
|
||||
| `RCTL_T(kc)` | | 押したままの場合は右 Control、タップした場合は `kc` |
|
||||
| `RSFT_T(kc)` | | 押したままの場合は右 Shift、タップした場合は `kc` |
|
||||
| `RALT_T(kc)` | `ROPT_T(kc)`, `ALGR_T(kc)` | 押したままの場合は右 Alt (AltGr) 、タップした場合は `kc` |
|
||||
| `RGUI_T(kc)` | `RCMD_T(kc)`, `RWIN_T(kc)` | 押したままの場合は右 GUI、タップした場合は `kc` |
|
||||
| `SGUI_T(kc)` | `SCMD_T(kc)`, `SWIN_T(kc)` | 押したままの場合は左 Shift と GUI、タップした場合は `kc` |
|
||||
| `LCA_T(kc)` | | 押したままの場合は左 Control と Alt、タップした場合は `kc` |
|
||||
| `LSA_T(kc)` | | 押したままの場合は左 Shift と Alt、タップした場合は `kc` |
|
||||
| `RSA_T(kc)` |`SAGR_T(kc)` | 押したままの場合は右 Shift と Alt (AltGr) 、タップした場合は `kc` |
|
||||
| `RCS_T(kc)` | | 押したままの場合は右 Control と Shift、タップした場合は `kc` |
|
||||
| `LCAG_T(kc)` | | 押したままの場合は左 Control、Alt、GUI、タップした場合は `kc` |
|
||||
| `RCAG_T(kc)` | | 押したままの場合は右 Control、Alt、GUI、タップした場合は `kc` |
|
||||
| `C_S_T(kc)` | | 押したままの場合は左 Control と Shift、タップした場合は `kc` |
|
||||
| `MEH_T(kc)` | | 押したままの場合は左 Control、Shift、Alt、タップした場合は `kc` |
|
||||
| `HYPR_T(kc)` | `ALL_T(kc)` | 押したままの場合は左 Control、Shift、Alt、GUI、タップした場合は `kc` - より詳しくは[ここ](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)を見てください |
|
||||
|
||||
## RGB ライト :id=rgb-lighting
|
||||
|
||||
[RGB ライト](ja/feature_rgblight.md) も見てください。
|
||||
|
||||
|キー |エイリアス|説明 |
|
||||
|-------------------|----------|---------------------------------------------------------------------|
|
||||
|`RGB_TOG` | |RGB ライトのオン・オフを切り替え |
|
||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |RGB モードを順送りで変更し、Shift を押していると逆順で変更します。 |
|
||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|RGB モードを逆順で変更し、Shift を押していると順送りで変更します。 |
|
||||
|`RGB_HUI` | |色相 (HUE) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_HUD` | |色相 (HUE) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_SAI` | |彩度 (SAT) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_SAD` | |彩度 (SAT) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_VAI` | |明度 (VAL/brightness) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_VAD` | |明度 (VAL/brightness) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_MODE_PLAIN` |`RGB_M_P `|静止(動き無し) モードに固定します |
|
||||
|`RGB_MODE_BREATHE` |`RGB_M_B` |明滅アニメーションモード |
|
||||
|`RGB_MODE_RAINBOW` |`RGB_M_R` |レインボーアニメーションモード |
|
||||
|`RGB_MODE_SWIRL` |`RGB_M_SW`|渦巻アニメーションモード |
|
||||
|`RGB_MODE_SNAKE` |`RGB_M_SN`|スネークアニメーションモード |
|
||||
|`RGB_MODE_KNIGHT` |`RGB_M_K` |「ナイトライダー」アニメーションモード |
|
||||
|`RGB_MODE_XMAS` |`RGB_M_X` |クリスマスアニメーションモード |
|
||||
|`RGB_MODE_GRADIENT`|`RGB_M_G` |固定階調アニメーションモード |
|
||||
|`RGB_MODE_RGBTEST` |`RGB_M_T` |赤、緑、青のテストアニメーションモード |
|
||||
|
||||
## RGB マトリックスライト :id=rgb-matrix-lighting
|
||||
|
||||
[RGB マトリックスライト](ja/feature_rgb_matrix.md) も見てください。
|
||||
|
||||
|キー |エイリアス|説明 |
|
||||
|-------------------|----------|--------------------------------------------------------------------------------------------------------|
|
||||
|`RGB_TOG` | |RGB ライトのオン・オフを切り替え |
|
||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |RGB モードを順送りで変更し、Shift を押していると逆順で変更します。 |
|
||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|RGB モードを逆順で変更し、Shift を押していると順送りで変更します。 |
|
||||
|`RGB_HUI` | |色相 (HUE) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_HUD` | |色相 (HUE) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_SAI` | |彩度 (SAT) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_SAD` | |彩度 (SAT) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_VAI` | |明度 (VAL/brightness) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_VAD` | |明度 (VAL/brightness) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_SPI` | |エフェクトのスピード (EEPROM はまだサポートしていません) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_SPD` | |エフェクトのスピード (EEPROM はまだサポートしていません) を減少させ、Shift を押していると増加させます。 |
|
||||
|
||||
## 感熱式プリンタ :id=thermal-printer
|
||||
|
||||
[感熱式プリンタ](ja/feature_thermal_printer.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|-----------|---------------------------------|
|
||||
|`PRINT_ON` |ユーザが入力した全ての印刷を開始 |
|
||||
|`PRINT_OFF`|ユーザが入力した全ての印刷を停止 |
|
||||
|
||||
## US ANSI シフト済シンボル :id=us-ansi-shifted-symbols
|
||||
|
||||
[US ANSI シフト済シンボル](ja/keycodes_us_ansi_shifted.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明|
|
||||
|------------------------|-------------------|-----------|
|
||||
|`KC_TILDE` |`KC_TILD` |`~` |
|
||||
|`KC_EXCLAIM` |`KC_EXLM` |`!` |
|
||||
|`KC_AT` | |`@` |
|
||||
|`KC_HASH` | |`#` |
|
||||
|`KC_DOLLAR` |`KC_DLR` |`$` |
|
||||
|`KC_PERCENT` |`KC_PERC` |`%` |
|
||||
|`KC_CIRCUMFLEX` |`KC_CIRC` |`^` |
|
||||
|`KC_AMPERSAND` |`KC_AMPR` |`&` |
|
||||
|`KC_ASTERISK` |`KC_ASTR` |`*` |
|
||||
|`KC_LEFT_PAREN` |`KC_LPRN` |`(` |
|
||||
|`KC_RIGHT_PAREN` |`KC_RPRN` |`)` |
|
||||
|`KC_UNDERSCORE` |`KC_UNDS` |`_` |
|
||||
|`KC_PLUS` | |`+` |
|
||||
|`KC_LEFT_CURLY_BRACE` |`KC_LCBR` |`{` |
|
||||
|`KC_RIGHT_CURLY_BRACE` |`KC_RCBR` |`}` |
|
||||
|`KC_PIPE` | |`\|` |
|
||||
|`KC_COLON` |`KC_COLN` |`:` |
|
||||
|`KC_DOUBLE_QUOTE` |`KC_DQUO`, `KC_DQT`|`"` |
|
||||
|`KC_LEFT_ANGLE_BRACKET` |`KC_LABK`, `KC_LT` |`<` |
|
||||
|`KC_RIGHT_ANGLE_BRACKET`|`KC_RABK`, `KC_GT` |`>` |
|
||||
|`KC_QUESTION` |`KC_QUES` |`?` |
|
||||
|
||||
## ワンショットキー :id=one-shot-keys
|
||||
|
||||
[ワンショットキー](ja/one_shot_keys.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|------------|--------------------------------|
|
||||
|`OSM(mod)` | 次のキーが押されるまで、`mod` を押したままにします |
|
||||
|`OSL(layer)`| 次のキーが押されるまで、一時的にレイヤーをアクティブにします |
|
||||
|
||||
## Space Cadet :id=space-cadet
|
||||
|
||||
[Space Cadet](ja/feature_space_cadet.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|-----------|-------------------------------------------|
|
||||
|`KC_LCPO` |押したままの場合は左 Control、タップした場合は `(` |
|
||||
|`KC_RCPC` |押したままの場合は右 Control、タップした場合は `)` |
|
||||
|`KC_LSPO` |押したままの場合は左 Shift、タップした場合は `(`、 |
|
||||
|`KC_RSPC` |押したままの場合は右 Shift、タップした場合は `)`、 |
|
||||
|`KC_LAPO` |押したままの場合は左 Alt、タップした場合は `(`、 |
|
||||
|`KC_RAPC` |押したままの場合は右 Alt、タップした場合は `)`、 |
|
||||
|`KC_SFTENT`|押したままの場合は右 Shift、タップした場合は Enter |
|
||||
|
||||
## スワップハンド :id=swap-hands
|
||||
|
||||
[スワップハンド](ja/feature_swap_hands.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|-------------|----------------------------------------------------------------------------------|
|
||||
| `SH_T(key)` | タップで `key` を送信する。押している時に一時的に入れ替え。 |
|
||||
| `SH_ON` | 入れ替えをオンにして、そのままにする。 |
|
||||
| `SH_OFF` | 入れ替えをオフにして、そのままにする。既知の状態に戻るのに適しています。 |
|
||||
| `SH_MON` | 押すとスワップハンドし、放すと通常に戻る (一時的)。 |
|
||||
| `SH_MOFF` | 一時的に入れ替えをオフする。 |
|
||||
| `SH_TG` | キーを押すたびにオンとオフを切り替える。 |
|
||||
| `SH_TT` | タップで切り替える。押している時に一時的に切り替える。 |
|
||||
| `SH_OS` | ワンショットスワップハンド: 押している時あるいは次のキーを押すまで切り替える。 |
|
||||
|
||||
## ユニコードサポート :id=unicode-support
|
||||
|
||||
[ユニコードサポート](ja/feature_unicode.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|----------------------|-----------|----------------------------------------------------------------------|
|
||||
|`UC(c)` | |コードポイント `c` のユニコードを送信 |
|
||||
|`X(i)` | |`unicode_map` のインデックス `i` のユニコードを送信 |
|
||||
|`XP(i, j)` | |Shift/Capsが有効なら、インデックス `i` または `j` のユニコードを送信 |
|
||||
|`UNICODE_MODE_FORWARD`|`UC_MOD` |ユニコード入力方式を順送りで選択 |
|
||||
|`UNICODE_MODE_REVERSE`|`UC_RMOD` |ユニコード入力方式を逆順で選択 |
|
||||
|`UNICODE_MODE_OSX` |`UC_M_OS` |ユニコード入力方式を macOS 方式に切り替え |
|
||||
|`UNICODE_MODE_LNX` |`UC_M_LN` |ユニコード入力方式を Linux 方式に切り替え |
|
||||
|`UNICODE_MODE_WIN` |`UC_M_WI` |ユニコード入力方式を Windows 方式に切り替え |
|
||||
|`UNICODE_MODE_BSD` |`UC_M_BS` |ユニコード入力方式を BSD 方式に切り替え (実装されていません) |
|
||||
|`UNICODE_MODE_WINC` |`UC_M_WC` |ユニコード入力方式を WinCompose を使う Windows 方式に切り替え |
|
@@ -1,8 +1,8 @@
|
||||
# モッドタップ
|
||||
|
||||
<!---
|
||||
original document: 0.9.34:docs/mod_tap.md
|
||||
git diff 0.9.34 HEAD -- docs/mod_tap.md | cat
|
||||
original document: 0.10.36:docs/mod_tap.md
|
||||
git diff 0.10.36 HEAD -- docs/mod_tap.md | cat
|
||||
-->
|
||||
|
||||
モッドタップキー `MT(mod, kc)` は、押したままの時にモディファイアのように機能し、タップされた時に通常のキーのように振舞います。別の言い方をすると、タップした時に Escape を送信しますが、押したままの時に Control あるいは Shift キーとして機能するキーを持つことができます。
|
||||
@@ -32,23 +32,26 @@ MT(MOD_LCTL | MOD_LSFT, KC_ESC)
|
||||
|
||||
便利なように、QMK はキーマップで一般的な組み合わせをよりコンパクトにするためのモッドタップショートカットを含んでいます:
|
||||
|
||||
| キー | エイリアス | 説明 |
|
||||
|--------------|-----------------------------|-------------------------------------------------------------|
|
||||
| `LCTL_T(kc)` | `CTL_T(kc)` | 押したままの場合は左 Control、タップした場合は `kc` |
|
||||
| `LSFT_T(kc)` | `SFT_T(kc)` | 押したままの場合は左 Shift、タップした場合は `kc` |
|
||||
| `LALT_T(kc)` | `LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` | 押したままの場合は左 Alt、タップした場合は `kc` |
|
||||
| `LGUI_T(kc)` | `LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)` | 押したままの場合は左 GUI、タップした場合は `kc` |
|
||||
| `RCTL_T(kc)` | | 押したままの場合は右 Control、タップした場合は `kc` |
|
||||
| `RSFT_T(kc)` | | 押したままの場合は右 Shift、タップした場合は `kc` |
|
||||
| `RALT_T(kc)` | `ROPT_T(kc)`, `ALGR_T(kc)` | 押したままの場合は右 Alt、タップした場合は `kc` |
|
||||
| `RGUI_T(kc)` | `RCMD_T(kc)`, `RWIN_T(kc)` | 押したままの場合は右 GUI、タップした場合は `kc` |
|
||||
| `SGUI_T(kc)` | `SCMD_T(kc)`, `SWIN_T(kc)` | 押したままの場合は左 Shift と左 GUI、タップした場合は `kc` |
|
||||
| `LCA_T(kc)` | | 押したままの場合は左 Control と左 Alt、タップした場合は `kc` |
|
||||
| `LCAG_T(kc)` | | 押したままの場合は左 Control、左 Alt と左 GUI、タップした場合は `kc` |
|
||||
| `RCAG_T(kc)` | | 押したままの場合は右 Control、右 Alt と右 GUI、タップした場合は `kc` |
|
||||
| `C_S_T(kc)` | | 押したままの場合は左 Control と左 Shift、タップした場合は `kc` |
|
||||
| `MEH_T(kc)` | | 押したままの場合は左 Control、左 Shift と左 Alt、タップした場合は `kc` |
|
||||
| `HYPR_T(kc)` | `ALL_T(kc)` | 押したままの場合は左 Control、左 Shift、左 Alt と左 GUI、タップした場合は `kc` - より詳しくは[ここ](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)を見てください |
|
||||
| キー | エイリアス | 説明 |
|
||||
| ------------ | ----------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
||||
| `LCTL_T(kc)` | `CTL_T(kc)` | 押したままの場合は左 Control、タップした場合は `kc` |
|
||||
| `LSFT_T(kc)` | `SFT_T(kc)` | 押したままの場合は左 Shift、タップした場合は `kc` |
|
||||
| `LALT_T(kc)` | `LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` | 押したままの場合は左 Alt、タップした場合は `kc` |
|
||||
| `LGUI_T(kc)` | `LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)` | 押したままの場合は左 GUI、タップした場合は `kc` |
|
||||
| `RCTL_T(kc)` | | 押したままの場合は右 Control、タップした場合は `kc` |
|
||||
| `RSFT_T(kc)` | | 押したままの場合は右 Shift、タップした場合は `kc` |
|
||||
| `RALT_T(kc)` | `ROPT_T(kc)`, `ALGR_T(kc)` | 押したままの場合は右 Alt、タップした場合は `kc` |
|
||||
| `RGUI_T(kc)` | `RCMD_T(kc)`, `RWIN_T(kc)` | 押したままの場合は右 GUI、タップした場合は `kc` |
|
||||
| `SGUI_T(kc)` | `SCMD_T(kc)`, `SWIN_T(kc)` | 押したままの場合は左 Shift と左 GUI、タップした場合は `kc` |
|
||||
| `LCA_T(kc)` | | 押したままの場合は左 Control と左 Alt、タップした場合は `kc` |
|
||||
| `LSA_T(kc)` | | 押したままの場合は左 Shift と Alt、タップした場合は `kc` |
|
||||
| `RSA_T(kc)` | `SAGR_T(kc)` | 押したままの場合は右 Shift と Alt (AltGr)、タップした場合は `kc` |
|
||||
| `RCS_T(kc)` | | 押したままの場合は右 Control と Shift、タップした場合は `kc` |
|
||||
| `LCAG_T(kc)` | | 押したままの場合は左 Control、左 Alt と左 GUI、タップした場合は `kc` |
|
||||
| `RCAG_T(kc)` | | 押したままの場合は右 Control、右 Alt と右 GUI、タップした場合は `kc` |
|
||||
| `C_S_T(kc)` | | 押したままの場合は左 Control と左 Shift、タップした場合は `kc` |
|
||||
| `MEH_T(kc)` | | 押したままの場合は左 Control、左 Shift と左 Alt、タップした場合は `kc` |
|
||||
| `HYPR_T(kc)` | `ALL_T(kc)` | 押したままの場合は左 Control、左 Shift、左 Alt と左 GUI、タップした場合は `kc` - より詳しくは[ここ](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)を見てください |
|
||||
|
||||
## 注意事項
|
||||
|
||||
@@ -57,3 +60,7 @@ MT(MOD_LCTL | MOD_LSFT, KC_ESC)
|
||||
さらに、Windows でリモートデスクトップ接続を使う場合に、問題が発生する場合があります。これらのコードはシフトを非常に高速に送信するため、リモートデスクトップはコードを見逃すかもしれません。
|
||||
|
||||
これを修正するには、リモートデスクトップ接続を開き、「オプションの表示」を開き、「ローカル リソース」タブを開きます。キーボードセクションで、ドロップダウンを「このコンピューター」に変更します。これにより問題が修正され、キャラクタが正しく動作するようになります。
|
||||
|
||||
## 他のリソース
|
||||
|
||||
モッドタップの動作を調整する追加フラグについては、[タップホールド設定オプション](ja/tap_hold.md)を参照してください。
|
||||
|
@@ -1,9 +1,9 @@
|
||||
# QMK 初心者ガイド
|
||||
# QMK チュートリアル
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: 0.9.0:docs/newbs.md
|
||||
git diff 0.9.0 HEAD -- docs/newbs.md | cat
|
||||
original document: 0.12.45:docs/newbs.md
|
||||
git diff 0.12.45 HEAD -- docs/newbs.md | cat
|
||||
-->
|
||||
|
||||
キーボードには、コンピュータ入っているものと似たようなプロセッサが入っています。
|
||||
@@ -19,20 +19,16 @@ QMK は、簡単なことは簡単に、そして、難しいことを可能な
|
||||
QMK は[多くの趣味のキーボード](https://qmk.fm/keyboards/)をサポートしています。
|
||||
現在使用しているキーボードが QMK を実行できない場合、QMK を実行できるキーボードの選択肢はたくさんあります。
|
||||
|
||||
## このガイドは私のためにあるのでしょうか?
|
||||
|
||||
このガイドは、ソースコードを使ってキーボードのファームウェアを構築したいと考えている人に適しています。
|
||||
もしあなたがすでにプログラマーであれば、このプロセスはとても身近で簡単に理解できるでしょう。
|
||||
もし、プログラミングの考え方に抵抗があるのであれば、代わりに[私たちのオンラインGUI](ja/newbs_building_firmware_configurator.md)を見てみてください。
|
||||
?> **このガイドは私のためにあるのでしょうか?**<br>
|
||||
もし、プログラミングの考え方に抵抗があるのであれば、代わりに[私たちのオンライン GUI](ja/newbs_building_firmware_configurator.md) を見てみてください。
|
||||
|
||||
## 概要
|
||||
|
||||
このガイドには4つの主要なセクションがあります。
|
||||
このガイドは、ソースコードを使ってキーボードのファームウェアを構築したいと考えている人に適しています。 もしあなたがすでにプログラマーであれば、このプロセスはとても身近で簡単に理解できるでしょう。このガイドには3つの主要なセクションがあります:
|
||||
|
||||
1. [環境設定](ja/newbs_getting_started.md)
|
||||
2. [コマンドラインを使用して初めてのファームウェアを構築する](ja/newbs_building_firmware.md)
|
||||
3. [ファームウェアを書きこむ](ja/newbs_flashing.md)
|
||||
4. [テストとデバッグ](ja/newbs_testing_debugging.md)
|
||||
|
||||
このガイドは、これまでソフトウェアをコンパイルしたことがない人を支援することに特化しています。
|
||||
その観点から選択と推奨を行います。
|
||||
@@ -41,8 +37,4 @@ QMK は[多くの趣味のキーボード](https://qmk.fm/keyboards/)をサポ
|
||||
|
||||
## 追加のリソース
|
||||
|
||||
このガイドの他にも、QMK の学習に役立つリソースがいくつかあります。[学習リソース](ja/newbs_learn_more_resources.md)のページにまとめました。
|
||||
|
||||
## オープンソース
|
||||
|
||||
QMKは GNU General Public License でリリースされているオープンソース・ソフトウェアです。
|
||||
このガイドの他にも、QMK の学習に役立つリソースがいくつかあります。[シラバス](ja/syllabus.md)と[学習リソース](ja/newbs_learn_more_resources.md)のページにまとめました。
|
||||
|
@@ -2,13 +2,13 @@
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: 0.9.0:docs/newbs_building_firmware_configurator.md
|
||||
git diff 0.9.0 HEAD -- docs/newbs_building_firmware_configurator.md | cat
|
||||
original document: 0.12.45:docs/newbs_building_firmware_configurator.md
|
||||
git diff 0.12.45 HEAD -- docs/newbs_building_firmware_configurator.md | cat
|
||||
-->
|
||||
|
||||
[](https://config.qmk.fm/)
|
||||
|
||||
[QMK Configurator](https://config.qmk.fm) は、QMKファームウェアの hex ファイルを生成するオンライングラフィカルユーザーインターフェイスです。
|
||||
[QMK Configurator](https://config.qmk.fm) は、QMKファームウェアの `.hex` や `.bin` ファイルを生成するオンライングラフィカルユーザーインターフェイスです。
|
||||
|
||||
[ビデオチュートリアル](https://www.youtube.com/watch?v=-imgglzDMdY) を見てください。
|
||||
多くの人は、それが自分のキーボードのプログラミングを始めるのに十分な情報であることに気づくでしょう。
|
||||
|
@@ -1,12 +1,12 @@
|
||||
# ファームウェアを書きこむ
|
||||
# ファームウェアを書き込む
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: 0.9.44:docs/newbs_flashing.md
|
||||
git diff 0.9.44 HEAD -- docs/newbs_flashing.md | cat
|
||||
original document: 0.12.45:docs/newbs_flashing.md
|
||||
git diff 0.12.45 HEAD -- docs/newbs_flashing.md | cat
|
||||
-->
|
||||
|
||||
カスタムファームウェアは出来たので、キーボードに書き込みたくなるでしょう/フラッシュしたくなるでしょう。
|
||||
カスタムファームウェアは出来たので、いよいよキーボードへの書き込み(フラッシュ)です。
|
||||
|
||||
## キーボードを DFU (Bootloader) モードにする
|
||||
|
||||
@@ -50,18 +50,22 @@ Finder またはエクスプローラーでファームウェアのファイル
|
||||
|
||||
Windows か macOS を使用している場合、現在のフォルダをエクスプローラーか Finder で簡単に開くためのコマンドがあります。
|
||||
|
||||
#### Windows
|
||||
<!-- tabs:start -->
|
||||
|
||||
#### ** Windows **
|
||||
|
||||
```
|
||||
start .
|
||||
```
|
||||
|
||||
#### macOS
|
||||
#### ** macOS **
|
||||
|
||||
```
|
||||
open .
|
||||
```
|
||||
|
||||
<!-- tabs:end -->
|
||||
|
||||
ファームウェアファイルは常に以下の命名形式に従っています:
|
||||
|
||||
```
|
||||
@@ -117,11 +121,13 @@ QMK Toolbox の `Flash` ボタンをクリックします。次のような出
|
||||
|
||||
WARNING: This board's bootloader is not specified or is not supported by the ":flash" target at this time.
|
||||
|
||||
この場合、あなたは明示的にブートローダを指定する方法を使わなければなりません。詳細は、[ファームウェアのフラッシュ](ja/flashing.md) ガイドを参照してください。
|
||||
この場合、あなたは明示的にブートローダを指定する方法を使わなければなりません。詳細は、[ファームウェアのフラッシュ](ja/flashing.md)ガイドを参照してください。
|
||||
|
||||
## テストしましょう!
|
||||
|
||||
おめでとうございます! カスタムファームウェアがキーボードにプログラムされました!
|
||||
おめでとうございます!カスタムファームウェアがキーボードにプログラムされ、テストする準備ができました!
|
||||
|
||||
使ってみて、すべてがあなたの望むように動作するかどうか確認してください。
|
||||
この初心者ガイドを完全なものにするために [テストとデバッグ](ja/newbs_testing_debugging.md) を書いたので、ファームウェアの検証とカスタム機能のトラブルシューティング方法について学ぶには、こちらをご覧ください。
|
||||
少し運が良ければ全てが完璧に機能しますが、そうでない場合は何が問題なのかを理解するのに役立つ手順があります。
|
||||
通常、キーボードのテストは非常に簡単です。全てのキーをひとつずつ押して、期待するキーが送信されることを確認します。例え QMK で動作していない場合でも、[QMK Configurator](https://config.qmk.fm/#/test/) のテストモードを使用すると、キーボードをチェックできます。
|
||||
|
||||
まだ動作しませんか?詳細については FAQ トピックを参照するか、[Discord でチャット](https://discord.gg/Uq7gcHh)してください。
|
||||
|
@@ -2,13 +2,13 @@
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: 0.9.0:docs/newbs_learn_more_resources.md
|
||||
git diff 0.9.0 HEAD -- docs/newbs_learn_more_resources.md | cat
|
||||
original document: 0.12.45:docs/newbs_learn_more_resources.md
|
||||
git diff 0.12.45 HEAD -- docs/newbs_learn_more_resources.md | cat
|
||||
-->
|
||||
|
||||
これらのリソースは、QMK コミュニティの新しいメンバーに、初心者向けドキュメントで提供されている情報に対する理解を深めることを目的としています。
|
||||
|
||||
## QMK に関するリソース:
|
||||
## QMK に関するリソース
|
||||
|
||||
### 英語 :id=english-resources-qmk
|
||||
|
||||
@@ -18,17 +18,35 @@
|
||||
|
||||
_日本語のリソース情報を募集中です。_
|
||||
|
||||
## コマンドラインに関するリソース:
|
||||
## コマンドラインに関するリソース :id=command-line-resources
|
||||
|
||||
### 英語 :id=english-resources-cli
|
||||
|
||||
* [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line)
|
||||
* [Must Know Linux Commands](https://www.guru99.com/must-know-linux-commands.html)<br>
|
||||
* [Some Basic Unix Commands](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html)
|
||||
|
||||
### 日本語 :id=japanese-resources-cli
|
||||
|
||||
_日本語のリソース情報を募集中です。_
|
||||
|
||||
## Git に関するリソース:
|
||||
## テキストエディタに関するリソース :id=text-editor-resources
|
||||
|
||||
どのテキストエディタを使えば良いか分かりませんか?
|
||||
|
||||
### 英語 :id=english-resources-text-editor
|
||||
|
||||
* [a great introduction to the subject](https://learntocodewith.me/programming/basics/text-editors/)
|
||||
|
||||
### 日本語 :id=japanese-resources-text-editor
|
||||
|
||||
_日本語のリソース情報を募集中です。_
|
||||
|
||||
コーディング用に特別に作成されたエディタ:
|
||||
* [Sublime Text](https://www.sublimetext.com/)
|
||||
* [VS Code](https://code.visualstudio.com/)
|
||||
|
||||
## Git に関するリソース
|
||||
|
||||
### 英語 :id=english-resources-git
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# ワンショットキー
|
||||
|
||||
<!---
|
||||
original document: 0.9.34:docs/one_shot_keys.md
|
||||
git diff 0.9.34 HEAD -- docs/one_shot_keys.md | cat
|
||||
original document: 0.12.41:docs/one_shot_keys.md
|
||||
git diff 0.12.41 HEAD -- docs/one_shot_keys.md | cat
|
||||
-->
|
||||
|
||||
ワンショットキーは次のキーが押されるまでアクティブのままになり、そのあと放されるキーです。これにより一度に1つ以上のキーを押すことなく、キーボードの組み合わせを入力することができます。これらのキーは通常「スティッキーキー」あるいは「デッドキー」と呼ばれます。
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
ワンショットレイヤーについては、キーを押した時に `set_oneshot_layer(LAYER, ONESHOT_START)` を呼び出し、キーを放した時に `clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED)` を呼び出す必要があります。ワンショットをキャンセルする場合は、`reset_oneshot_layer()` を呼び出してください。
|
||||
|
||||
ワンショットモッドについては、設定するためには `set_oneshot_mods(MOD)` を呼び出し、キャンセルするためには `clear_oneshot_mods()` を呼び出す必要があります。
|
||||
ワンショットモッドについては、設定するためには `set_oneshot_mods(MOD_BIT(KC_*))` を呼び出し、キャンセルするためには `clear_oneshot_mods()` を呼び出す必要があります。
|
||||
|
||||
!> リモートデスクトップ接続で OSM 変換に問題がある場合は、設定を開いて「ローカル リソース」タブに移動し、キーボードセクションでドロップダウンを「このコンピューター」に変更することで修正することができます。これにより問題が修正され、OSM がリモートデスクトップ上で適切に動作するようになります。
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# キーボードをより良くするための便利なコア関数のリスト
|
||||
|
||||
<!---
|
||||
original document: 0.10.33:docs/ref_functions.md
|
||||
git diff 0.10.33 HEAD -- docs/ref_functions.md | cat
|
||||
original document: 0.12.41:docs/ref_functions.md
|
||||
git diff 0.12.41 HEAD -- docs/ref_functions.md | cat
|
||||
-->
|
||||
|
||||
QMK には、信じられないほど便利な、またはあなたが望んでいた機能を少し追加する、隠された関数がたくさんあります。特定の機能に固有の関数はそれぞれの機能のページにあるため、ここには含まれていません。
|
||||
@@ -98,7 +98,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
|
||||
|
||||
## EEPROM (永続ストレージ)の消去
|
||||
|
||||
オーディオ、RGB アンダーグロー、バックライト、キーの動作に問題がある場合は、EEPROM (永続的な設定のストレージ)をリセットすることができます。ブートマジックはこれを行う方法の1つですが、有効になっていない場合はカスタムマクロを使って行うことができます。
|
||||
オーディオ、RGB アンダーグロー、バックライト、キーの動作に問題がある場合は、EEPROM (永続的な設定のストレージ)をリセットすることができます。EEPROM を強制的にリセットするには、[`EEP_RST` キーコード](ja/quantum_keycodes.md)あるいは[ブートマジック](ja/feature_bootmagic.md)機能を使います。それらのいずれも選択肢にない場合は、カスタムマクロを使って行うことができます。
|
||||
|
||||
EEPROM を消去するには、関数またはマクロから `eeconfig_init()` を実行し、ほとんどの設定をデフォルトにリセットします。
|
||||
|
||||
|
@@ -516,6 +516,9 @@ See also: [One Shot Keys](one_shot_keys.md)
|
||||
|------------|----------------------------------|
|
||||
|`OSM(mod)` |Hold `mod` for one keypress |
|
||||
|`OSL(layer)`|Switch to `layer` for one keypress|
|
||||
|`OS_ON` |Turns One Shot keys on |
|
||||
|`OS_OFF` |Turns One Shot keys off |
|
||||
|`OS_TOGG` |Toggles One Shot keys status |
|
||||
|
||||
## Space Cadet :id=space-cadet
|
||||
|
||||
|
@@ -50,11 +50,13 @@ For convenience, QMK includes some Mod-Tap shortcuts to make common combinations
|
||||
|
||||
## Caveats
|
||||
|
||||
Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored.
|
||||
Currently, the `kc` argument of `MT()` is limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. This is because QMK uses 16-bit keycodes, of which 3 bits are used for the function identifier, 1 bit for selecting right or left mods, and 4 bits to tell which mods are used, leaving only 8 bits for the keycode. Additionally, if at least one right-handed modifier is specified in a Mod-Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two - for example, Left Control and Right Shift would become Right Control and Right Shift.
|
||||
|
||||
Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes.
|
||||
Expanding this would be complicated, at best. Moving to a 32-bit keycode would solve a lot of this, but would double the amount of space that the keymap matrix uses. And it could potentially cause issues, too. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
|
||||
|
||||
To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly.
|
||||
You may also run into issues when using Remote Desktop Connection on Windows. Because these keycodes send key events faster than a human, Remote Desktop could miss them.
|
||||
To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly.
|
||||
It can also be mitigated by increasing [`TAP_CODE_DELAY`](config_options.md#behaviors-that-can-be-configured).
|
||||
|
||||
## Other Resources
|
||||
|
||||
|
@@ -65,7 +65,7 @@ For example, the `planck/rev5` with a `default` keymap will have this filename:
|
||||
planck_rev5_default.hex
|
||||
```
|
||||
|
||||
Once you have located your firmware file drag it into the "Local file" box in QMK Toolbox, or click "Open" and navigate to where your firmware file is stored.
|
||||
Once you have located your firmware file, drag it into the "Local file" box in QMK Toolbox, or click "Open" and navigate to where your firmware file is stored.
|
||||
|
||||
### Flash Your Keyboard
|
||||
|
||||
|
@@ -70,6 +70,8 @@ Install the QMK CLI by running:
|
||||
|
||||
### ** Linux/WSL **
|
||||
|
||||
?> **Note for WSL users**: By default, the installation process will clone the QMK repository into your WSL home directory, but if you have cloned manually, ensure that it is located inside the WSL instance instead of the Windows filesystem (ie. not in `/mnt`), as accessing it is currently [extremely slow](https://github.com/microsoft/WSL/issues/4197).
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
You will need to install Git and Python. It's very likely that you already have both, but if not, one of the following commands should install them:
|
||||
@@ -102,19 +104,13 @@ You can also try the `qmk-git` package from AUR:
|
||||
|
||||
### ** FreeBSD **
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
You will need to install Git and Python. It's possible that you already have both, but if not, run the following commands to install them:
|
||||
|
||||
pkg install git python3
|
||||
|
||||
Make sure that `$HOME/.local/bin` is added to your `$PATH` so that locally installed Python packages are available.
|
||||
|
||||
#### Installation
|
||||
|
||||
Install the QMK CLI by running:
|
||||
Install the FreeBSD package for QMK CLI by running:
|
||||
|
||||
python3 -m pip install --user qmk
|
||||
pkg install -g "py*-qmk"
|
||||
|
||||
NOTE: remember to follow the instructions printed at the end of installation (use `pkg info -Dg "py*-qmk"` to show them again).
|
||||
|
||||
<!-- tabs:end -->
|
||||
|
||||
@@ -160,17 +156,11 @@ After installing QMK you can set it up with this command:
|
||||
|
||||
In most situations you will want to answer `y` to all of the prompts.
|
||||
|
||||
?>**Note on FreeBSD**:
|
||||
It is suggested to run `qmk setup` as a non-`root` user to start with, but this will likely identify packages that need to be installed to your
|
||||
base system using `pkg`. However the installation will probably fail when run as an unprivileged user.
|
||||
To manually install the base dependencies, run `./util/qmk_install.sh` either as `root`, or with `sudo`.
|
||||
Once that completes, re-run `qmk setup` to complete the setup and checks.
|
||||
|
||||
<!-- tabs:end -->
|
||||
|
||||
?> The qmk home folder can be specified at setup with `qmk setup -H <path>`, and modified afterwards using the [cli configuration](cli_configuration.md?id=single-key-example) and the variable `user.qmk_home`. For all available options run `qmk setup --help`.
|
||||
|
||||
?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create your own fork and use `qmk setup <github_username>/qmk_firmware` to clone your personal fork. If you don't know what that means you can safely ignore this message.
|
||||
?> If you already know how to use GitHub, [we recommend that you follow these instructions](getting_started_github.md) and use `qmk setup <github_username>/qmk_firmware` to clone your personal fork. If you don't know what that means you can safely ignore this message.
|
||||
|
||||
## 4. Test Your Build Environment
|
||||
|
||||
|
@@ -17,10 +17,13 @@ You can control the behavior of one shot keys by defining these in `config.h`:
|
||||
|
||||
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](mod_tap.md), not the `KC_*` codes.
|
||||
* `OSL(layer)` - momentary switch to *layer*.
|
||||
* `OS_ON` - Turns on One Shot keys.
|
||||
* `OS_OFF` - Turns off One Shot keys. OSM act as regular mod keys, OSL act like `MO`.
|
||||
* `ON_TOGG` - Toggles the one shot key status.
|
||||
|
||||
Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine.
|
||||
|
||||
For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`.
|
||||
For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `clear_oneshot_layer_state(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`.
|
||||
|
||||
For one shot mods, you need to call `set_oneshot_mods(MOD_BIT(KC_*))` to set it, or `clear_oneshot_mods()` to cancel it.
|
||||
|
||||
|
@@ -50,7 +50,7 @@ This is the most important plugin as it will allow Eclipse to _understand_ AVR C
|
||||
### [ANSI Escape in Console](https://marketplace.eclipse.org/content/ansi-escape-console)
|
||||
This plugin is necessary to properly display the colored build output generated by the QMK makefile.
|
||||
|
||||
1. Open <kbd><kbd>Help</kbd> > <kbd>Eclipse Marketplace…</kbd></kbd>
|
||||
1. Open <kbd>Help</kbd> > <kbd>Eclipse Marketplace…</kbd>
|
||||
2. Search for _ANSI Escape in Console_
|
||||
3. Click the <samp>Install</samp> button of the plugin
|
||||
4. Follow the instructions and agree again with the security warning for unsigned content.
|
||||
@@ -59,7 +59,7 @@ Once both plugins are installed, restart Eclipse as prompted.
|
||||
|
||||
# Configure Eclipse for QMK
|
||||
## Importing the Project
|
||||
1. Click <kbd><kbd>File</kbd> > <kbd>New</kbd> > <kbd>Makefile Project with Existing Code</kbd></kbd>
|
||||
1. Click <kbd>File</kbd> > <kbd>New</kbd> > <kbd>Makefile Project with Existing Code</kbd>
|
||||
2. On the next screen:
|
||||
* Select the directory where you cloned the repository as _Existing Code Location_;
|
||||
* (Optional) Give a different name to the project¹, e.g. _QMK_ or _Quantum_;
|
||||
@@ -73,16 +73,18 @@ Once both plugins are installed, restart Eclipse as prompted.
|
||||
¹ There might be issues for importing the project with a custom name. If it does not work properly, try leaving the default project name (i.e. the name of the directory, probably `qmk_firmware`).
|
||||
|
||||
## Build Your Keyboard
|
||||
We will now configure a make target that cleans the project and builds the keymap of your choice.
|
||||
|
||||
1. On the right side of the screen, select the <kbd>Make Target</kbd> tab
|
||||
2. Expand the folder structure to the keyboard of your choice, e.g. `qmk_firmware/keyboards/ergodox`
|
||||
3. Right-click on the keyboard folder and select <kbd>New…</kbd> (or select the folder and click the <kbd>New Make Target</kbd> icon above the tree)
|
||||
4. Choose a name for your build target, e.g. _clean \<your keymap\>_
|
||||
5. Make Target: this is the arguments that you give to `make` when building from the command line. If your target name does not match these arguments, uncheck <kbd>Same as target name</kbd> and input the correct arguments, e.g. `clean <your keymap>`
|
||||
6. Leave the other options checked and click <kbd>OK</kbd>. Your make target will now appear under the selected keyboard.
|
||||
7. (Optional) Toggle the <kbd>Hide Empty Folders</kbd> icon button above the targets tree to only show your build target.
|
||||
8. Double-click the build target you created to trigger a build.
|
||||
9. Select the <kbd>Console</kbd> view at the bottom to view the running build.
|
||||
We will now change the default make target of the the project from `all` to the
|
||||
specific keyboard and keymap combination we are working on,
|
||||
e.g. `kinesis/kint36:stapelberg`. This way, project-wide actions like cleaning
|
||||
and building the project will complete quickly, instead of taking a long time or
|
||||
outright locking up Eclipse.
|
||||
|
||||
1. Focus an editor tab within the project
|
||||
2. Open the `Project` > `Properties` window, then select the `C/C++ Build` list
|
||||
entry and switch to the `Behavior` tab.
|
||||
3. Change the default `Make build target` text fields for all enabled builds
|
||||
from `all` to e.g. `kinesis/kint41:stapelberg`.
|
||||
4. Verify your setup works by selecting `Project` > `Clean...`.
|
||||
|
||||
[1]: https://en.wikipedia.org/wiki/Eclipse_(software)
|
||||
|
@@ -68,6 +68,7 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||
- bare minimum required code for a board to boot into QMK should be present
|
||||
- initialisation code for the matrix and critical devices
|
||||
- mirroring existing functionality of a commercial board (like custom keycodes and special animations etc.) should be handled through non-`default` keymaps
|
||||
- VIAL-related files or changes will not be accepted, as they are not used by QMK firmware (no VIAL-specific core code has been submitted or merged)
|
||||
- `keyboard.c`
|
||||
- empty `xxxx_xxxx_kb()` or other weak-defined default implemented functions removed
|
||||
- commented-out functions removed too
|
||||
@@ -94,6 +95,8 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||
- standard layouts preferred in these keymaps, if possible
|
||||
- submitters can have a personal (or bells-and-whistles) keymap showcasing capabilities in the same PR but it shouldn't be embedded in the 'default' keymap
|
||||
- submitters can also have a "manufacturer-matching" keymap that mirrors existing functionality of the commercial product, if porting an existing board
|
||||
- Do not include VIA json files in the PR. These do not belong in the QMK repository as they are not used by QMK firmware -- they belong in the [VIA Keyboard Repo](https://github.com/the-via/keyboards)
|
||||
|
||||
|
||||
Also, specific to ChibiOS:
|
||||
- **strong** preference to using existing ChibiOS board definitions.
|
||||
@@ -127,3 +130,9 @@ There are instructions on how to keep your fork updated here:
|
||||
|
||||
Thanks for contributing!
|
||||
```
|
||||
|
||||
## Review Process
|
||||
|
||||
In general, we want to see two (or more) approvals that are meaningful (e.g. that have inspected code) before a PR will be considered for merge. These reviews are not limited to collaborators -- any community member willing to put in the time is welcomed (and encouraged). The only difference is that your checkmark won't be green, and that's fine!
|
||||
|
||||
Additionally, PR reviews are something that is done in our free time. We are not paid nor compensated for the time we spend reviewing, as it is a labor of love. As such, this means that it can take time for us to get to your Pull Request. Things like family, or life can get in the way of us getting to PRs, and burnout is a serious concern. The QMK firmware repository averages 200 PRs opened and 200 PRs merged every month, so please have patience.
|
||||
|
@@ -3,16 +3,18 @@ This driver powers the [Split Keyboard](feature_split_keyboard.md) feature.
|
||||
|
||||
?> Serial in this context should be read as **sending information one bit at a time**, rather than implementing UART/USART/RS485/RS232 standards.
|
||||
|
||||
All drivers in this category have the following characteristics:
|
||||
* Provides data and signaling over a single conductor
|
||||
* Limited to single master, single slave
|
||||
Drivers in this category have the following characteristics:
|
||||
* bit bang and USART Half-duplex provide data and signaling over a single conductor
|
||||
* USART Full-duplex provide data and signaling over two conductors
|
||||
* They are all limited to single master and single slave communication scheme
|
||||
|
||||
## Supported Driver Types
|
||||
|
||||
| | AVR | ARM |
|
||||
|-------------------|--------------------|--------------------|
|
||||
| ----------------- | ------------------ | ------------------ |
|
||||
| bit bang | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| USART Half-duplex | | :heavy_check_mark: |
|
||||
| USART Full-duplex | | :heavy_check_mark: |
|
||||
|
||||
## Driver configuration
|
||||
|
||||
@@ -42,7 +44,7 @@ Configure the driver via your config.h:
|
||||
Along with the generic options above, you must also turn on the `PAL_USE_CALLBACKS` feature in your halconf.h.
|
||||
|
||||
### USART Half-duplex
|
||||
Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage is that this provides fast and accurate timings. `SOFT_SERIAL_PIN` for this driver is the configured USART TX pin. **The TX pin must have appropriate pull-up resistors**. To configure it, add this to your rules.mk:
|
||||
Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage over bitbang is that this provides fast and accurate timings. `SERIAL_PIN_TX` for this driver is the configured USART TX pin. As this Pin is configured in open-drain mode an **external pull-up resistor is needed to keep the line high** (resistor values of 1.5k to 8.2k are known to work). To configure it, add this to your rules.mk:
|
||||
|
||||
```make
|
||||
SERIAL_DRIVER = usart
|
||||
@@ -50,7 +52,8 @@ SERIAL_DRIVER = usart
|
||||
|
||||
Configure the hardware via your config.h:
|
||||
```c
|
||||
#define SOFT_SERIAL_PIN B6 // USART TX pin
|
||||
#define SOFT_SERIAL_PIN B6 // USART TX pin
|
||||
//#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
|
||||
#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
|
||||
// 0: about 460800 baud
|
||||
// 1: about 230400 baud (default)
|
||||
@@ -58,7 +61,7 @@ Configure the hardware via your config.h:
|
||||
// 3: about 57600 baud
|
||||
// 4: about 38400 baud
|
||||
// 5: about 19200 baud
|
||||
#define SERIAL_USART_DRIVER SD1 // USART driver of TX pin. default: SD1
|
||||
#define SERIAL_USART_DRIVER SD1 // USART driver of TX pin. default: SD1
|
||||
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
|
||||
#define SERIAL_USART_TIMEOUT 100 // USART driver timeout. default 100
|
||||
```
|
||||
@@ -68,3 +71,140 @@ You must also enable the ChibiOS `SERIAL` feature:
|
||||
* In your board's mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
|
||||
|
||||
Do note that the configuration required is for the `SERIAL` peripheral, not the `UART` peripheral.
|
||||
|
||||
### USART Full-duplex
|
||||
Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage over bitbang is that this provides fast and accurate timings. USART Full-Duplex requires two conductors **without** pull-up resistors instead of one conductor with a pull-up resistor unlike the Half-duplex driver, but it is more efficent as it uses DMA transfers, which can result in even faster transmission speeds.
|
||||
|
||||
#### Pin configuration
|
||||
|
||||
`SERIAL_USART_TX_PIN` is the USART `TX` pin, `SERIAL_USART_RX_PIN` is the USART `RX` pin. No external pull-up resistors are needed as the `TX` pin operates in push-pull mode. To use this driver the usart peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refeer to the corresponding datasheets of your MCU or find those settings in the table below.
|
||||
|
||||
#### Connecting the halves and Pin Swap
|
||||
Please note that `TX` of the master half has to be connected with the `RX` pin of the slave half and `RX` of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the pcb. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU, this feature can be enabled using `#define SERIAL_USART_PIN_SWAP` in your config.h.
|
||||
|
||||
#### Setup
|
||||
To use the driver, add this to your rules.mk:
|
||||
|
||||
```make
|
||||
SERIAL_DRIVER = usart_duplex
|
||||
```
|
||||
|
||||
Next configure the hardware via your config.h:
|
||||
|
||||
```c
|
||||
#define SERIAL_USART_TX_PIN B6 // USART TX pin
|
||||
#define SERIAL_USART_RX_PIN B7 // USART RX pin
|
||||
//#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
|
||||
//#define SERIAL_USART_PIN_SWAP // Swap TX and RX pins if keyboard is master halve.
|
||||
// Check if this feature is necessary with your keyboard design and available on the mcu.
|
||||
#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
|
||||
// 0: 460800 baud
|
||||
// 1: 230400 baud (default)
|
||||
// 2: 115200 baud
|
||||
// 3: 57600 baud
|
||||
// 4: 38400 baud
|
||||
// 5: 19200 baud
|
||||
#define SERIAL_USART_DRIVER UARTD1 // USART driver of TX and RX pin. default: UARTD1
|
||||
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
|
||||
#define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
|
||||
#define SERIAL_USART_TIMEOUT 100 // USART driver timeout. default 100
|
||||
```
|
||||
|
||||
You must also enable the ChibiOS `UART` with blocking api feature:
|
||||
* In your board's halconf.h: `#define HAL_USE_UART TRUE` and `#define UART_USE_WAIT TRUE`
|
||||
* In your board's mcuconf.h: `#define STM32_UART_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
|
||||
|
||||
Do note that the configuration required is for the `UART` peripheral, not the `SERIAL` peripheral.
|
||||
|
||||
#### Pins for USART Peripherals with Alternate Functions for selected STM32 MCUs
|
||||
|
||||
##### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf)
|
||||
|
||||
Pin Swap available: :heavy_check_mark:
|
||||
|
||||
| Pin | Function | Mode |
|
||||
| ---------- | -------- | ---- |
|
||||
| **USART1** | | |
|
||||
| PA9 | TX | AF7 |
|
||||
| PA10 | RX | AF7 |
|
||||
| PB6 | TX | AF7 |
|
||||
| PB7 | RX | AF7 |
|
||||
| PC4 | TX | AF7 |
|
||||
| PC5 | RX | AF7 |
|
||||
| PE0 | TX | AF7 |
|
||||
| PE1 | RX | AF7 |
|
||||
| **USART2** | | |
|
||||
| PA2 | TX | AF7 |
|
||||
| PA3 | RX | AF7 |
|
||||
| PA14 | TX | AF7 |
|
||||
| PA15 | RX | AF7 |
|
||||
| PB3 | TX | AF7 |
|
||||
| PB4 | RX | AF7 |
|
||||
| PD5 | TX | AF7 |
|
||||
| PD6 | RX | AF7 |
|
||||
| **USART3** | | |
|
||||
| PB10 | TX | AF7 |
|
||||
| PB11 | RX | AF7 |
|
||||
| PC10 | TX | AF7 |
|
||||
| PC11 | RX | AF7 |
|
||||
| PD8 | TX | AF7 |
|
||||
| PD9 | RX | AF7 |
|
||||
|
||||
##### STM32F072 [Datasheet](https://www.st.com/resource/en/datasheet/stm32f072c8.pdf)
|
||||
|
||||
Pin Swap available: :heavy_check_mark:
|
||||
|
||||
| Pin | Function | Mode |
|
||||
| ------ | -------- | ---- |
|
||||
| USART1 | | |
|
||||
| PA9 | TX | AF1 |
|
||||
| PA10 | RX | AF1 |
|
||||
| PB6 | TX | AF0 |
|
||||
| PB7 | RX | AF0 |
|
||||
| USART2 | | |
|
||||
| PA2 | TX | AF1 |
|
||||
| PA3 | RX | AF1 |
|
||||
| PA14 | TX | AF1 |
|
||||
| PA15 | RX | AF1 |
|
||||
| USART3 | | |
|
||||
| PB10 | TX | AF4 |
|
||||
| PB11 | RX | AF4 |
|
||||
| PC4 | TX | AF1 |
|
||||
| PC5 | RX | AF1 |
|
||||
| PC10 | TX | AF1 |
|
||||
| PC11 | RX | AF1 |
|
||||
| PD8 | TX | AF0 |
|
||||
| PD9 | RX | AF0 |
|
||||
| USART4 | | |
|
||||
| PA0 | TX | AF4 |
|
||||
| PA1 | RX | AF4 |
|
||||
|
||||
##### STM32F103 Medium Density (C8-CB) [Datasheet](https://www.st.com/resource/en/datasheet/stm32f103c8.pdf)
|
||||
|
||||
Pin Swap available: N/A
|
||||
|
||||
TX Pin is always Alternate Function Push-Pull, RX Pin is always regular input pin for any USART peripheral. **For STM32F103 no additional Alternate Function configuration is necessary. QMK is already configured.**
|
||||
|
||||
Pin remapping:
|
||||
|
||||
The pins of USART Peripherals use default Pins that can be remapped to use other pins using the AFIO registers. Default pins are marked **bold**. Add the appropriate defines to your config.h file.
|
||||
|
||||
| Pin | Function | Mode | USART_REMAP |
|
||||
| ---------- | -------- | ---- | ------------------- |
|
||||
| **USART1** | | | |
|
||||
| **PA9** | TX | AFPP | |
|
||||
| **PA10** | RX | IN | |
|
||||
| PB6 | TX | AFPP | USART1_REMAP |
|
||||
| PB7 | RX | IN | USART1_REMAP |
|
||||
| **USART2** | | | |
|
||||
| **PA2** | TX | AFPP | |
|
||||
| **PA3** | RX | IN | |
|
||||
| PD5 | TX | AFPP | USART2_REMAP |
|
||||
| PD6 | RX | IN | USART2_REMAP |
|
||||
| **USART3** | | | |
|
||||
| **PB10** | TX | AFPP | |
|
||||
| **PB11** | RX | IN | |
|
||||
| PC10 | TX | AFPP | USART3_PARTIALREMAP |
|
||||
| PC11 | RX | IN | USART3_PARTIALREMAP |
|
||||
| PD8 | TX | AFPP | USART3_FULLREMAP |
|
||||
| PD9 | RX | IN | USART3_FULLREMAP |
|
||||
|
@@ -72,20 +72,41 @@ WS2812_DRIVER = spi
|
||||
Configure the hardware via your config.h:
|
||||
```c
|
||||
#define WS2812_SPI SPID1 // default: SPID1
|
||||
#define WS2812_SPI_MOSI_PAL_MODE 5 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 5
|
||||
#define WS2812_SPI_MOSI_PAL_MODE 5 // MOSI pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 5
|
||||
#define WS2812_SPI_SCK_PIN B3 // Required for F072, may be for others -- SCK pin, see the respective datasheet for the appropriate values for your MCU. default: unspecified
|
||||
#define WS2812_SPI_SCK_PAL_MODE 5 // SCK pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 5
|
||||
```
|
||||
|
||||
You must also turn on the SPI feature in your halconf.h and mcuconf.h
|
||||
|
||||
#### Circular Buffer Mode
|
||||
Some boards may flicker while in the normal buffer mode. To fix this issue, circular buffer mode may be used to rectify the issue.
|
||||
|
||||
By default, the circular buffer mode is disabled.
|
||||
|
||||
To enable this alternative buffer mode, place this into your `config.h` file:
|
||||
```c
|
||||
#define WS2812_SPI_USE_CIRCULAR_BUFFER
|
||||
```
|
||||
|
||||
#### Setting baudrate with divisor
|
||||
To adjust the baudrate at which the SPI peripheral is configured, users will need to derive the target baudrate from the clock tree provided by STM32CubeMX.
|
||||
|
||||
Only divisors of 2, 4, 8, 16, 32, 64, 128 and 256 are supported by hardware.
|
||||
|
||||
|Define |Default|Description |
|
||||
|--------------------|-------|-------------------------------------|
|
||||
|`WS2812_SPI_DIVISOR`|`16` |SPI source clock peripheral divisor |
|
||||
|
||||
#### Testing Notes
|
||||
|
||||
While not an exhaustive list, the following table provides the scenarios that have been partially validated:
|
||||
|
||||
| | SPI1 | SPI2 | SPI3 |
|
||||
|-|-|-|-|
|
||||
| f072 | ? | B15 :heavy_check_mark: | N/A |
|
||||
| f103 | A7 :heavy_check_mark: | B15 :heavy_check_mark: | N/A |
|
||||
| f303 | A7 :heavy_check_mark: B5 :heavy_check_mark: | B15 :heavy_check_mark: | B5 :heavy_check_mark: |
|
||||
| | SPI1 | SPI2 | SPI3 |
|
||||
|------|---------------------------------------------|-----------------------------------------|-----------------------|
|
||||
| f072 | ? | B15 :heavy_check_mark: (needs SCK: B13) | N/A |
|
||||
| f103 | A7 :heavy_check_mark: | B15 :heavy_check_mark: | N/A |
|
||||
| f303 | A7 :heavy_check_mark: B5 :heavy_check_mark: | B15 :heavy_check_mark: | B5 :heavy_check_mark: |
|
||||
|
||||
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
|
||||
|
||||
@@ -102,11 +123,14 @@ Configure the hardware via your config.h:
|
||||
#define WS2812_PWM_DRIVER PWMD2 // default: PWMD2
|
||||
#define WS2812_PWM_CHANNEL 2 // default: 2
|
||||
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
|
||||
//#define WS2812_PWM_COMPLEMENTARY_OUTPUT // Define for a complementary timer output (TIMx_CHyN); omit for a normal timer output (TIMx_CHy).
|
||||
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
|
||||
#define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
|
||||
#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
|
||||
```
|
||||
|
||||
Note that using a complementary timer output (TIMx_CHyN) is possible only for advanced-control timers (TIM1, TIM8, TIM20 on STM32), and the `STM32_PWM_USE_ADVANCED` option in mcuconf.h must be set to `TRUE`. Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
|
||||
|
||||
You must also turn on the PWM feature in your halconf.h and mcuconf.h
|
||||
|
||||
#### Testing Notes
|
||||
|
@@ -14,10 +14,8 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
|
||||
#include "spi_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#include "timer.h"
|
||||
|
||||
#if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
|
||||
|
@@ -16,7 +16,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
typedef int16_t spi_status_t;
|
||||
|
||||
|
@@ -101,7 +101,11 @@
|
||||
|
||||
// Options are 12, 10, 8, and 6 bit.
|
||||
#ifndef ADC_RESOLUTION
|
||||
# define ADC_RESOLUTION ADC_CFGR1_RES_10BIT
|
||||
# ifdef ADC_CFGR_RES_10BITS // ADCv3, ADCv4
|
||||
# define ADC_RESOLUTION ADC_CFGR_RES_10BITS
|
||||
# else // ADCv1, ADCv5, or the bodge for ADCv2 above
|
||||
# define ADC_RESOLUTION ADC_CFGR1_RES_10BIT
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static ADCConfig adcCfg = {};
|
||||
@@ -119,7 +123,7 @@ static ADCConversionGroup adcConversionGroup = {
|
||||
.smpr = ADC_SAMPLING_RATE,
|
||||
#elif defined(USE_ADCV2)
|
||||
# if !defined(STM32F1XX)
|
||||
.cr2 = ADC_CR2_SWSTART, // F103 seem very unhappy with, F401 seems very unhappy without...
|
||||
.cr2 = ADC_CR2_SWSTART, // F103 seem very unhappy with, F401 seems very unhappy without...
|
||||
# endif
|
||||
.smpr2 = ADC_SMPR2_SMP_AN0(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN1(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN2(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN3(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN4(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN5(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN6(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN7(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN8(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN9(ADC_SAMPLING_RATE),
|
||||
.smpr1 = ADC_SMPR1_SMP_AN10(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN11(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN12(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN13(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN14(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN15(ADC_SAMPLING_RATE),
|
||||
@@ -161,8 +165,8 @@ __attribute__((weak)) adc_mux pinToMux(pin_t pin) {
|
||||
case B0: return TO_MUX( ADC_CHANNEL_IN12, 2 );
|
||||
case B1: return TO_MUX( ADC_CHANNEL_IN1, 2 );
|
||||
case B2: return TO_MUX( ADC_CHANNEL_IN12, 1 );
|
||||
case B12: return TO_MUX( ADC_CHANNEL_IN2, 3 );
|
||||
case B13: return TO_MUX( ADC_CHANNEL_IN3, 3 );
|
||||
case B12: return TO_MUX( ADC_CHANNEL_IN3, 3 );
|
||||
case B13: return TO_MUX( ADC_CHANNEL_IN5, 2 );
|
||||
case B14: return TO_MUX( ADC_CHANNEL_IN4, 3 );
|
||||
case B15: return TO_MUX( ADC_CHANNEL_IN5, 3 );
|
||||
case C0: return TO_MUX( ADC_CHANNEL_IN6, 0 ); // Can also be ADC2
|
||||
@@ -189,11 +193,52 @@ __attribute__((weak)) adc_mux pinToMux(pin_t pin) {
|
||||
case E15: return TO_MUX( ADC_CHANNEL_IN2, 3 );
|
||||
case F2: return TO_MUX( ADC_CHANNEL_IN10, 0 ); // Can also be ADC2
|
||||
case F4: return TO_MUX( ADC_CHANNEL_IN5, 0 );
|
||||
#elif defined(STM32F4XX) // TODO: add all pins
|
||||
#elif defined(STM32F4XX)
|
||||
case A0: return TO_MUX( ADC_CHANNEL_IN0, 0 );
|
||||
//case A1: return TO_MUX( ADC_CHANNEL_IN1, 0 );
|
||||
#elif defined(STM32F1XX) // TODO: add all pins
|
||||
case A1: return TO_MUX( ADC_CHANNEL_IN1, 0 );
|
||||
case A2: return TO_MUX( ADC_CHANNEL_IN2, 0 );
|
||||
case A3: return TO_MUX( ADC_CHANNEL_IN3, 0 );
|
||||
case A4: return TO_MUX( ADC_CHANNEL_IN4, 0 );
|
||||
case A5: return TO_MUX( ADC_CHANNEL_IN5, 0 );
|
||||
case A6: return TO_MUX( ADC_CHANNEL_IN6, 0 );
|
||||
case A7: return TO_MUX( ADC_CHANNEL_IN7, 0 );
|
||||
case B0: return TO_MUX( ADC_CHANNEL_IN8, 0 );
|
||||
case B1: return TO_MUX( ADC_CHANNEL_IN9, 0 );
|
||||
case C0: return TO_MUX( ADC_CHANNEL_IN10, 0 );
|
||||
case C1: return TO_MUX( ADC_CHANNEL_IN11, 0 );
|
||||
case C2: return TO_MUX( ADC_CHANNEL_IN12, 0 );
|
||||
case C3: return TO_MUX( ADC_CHANNEL_IN13, 0 );
|
||||
case C4: return TO_MUX( ADC_CHANNEL_IN14, 0 );
|
||||
case C5: return TO_MUX( ADC_CHANNEL_IN15, 0 );
|
||||
# if STM32_ADC_USE_ADC3
|
||||
case F3: return TO_MUX( ADC_CHANNEL_IN9, 2 );
|
||||
case F4: return TO_MUX( ADC_CHANNEL_IN14, 2 );
|
||||
case F5: return TO_MUX( ADC_CHANNEL_IN15, 2 );
|
||||
case F6: return TO_MUX( ADC_CHANNEL_IN4, 2 );
|
||||
case F7: return TO_MUX( ADC_CHANNEL_IN5, 2 );
|
||||
case F8: return TO_MUX( ADC_CHANNEL_IN6, 2 );
|
||||
case F9: return TO_MUX( ADC_CHANNEL_IN7, 2 );
|
||||
case F10: return TO_MUX( ADC_CHANNEL_IN8, 2 );
|
||||
# endif
|
||||
#elif defined(STM32F1XX)
|
||||
case A0: return TO_MUX( ADC_CHANNEL_IN0, 0 );
|
||||
case A1: return TO_MUX( ADC_CHANNEL_IN1, 0 );
|
||||
case A2: return TO_MUX( ADC_CHANNEL_IN2, 0 );
|
||||
case A3: return TO_MUX( ADC_CHANNEL_IN3, 0 );
|
||||
case A4: return TO_MUX( ADC_CHANNEL_IN4, 0 );
|
||||
case A5: return TO_MUX( ADC_CHANNEL_IN5, 0 );
|
||||
case A6: return TO_MUX( ADC_CHANNEL_IN6, 0 );
|
||||
case A7: return TO_MUX( ADC_CHANNEL_IN7, 0 );
|
||||
case B0: return TO_MUX( ADC_CHANNEL_IN8, 0 );
|
||||
case B1: return TO_MUX( ADC_CHANNEL_IN9, 0 );
|
||||
case C0: return TO_MUX( ADC_CHANNEL_IN10, 0 );
|
||||
case C1: return TO_MUX( ADC_CHANNEL_IN11, 0 );
|
||||
case C2: return TO_MUX( ADC_CHANNEL_IN12, 0 );
|
||||
case C3: return TO_MUX( ADC_CHANNEL_IN13, 0 );
|
||||
case C4: return TO_MUX( ADC_CHANNEL_IN14, 0 );
|
||||
case C5: return TO_MUX( ADC_CHANNEL_IN15, 0 );
|
||||
// STM32F103x[C-G] in 144-pin packages also have analog inputs on F6...F10, but they are on ADC3, and the
|
||||
// ChibiOS ADC driver for STM32F1xx currently supports only ADC1, therefore these pins are not usable.
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -1,13 +1,20 @@
|
||||
#include "quantum.h"
|
||||
#include "serial.h"
|
||||
#include "print.h"
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <ch.h>
|
||||
#include <hal.h>
|
||||
|
||||
#ifndef USART_CR1_M0
|
||||
# define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so
|
||||
#endif
|
||||
#include "serial_usart.h"
|
||||
|
||||
#ifndef USE_GPIOV1
|
||||
// The default PAL alternate modes are used to signal that the pins are used for USART
|
||||
@@ -20,50 +27,10 @@
|
||||
# define SERIAL_USART_DRIVER SD1
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_CR1
|
||||
# define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_CR2
|
||||
# define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_CR3
|
||||
# define SERIAL_USART_CR3 0
|
||||
#endif
|
||||
|
||||
#ifdef SOFT_SERIAL_PIN
|
||||
# define SERIAL_USART_TX_PIN SOFT_SERIAL_PIN
|
||||
#endif
|
||||
|
||||
#ifndef SELECT_SOFT_SERIAL_SPEED
|
||||
# define SELECT_SOFT_SERIAL_SPEED 1
|
||||
#endif
|
||||
|
||||
#ifdef SERIAL_USART_SPEED
|
||||
// Allow advanced users to directly set SERIAL_USART_SPEED
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 0
|
||||
# define SERIAL_USART_SPEED 460800
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 1
|
||||
# define SERIAL_USART_SPEED 230400
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 2
|
||||
# define SERIAL_USART_SPEED 115200
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 3
|
||||
# define SERIAL_USART_SPEED 57600
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 4
|
||||
# define SERIAL_USART_SPEED 38400
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 5
|
||||
# define SERIAL_USART_SPEED 19200
|
||||
#else
|
||||
# error invalid SELECT_SOFT_SERIAL_SPEED value
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_TIMEOUT
|
||||
# define SERIAL_USART_TIMEOUT 100
|
||||
#endif
|
||||
|
||||
#define HANDSHAKE_MAGIC 7
|
||||
|
||||
static inline msg_t sdWriteHalfDuplex(SerialDriver* driver, uint8_t* data, uint8_t size) {
|
||||
msg_t ret = sdWrite(driver, data, size);
|
||||
|
||||
@@ -123,6 +90,10 @@ __attribute__((weak)) void usart_init(void) {
|
||||
#else
|
||||
palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_ALTERNATE(SERIAL_USART_TX_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||
#endif
|
||||
|
||||
#if defined(USART_REMAP)
|
||||
USART_REMAP;
|
||||
#endif
|
||||
}
|
||||
|
||||
void usart_master_init(void) {
|
||||
|
90
drivers/chibios/serial_usart.h
Normal file
90
drivers/chibios/serial_usart.h
Normal file
@@ -0,0 +1,90 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
#include "serial.h"
|
||||
#include "printf.h"
|
||||
|
||||
#include <ch.h>
|
||||
#include <hal.h>
|
||||
|
||||
#ifndef USART_CR1_M0
|
||||
# define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_CR1
|
||||
# define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_CR2
|
||||
# define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_CR3
|
||||
# define SERIAL_USART_CR3 0
|
||||
#endif
|
||||
|
||||
#if defined(USART1_REMAP)
|
||||
# define USART_REMAP \
|
||||
do { \
|
||||
(AFIO->MAPR |= AFIO_MAPR_USART1_REMAP); \
|
||||
} while (0)
|
||||
#elif defined(USART2_REMAP)
|
||||
# define USART_REMAP \
|
||||
do { \
|
||||
(AFIO->MAPR |= AFIO_MAPR_USART2_REMAP); \
|
||||
} while (0)
|
||||
#elif defined(USART3_PARTIALREMAP)
|
||||
# define USART_REMAP \
|
||||
do { \
|
||||
(AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_PARTIALREMAP); \
|
||||
} while (0)
|
||||
#elif defined(USART3_FULLREMAP)
|
||||
# define USART_REMAP \
|
||||
do { \
|
||||
(AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_FULLREMAP); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef SELECT_SOFT_SERIAL_SPEED
|
||||
# define SELECT_SOFT_SERIAL_SPEED 1
|
||||
#endif
|
||||
|
||||
#ifdef SERIAL_USART_SPEED
|
||||
// Allow advanced users to directly set SERIAL_USART_SPEED
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 0
|
||||
# define SERIAL_USART_SPEED 460800
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 1
|
||||
# define SERIAL_USART_SPEED 230400
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 2
|
||||
# define SERIAL_USART_SPEED 115200
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 3
|
||||
# define SERIAL_USART_SPEED 57600
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 4
|
||||
# define SERIAL_USART_SPEED 38400
|
||||
#elif SELECT_SOFT_SERIAL_SPEED == 5
|
||||
# define SERIAL_USART_SPEED 19200
|
||||
#else
|
||||
# error invalid SELECT_SOFT_SERIAL_SPEED value
|
||||
#endif
|
||||
|
||||
#ifndef SERIAL_USART_TIMEOUT
|
||||
# define SERIAL_USART_TIMEOUT 100
|
||||
#endif
|
||||
|
||||
#define HANDSHAKE_MAGIC 7
|
261
drivers/chibios/serial_usart_duplex.c
Normal file
261
drivers/chibios/serial_usart_duplex.c
Normal file
@@ -0,0 +1,261 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "serial_usart.h"
|
||||
|
||||
#include <stdatomic.h>
|
||||
|
||||
#if !defined(USE_GPIOV1)
|
||||
// The default PAL alternate modes are used to signal that the pins are used for USART
|
||||
# if !defined(SERIAL_USART_TX_PAL_MODE)
|
||||
# define SERIAL_USART_TX_PAL_MODE 7
|
||||
# endif
|
||||
# if !defined(SERIAL_USART_RX_PAL_MODE)
|
||||
# define SERIAL_USART_RX_PAL_MODE 7
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(SERIAL_USART_DRIVER)
|
||||
# define SERIAL_USART_DRIVER UARTD1
|
||||
#endif
|
||||
|
||||
#if !defined(SERIAL_USART_TX_PIN)
|
||||
# define SERIAL_USART_TX_PIN A9
|
||||
#endif
|
||||
|
||||
#if !defined(SERIAL_USART_RX_PIN)
|
||||
# define SERIAL_USART_RX_PIN A10
|
||||
#endif
|
||||
|
||||
#define SIGNAL_HANDSHAKE_RECEIVED 0x1
|
||||
|
||||
void handle_transactions_slave(uint8_t sstd_index);
|
||||
static void receive_transaction_handshake(UARTDriver* uartp, uint16_t received_handshake);
|
||||
|
||||
/*
|
||||
* UART driver configuration structure. We use the blocking DMA enabled API and
|
||||
* the rxchar callback to receive handshake tokens but only on the slave halve.
|
||||
*/
|
||||
// clang-format off
|
||||
static UARTConfig uart_config = {
|
||||
.txend1_cb = NULL,
|
||||
.txend2_cb = NULL,
|
||||
.rxend_cb = NULL,
|
||||
.rxchar_cb = NULL,
|
||||
.rxerr_cb = NULL,
|
||||
.timeout_cb = NULL,
|
||||
.speed = (SERIAL_USART_SPEED),
|
||||
.cr1 = (SERIAL_USART_CR1),
|
||||
.cr2 = (SERIAL_USART_CR2),
|
||||
.cr3 = (SERIAL_USART_CR3)
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
static SSTD_t* Transaction_table = NULL;
|
||||
static uint8_t Transaction_table_size = 0;
|
||||
static atomic_uint_least8_t handshake = 0xFF;
|
||||
static thread_reference_t tp_target = NULL;
|
||||
|
||||
/*
|
||||
* This callback is invoked when a character is received but the application
|
||||
* was not ready to receive it, the character is passed as parameter.
|
||||
* Receive transaction table index from initiator, which doubles as basic handshake token. */
|
||||
static void receive_transaction_handshake(UARTDriver* uartp, uint16_t received_handshake) {
|
||||
/* Check if received handshake is not a valid transaction id.
|
||||
* Please note that we can still catch a seemingly valid handshake
|
||||
* i.e. a byte from a ongoing transfer which is in the allowed range.
|
||||
* So this check mainly prevents any obviously wrong handshakes and
|
||||
* subsequent wakeups of the receiving thread, which is a costly operation. */
|
||||
if (received_handshake > Transaction_table_size) {
|
||||
return;
|
||||
}
|
||||
|
||||
handshake = (uint8_t)received_handshake;
|
||||
chSysLockFromISR();
|
||||
/* Wakeup receiving thread to start a transaction. */
|
||||
chEvtSignalI(tp_target, (eventmask_t)SIGNAL_HANDSHAKE_RECEIVED);
|
||||
chSysUnlockFromISR();
|
||||
}
|
||||
|
||||
__attribute__((weak)) void usart_init(void) {
|
||||
#if defined(USE_GPIOV1)
|
||||
palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
|
||||
palSetLineMode(SERIAL_USART_RX_PIN, PAL_MODE_INPUT);
|
||||
#else
|
||||
palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_ALTERNATE(SERIAL_USART_TX_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
|
||||
palSetLineMode(SERIAL_USART_RX_PIN, PAL_MODE_ALTERNATE(SERIAL_USART_RX_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* This thread runs on the slave half and reacts to transactions initiated from the master.
|
||||
*/
|
||||
static THD_WORKING_AREA(waSlaveThread, 1024);
|
||||
static THD_FUNCTION(SlaveThread, arg) {
|
||||
(void)arg;
|
||||
chRegSetThreadName("slave_usart_tx_rx");
|
||||
|
||||
while (true) {
|
||||
/* We sleep as long as there is no handshake waiting for us. */
|
||||
chEvtWaitAny((eventmask_t)SIGNAL_HANDSHAKE_RECEIVED);
|
||||
handle_transactions_slave(handshake);
|
||||
}
|
||||
}
|
||||
|
||||
void soft_serial_target_init(SSTD_t* const sstd_table, int sstd_table_size) {
|
||||
Transaction_table = sstd_table;
|
||||
Transaction_table_size = (uint8_t)sstd_table_size;
|
||||
usart_init();
|
||||
|
||||
#if defined(USART_REMAP)
|
||||
USART_REMAP;
|
||||
#endif
|
||||
|
||||
tp_target = chThdCreateStatic(waSlaveThread, sizeof(waSlaveThread), HIGHPRIO, SlaveThread, NULL);
|
||||
|
||||
// Start receiving handshake tokens on slave halve
|
||||
uart_config.rxchar_cb = receive_transaction_handshake;
|
||||
uartStart(&SERIAL_USART_DRIVER, &uart_config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief React to transactions started by the master.
|
||||
* This version uses duplex send and receive usart pheriphals and DMA backed transfers.
|
||||
*/
|
||||
void inline handle_transactions_slave(uint8_t sstd_index) {
|
||||
size_t buffer_size = 0;
|
||||
msg_t msg = 0;
|
||||
SSTD_t* trans = &Transaction_table[sstd_index];
|
||||
|
||||
/* Send back the handshake which is XORed as a simple checksum,
|
||||
to signal that the slave is ready to receive possible transaction buffers */
|
||||
sstd_index ^= HANDSHAKE_MAGIC;
|
||||
buffer_size = (size_t)sizeof(sstd_index);
|
||||
msg = uartSendTimeout(&SERIAL_USART_DRIVER, &buffer_size, &sstd_index, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
|
||||
if (msg != MSG_OK) {
|
||||
if (trans->status) {
|
||||
*trans->status = TRANSACTION_NO_RESPONSE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Receive transaction buffer from the master. If this transaction requires it.*/
|
||||
buffer_size = (size_t)trans->initiator2target_buffer_size;
|
||||
if (buffer_size) {
|
||||
msg = uartReceiveTimeout(&SERIAL_USART_DRIVER, &buffer_size, trans->initiator2target_buffer, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
if (msg != MSG_OK) {
|
||||
if (trans->status) {
|
||||
*trans->status = TRANSACTION_NO_RESPONSE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Send transaction buffer to the master. If this transaction requires it. */
|
||||
buffer_size = (size_t)trans->target2initiator_buffer_size;
|
||||
if (buffer_size) {
|
||||
msg = uartSendFullTimeout(&SERIAL_USART_DRIVER, &buffer_size, trans->target2initiator_buffer, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
if (msg != MSG_OK) {
|
||||
if (trans->status) {
|
||||
*trans->status = TRANSACTION_NO_RESPONSE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (trans->status) {
|
||||
*trans->status = TRANSACTION_ACCEPTED;
|
||||
}
|
||||
}
|
||||
|
||||
void soft_serial_initiator_init(SSTD_t* const sstd_table, int sstd_table_size) {
|
||||
Transaction_table = sstd_table;
|
||||
Transaction_table_size = (uint8_t)sstd_table_size;
|
||||
usart_init();
|
||||
|
||||
#if defined(SERIAL_USART_PIN_SWAP)
|
||||
uart_config.cr2 |= USART_CR2_SWAP; // master has swapped TX/RX pins
|
||||
#endif
|
||||
|
||||
#if defined(USART_REMAP)
|
||||
USART_REMAP;
|
||||
#endif
|
||||
|
||||
uartStart(&SERIAL_USART_DRIVER, &uart_config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Start transaction from the master to the slave.
|
||||
* This version uses duplex send and receive usart pheriphals and DMA backed transfers.
|
||||
*
|
||||
* @param index Transaction Table index of the transaction to start.
|
||||
* @return int TRANSACTION_NO_RESPONSE in case of Timeout.
|
||||
* TRANSACTION_TYPE_ERROR in case of invalid transaction index.
|
||||
* TRANSACTION_END in case of success.
|
||||
*/
|
||||
#if !defined(SERIAL_USE_MULTI_TRANSACTION)
|
||||
int soft_serial_transaction(void) {
|
||||
uint8_t sstd_index = 0;
|
||||
#else
|
||||
int soft_serial_transaction(int index) {
|
||||
uint8_t sstd_index = index;
|
||||
#endif
|
||||
|
||||
if (sstd_index > Transaction_table_size) {
|
||||
return TRANSACTION_TYPE_ERROR;
|
||||
}
|
||||
|
||||
SSTD_t* const trans = &Transaction_table[sstd_index];
|
||||
msg_t msg = 0;
|
||||
size_t buffer_size = (size_t)sizeof(sstd_index);
|
||||
|
||||
/* Send transaction table index to the slave, which doubles as basic handshake token. */
|
||||
uartSendFullTimeout(&SERIAL_USART_DRIVER, &buffer_size, &sstd_index, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
|
||||
uint8_t sstd_index_shake = 0xFF;
|
||||
buffer_size = (size_t)sizeof(sstd_index_shake);
|
||||
|
||||
/* Receive the handshake token from the slave. The token was XORed by the slave as a simple checksum.
|
||||
If the tokens match, the master will start to send and receive possible transaction buffers. */
|
||||
msg = uartReceiveTimeout(&SERIAL_USART_DRIVER, &buffer_size, &sstd_index_shake, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
if (msg != MSG_OK || (sstd_index_shake != (sstd_index ^ HANDSHAKE_MAGIC))) {
|
||||
dprintln("USART: Handshake Failed");
|
||||
return TRANSACTION_NO_RESPONSE;
|
||||
}
|
||||
|
||||
/* Send transaction buffer to the slave. If this transaction requires it. */
|
||||
buffer_size = (size_t)trans->initiator2target_buffer_size;
|
||||
if (buffer_size) {
|
||||
msg = uartSendFullTimeout(&SERIAL_USART_DRIVER, &buffer_size, trans->initiator2target_buffer, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
if (msg != MSG_OK) {
|
||||
dprintln("USART: Send Failed");
|
||||
return TRANSACTION_NO_RESPONSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Receive transaction buffer from the slave. If this transaction requires it. */
|
||||
buffer_size = (size_t)trans->target2initiator_buffer_size;
|
||||
if (buffer_size) {
|
||||
msg = uartReceiveTimeout(&SERIAL_USART_DRIVER, &buffer_size, trans->target2initiator_buffer, TIME_MS2I(SERIAL_USART_TIMEOUT));
|
||||
if (msg != MSG_OK) {
|
||||
dprintln("USART: Receive Failed");
|
||||
return TRANSACTION_NO_RESPONSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRANSACTION_END;
|
||||
}
|
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "spi_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#include "timer.h"
|
||||
|
||||
static pin_t currentSlavePin = NO_PIN;
|
||||
|
@@ -18,7 +18,9 @@
|
||||
|
||||
#include <ch.h>
|
||||
#include <hal.h>
|
||||
#include "quantum.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
#ifndef SPI_DRIVER
|
||||
# define SPI_DRIVER SPID2
|
||||
|
@@ -27,6 +27,15 @@
|
||||
# error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
|
||||
#endif
|
||||
|
||||
#ifndef WS2812_PWM_COMPLEMENTARY_OUTPUT
|
||||
# define WS2812_PWM_OUTPUT_MODE PWM_OUTPUT_ACTIVE_HIGH
|
||||
#else
|
||||
# if !STM32_PWM_USE_ADVANCED
|
||||
# error "WS2812_PWM_COMPLEMENTARY_OUTPUT requires STM32_PWM_USE_ADVANCED == TRUE"
|
||||
# endif
|
||||
# define WS2812_PWM_OUTPUT_MODE PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH
|
||||
#endif
|
||||
|
||||
// Push Pull or Open Drain Configuration
|
||||
// Default Push Pull
|
||||
#ifndef WS2812_EXTERNAL_PULLUP
|
||||
@@ -247,7 +256,7 @@ void ws2812_init(void) {
|
||||
.channels =
|
||||
{
|
||||
[0 ... 3] = {.mode = PWM_OUTPUT_DISABLED, .callback = NULL}, // Channels default to disabled
|
||||
[WS2812_PWM_CHANNEL - 1] = {.mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL}, // Turn on the channel we care about
|
||||
[WS2812_PWM_CHANNEL - 1] = {.mode = WS2812_PWM_OUTPUT_MODE, .callback = NULL}, // Turn on the channel we care about
|
||||
},
|
||||
.cr2 = 0,
|
||||
.dier = TIM_DIER_UDE, // DMA on update event for next period
|
||||
|
@@ -16,22 +16,63 @@
|
||||
# define WS2812_SPI_MOSI_PAL_MODE 5
|
||||
#endif
|
||||
|
||||
#ifndef WS2812_SPI_SCK_PAL_MODE
|
||||
# define WS2812_SPI_SCK_PAL_MODE 5
|
||||
#endif
|
||||
|
||||
// Push Pull or Open Drain Configuration
|
||||
// Default Push Pull
|
||||
#ifndef WS2812_EXTERNAL_PULLUP
|
||||
# if defined(USE_GPIOV1)
|
||||
# define WS2812_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL
|
||||
# define WS2812_MOSI_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL
|
||||
# else
|
||||
# define WS2812_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL
|
||||
# define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL
|
||||
# endif
|
||||
#else
|
||||
# if defined(USE_GPIOV1)
|
||||
# define WS2812_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
|
||||
# define WS2812_MOSI_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
|
||||
# else
|
||||
# define WS2812_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN
|
||||
# define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// Define SPI config speed
|
||||
// baudrate should target 3.2MHz
|
||||
// F072 fpclk = 48MHz
|
||||
// 48/16 = 3Mhz
|
||||
#if WS2812_SPI_DIVISOR == 2
|
||||
# define WS2812_SPI_DIVISOR (0)
|
||||
#elif WS2812_SPI_DIVISOR == 4
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_0)
|
||||
#elif WS2812_SPI_DIVISOR == 8
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_1)
|
||||
#elif WS2812_SPI_DIVISOR == 16 // same as default
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_1 | SPI_CR1_BR_0)
|
||||
#elif WS2812_SPI_DIVISOR == 32
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_2)
|
||||
#elif WS2812_SPI_DIVISOR == 64
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_2 | SPI_CR1_BR_0)
|
||||
#elif WS2812_SPI_DIVISOR == 128
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_2 | SPI_CR1_BR_1)
|
||||
#elif WS2812_SPI_DIVISOR == 256
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0)
|
||||
#else
|
||||
# define WS2812_SPI_DIVISOR (SPI_CR1_BR_1 | SPI_CR1_BR_0) // default
|
||||
#endif
|
||||
|
||||
// Use SPI circular buffer
|
||||
#ifdef WS2812_SPI_USE_CIRCULAR_BUFFER
|
||||
# define WS2812_SPI_BUFFER_MODE 1 // circular buffer
|
||||
#else
|
||||
# define WS2812_SPI_BUFFER_MODE 0 // normal buffer
|
||||
#endif
|
||||
|
||||
#if defined(USE_GPIOV1)
|
||||
# define WS2812_SCK_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL
|
||||
#else
|
||||
# define WS2812_SCK_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_SCK_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL
|
||||
#endif
|
||||
|
||||
#define BYTES_FOR_LED_BYTE 4
|
||||
#define NB_COLORS 3
|
||||
#define BYTES_FOR_LED (BYTES_FOR_LED_BYTE * NB_COLORS)
|
||||
@@ -78,17 +119,21 @@ static void set_led_color_rgb(LED_TYPE color, int pos) {
|
||||
}
|
||||
|
||||
void ws2812_init(void) {
|
||||
palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE);
|
||||
palSetLineMode(RGB_DI_PIN, WS2812_MOSI_OUTPUT_MODE);
|
||||
|
||||
#ifdef WS2812_SPI_SCK_PIN
|
||||
palSetLineMode(WS2812_SPI_SCK_PIN, WS2812_SCK_OUTPUT_MODE);
|
||||
#endif // WS2812_SPI_SCK_PIN
|
||||
|
||||
// TODO: more dynamic baudrate
|
||||
static const SPIConfig spicfg = {
|
||||
0, NULL, PAL_PORT(RGB_DI_PIN), PAL_PAD(RGB_DI_PIN),
|
||||
SPI_CR1_BR_1 | SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us (2.25 MHz)
|
||||
};
|
||||
static const SPIConfig spicfg = {WS2812_SPI_BUFFER_MODE, NULL, PAL_PORT(RGB_DI_PIN), PAL_PAD(RGB_DI_PIN), WS2812_SPI_DIVISOR};
|
||||
|
||||
spiAcquireBus(&WS2812_SPI); /* Acquire ownership of the bus. */
|
||||
spiStart(&WS2812_SPI, &spicfg); /* Setup transfer parameters. */
|
||||
spiSelect(&WS2812_SPI); /* Slave Select assertion. */
|
||||
#ifdef WS2812_SPI_USE_CIRCULAR_BUFFER
|
||||
spiStartSend(&WS2812_SPI, sizeof(txbuf) / sizeof(txbuf[0]), txbuf);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ws2812_setleds(LED_TYPE* ledarray, uint16_t leds) {
|
||||
@@ -104,9 +149,11 @@ void ws2812_setleds(LED_TYPE* ledarray, uint16_t leds) {
|
||||
|
||||
// Send async - each led takes ~0.03ms, 50 leds ~1.5ms, animations flushing faster than send will cause issues.
|
||||
// Instead spiSend can be used to send synchronously (or the thread logic can be added back).
|
||||
#ifdef WS2812_SPI_SYNC
|
||||
#ifndef WS2812_SPI_USE_CIRCULAR_BUFFER
|
||||
# ifdef WS2812_SPI_SYNC
|
||||
spiSend(&WS2812_SPI, sizeof(txbuf) / sizeof(txbuf[0]), txbuf);
|
||||
#else
|
||||
# else
|
||||
spiStartSend(&WS2812_SPI, sizeof(txbuf) / sizeof(txbuf[0]), txbuf);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
@@ -34,14 +34,14 @@
|
||||
typedef union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
bool enable : 1;
|
||||
uint8_t feedback : 2;
|
||||
uint8_t mode : 7;
|
||||
bool buzz : 1;
|
||||
uint8_t dwell : 7;
|
||||
bool cont : 1;
|
||||
uint8_t amplitude : 8;
|
||||
uint16_t reserved : 7;
|
||||
bool enable : 1;
|
||||
uint8_t feedback : 2;
|
||||
uint8_t mode : 7;
|
||||
bool buzz : 1;
|
||||
uint8_t dwell : 7;
|
||||
bool cont : 1;
|
||||
uint8_t amplitude : 8;
|
||||
uint8_t reserved : 5;
|
||||
};
|
||||
} haptic_config_t;
|
||||
|
||||
|
@@ -68,7 +68,7 @@ uint8_t g_twi_transfer_buffer[20];
|
||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
||||
bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
|
||||
|
||||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}, {0}};
|
||||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = {0};
|
||||
bool g_led_control_registers_update_required[DRIVER_COUNT] = {false};
|
||||
|
||||
bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
||||
|
@@ -24,6 +24,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "progmem.h"
|
||||
|
||||
#include "keyboard.h"
|
||||
|
||||
// Used commands from spec sheet: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
|
||||
// for SH1106: https://www.velleman.eu/downloads/29/infosheets/sh1106_datasheet.pdf
|
||||
|
||||
@@ -71,6 +73,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define PRE_CHARGE_PERIOD 0xD9
|
||||
#define VCOM_DETECT 0xDB
|
||||
|
||||
// Advance Graphic Commands
|
||||
#define FADE_BLINK 0x23
|
||||
#define ENABLE_FADE 0x20
|
||||
#define ENABLE_BLINK 0x30
|
||||
|
||||
// Charge Pump Commands
|
||||
#define CHARGE_PUMP 0x8D
|
||||
|
||||
@@ -152,6 +159,12 @@ static void InvertCharacter(uint8_t *cursor) {
|
||||
}
|
||||
|
||||
bool oled_init(uint8_t rotation) {
|
||||
#if defined(USE_I2C) && defined(SPLIT_KEYBOARD)
|
||||
if (!is_keyboard_master()) {
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
oled_rotation = oled_init_user(rotation);
|
||||
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) {
|
||||
oled_rotation_width = OLED_DISPLAY_WIDTH;
|
||||
@@ -539,7 +552,13 @@ bool oled_on(void) {
|
||||
oled_timeout = timer_read32() + OLED_TIMEOUT;
|
||||
#endif
|
||||
|
||||
static const uint8_t PROGMEM display_on[] = {I2C_CMD, DISPLAY_ON};
|
||||
static const uint8_t PROGMEM display_on[] =
|
||||
#ifdef OLED_FADE_OUT
|
||||
{I2C_CMD, FADE_BLINK, 0x00};
|
||||
#else
|
||||
{I2C_CMD, DISPLAY_ON};
|
||||
#endif
|
||||
|
||||
if (!oled_active) {
|
||||
if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) {
|
||||
print("oled_on cmd failed\n");
|
||||
@@ -555,7 +574,13 @@ bool oled_off(void) {
|
||||
return !oled_active;
|
||||
}
|
||||
|
||||
static const uint8_t PROGMEM display_off[] = {I2C_CMD, DISPLAY_OFF};
|
||||
static const uint8_t PROGMEM display_off[] =
|
||||
#ifdef OLED_FADE_OUT
|
||||
{I2C_CMD, FADE_BLINK, ENABLE_FADE | OLED_FADE_OUT_INTERVAL};
|
||||
#else
|
||||
{I2C_CMD, DISPLAY_OFF};
|
||||
#endif
|
||||
|
||||
if (oled_active) {
|
||||
if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) {
|
||||
print("oled_off cmd failed\n");
|
||||
|
@@ -154,10 +154,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(OLED_FADE_OUT_INTERVAL)
|
||||
# define OLED_FADE_OUT_INTERVAL 0x00
|
||||
#endif
|
||||
|
||||
#if OLED_FADE_OUT_INTERVAL > 0x0F || OLED_FADE_OUT_INTERVAL < 0x00
|
||||
# error OLED_FADE_OUT_INTERVAL must be between 0x00 and 0x0F
|
||||
#endif
|
||||
|
||||
#if !defined(OLED_I2C_TIMEOUT)
|
||||
# define OLED_I2C_TIMEOUT 100
|
||||
#endif
|
||||
|
||||
#if !defined(OLED_UPDATE_INTERVAL) && defined(SPLIT_KEYBOARD)
|
||||
# define OLED_UPDATE_INTERVAL 50
|
||||
#endif
|
||||
|
||||
typedef struct __attribute__((__packed__)) {
|
||||
uint8_t *current_element;
|
||||
uint16_t remaining_element_count;
|
||||
|
@@ -206,6 +206,8 @@ void clear_screen(void) {
|
||||
send_data(0);
|
||||
}
|
||||
}
|
||||
|
||||
memset(micro_oled_screen_current, 0, LCDWIDTH * LCDHEIGHT / 8);
|
||||
}
|
||||
|
||||
/** \brief Clear SSD1306's memory.
|
||||
|
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
Copyright 2019 @foostan
|
||||
Copyright 2020 Drashna Jaelre <@drashna>
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,13 +14,21 @@ GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "1337.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef SSD1306OLED
|
||||
# define USE_I2C
|
||||
void eeconfig_init_kb(void) {
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_enable();
|
||||
backlight_level(5);
|
||||
#endif
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_enable();
|
||||
rgblight_sethsv(0, 255, 255);
|
||||
#ifdef RGBLIGHT_ANIMATIONS
|
||||
rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(OLED_DRIVER_ENABLE) && (defined(USE_I2C) || defined(USE_MATRIX_I2C))
|
||||
# error Cannot use both legacy i2c driver and new i2c_master driver at the same time. Undefine USE_I2C and/or USE_MATRIX_I2C
|
||||
#endif
|
||||
eeconfig_update_kb(0);
|
||||
eeconfig_init_user();
|
||||
}
|
38
keyboards/0xcb/1337/1337.h
Normal file
38
keyboards/0xcb/1337/1337.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
/* This a shortcut to help you visually see your layout.
|
||||
*
|
||||
* The first section contains all of the arguments representing the physical
|
||||
* layout of the board and position of the keys.
|
||||
*
|
||||
* The second converts the arguments into a two-dimensional array which
|
||||
* represents the switch matrix.
|
||||
*/
|
||||
#define LAYOUT( \
|
||||
KA1, KA2, KA3, \
|
||||
KB1, KB2, KB3, \
|
||||
KC1, KC2, KC3 \
|
||||
) \
|
||||
{ \
|
||||
{ KA1, KA2, KA3 }, \
|
||||
{ KB1, KB2, KB3 }, \
|
||||
{ KC1, KC2, KC3 } \
|
||||
}
|
77
keyboards/0xcb/1337/config.h
Normal file
77
keyboards/0xcb/1337/config.h
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0xCB00
|
||||
#define PRODUCT_ID 0x1337
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER 0xCB
|
||||
#define PRODUCT 1337
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 3
|
||||
#define MATRIX_COLS 3
|
||||
|
||||
/* Keyboard Matrix Assignments */
|
||||
#define DIRECT_PINS { \
|
||||
{ D2, D4, F4 }, \
|
||||
{ D7, B1, B3 }, \
|
||||
{ E6, B4, B2 } \
|
||||
}
|
||||
#define TAP_CODE_DELAY 10
|
||||
#define ENCODER_DIRECTION_FLIP
|
||||
#define ENCODER_RESOLUTION 4
|
||||
#define ENCODERS_PAD_A { F5 }
|
||||
#define ENCODERS_PAD_B { F6 }
|
||||
|
||||
#define BACKLIGHT_PIN B5
|
||||
#define BACKLIGHT_BREATHING
|
||||
#define BACKLIGHT_LEVELS 7
|
||||
|
||||
#define RGB_DI_PIN D3
|
||||
#ifdef RGB_DI_PIN
|
||||
#define RGBLED_NUM 5
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
#define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
||||
#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
||||
// #define RGBLIGHT_ANIMATIONS
|
||||
#define RGBLIGHT_EFFECT_BREATHING
|
||||
#define RGBLIGHT_EFFECT_SNAKE
|
||||
#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
||||
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
||||
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
||||
#endif
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
/* Oled Size */
|
||||
#define OLED_DISPLAY_128X64
|
||||
#define OLED_FONT_END 255
|
||||
#define OLED_FONT_H "gfxfont.c"
|
||||
|
||||
/* QMK DFU */
|
||||
#define QMK_LED B0
|
276
keyboards/0xcb/1337/gfxfont.c
Normal file
276
keyboards/0xcb/1337/gfxfont.c
Normal file
@@ -0,0 +1,276 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "progmem.h"
|
||||
|
||||
static const unsigned char font[] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
|
||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
|
||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
|
||||
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
|
||||
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
|
||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
|
||||
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
|
||||
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
|
||||
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
|
||||
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
|
||||
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
|
||||
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
|
||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
|
||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
|
||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
|
||||
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
|
||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
|
||||
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
|
||||
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
|
||||
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
|
||||
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
|
||||
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
|
||||
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
|
||||
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
|
||||
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
|
||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
|
||||
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
|
||||
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
|
||||
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
|
||||
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
|
||||
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
|
||||
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
|
||||
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
|
||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
|
||||
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
|
||||
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
|
||||
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
|
||||
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
|
||||
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
|
||||
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
|
||||
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
|
||||
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
|
||||
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
||||
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
|
||||
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
|
||||
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
|
||||
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
|
||||
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
|
||||
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
|
||||
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
|
||||
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
|
||||
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
|
||||
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
|
||||
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
|
||||
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
|
||||
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
|
||||
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
|
||||
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
|
||||
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
|
||||
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
|
||||
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
||||
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
|
||||
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
|
||||
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
|
||||
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
|
||||
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
|
||||
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
|
||||
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
|
||||
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
|
||||
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
|
||||
0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
|
||||
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
|
||||
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
|
||||
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
|
||||
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
|
||||
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
|
||||
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
|
||||
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
|
||||
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
|
||||
0x4C, 0x10, 0x10, 0x10, 0x7C, 0x00,
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
|
||||
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
|
||||
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
|
||||
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
|
||||
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
|
||||
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
|
||||
0x00, 0xE0, 0xFC, 0x1E, 0x06, 0xC6,
|
||||
0xC6, 0x06, 0x1E, 0xFC, 0xE0, 0x00,
|
||||
0x00, 0x00, 0x60, 0xE0, 0x80, 0x00,
|
||||
0x00, 0x80, 0xE0, 0x60, 0x00, 0x00,
|
||||
0x00, 0x00, 0xE0, 0xF8, 0x3C, 0x0E,
|
||||
0x06, 0x06, 0x06, 0x0E, 0x0C, 0x00,
|
||||
0x00, 0x00, 0xFE, 0xFE, 0x86, 0x86,
|
||||
0x86, 0x86, 0x8C, 0x78, 0x70, 0x00,
|
||||
0x00, 0x0E, 0x0E, 0x06, 0x06, 0xFE,
|
||||
0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x0C, 0x8E, 0x86, 0x86, 0x86,
|
||||
0x86, 0x86, 0xCE, 0xFE, 0x7C, 0x00,
|
||||
0x00, 0x06, 0x06, 0x06, 0x06, 0x06,
|
||||
0x06, 0xE6, 0xE6, 0x3E, 0x3E, 0x00,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x06, 0x78, 0x80, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xE0, 0x1C, 0x02, 0x01, 0x04, 0x18,
|
||||
0x00, 0x00, 0x00, 0x02, 0x0C, 0x00,
|
||||
0x80, 0x80, 0x71, 0x02, 0x1C, 0xE0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x80, 0x78, 0x06, 0x01, 0x01,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
||||
0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC,
|
||||
0xFC, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0,
|
||||
0x00, 0x00, 0x40, 0xF0, 0xFC, 0xFF,
|
||||
0xFF, 0xFC, 0xF0, 0xC0, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x07, 0x3F, 0x78, 0x60, 0x63,
|
||||
0x63, 0x60, 0x78, 0x3F, 0x07, 0x00,
|
||||
0x00, 0x00, 0x60, 0x79, 0x19, 0x06,
|
||||
0x06, 0x19, 0x79, 0x60, 0x00, 0x00,
|
||||
0x00, 0x00, 0x07, 0x1F, 0x3C, 0x70,
|
||||
0x60, 0x60, 0x60, 0x70, 0x30, 0x00,
|
||||
0x00, 0x00, 0x7F, 0x7F, 0x61, 0x61,
|
||||
0x61, 0x61, 0x31, 0x1E, 0x0E, 0x00,
|
||||
0x00, 0x60, 0x60, 0x60, 0x60, 0x7F,
|
||||
0x7F, 0x60, 0x60, 0x60, 0x60, 0x00,
|
||||
0x00, 0x30, 0x71, 0x61, 0x61, 0x61,
|
||||
0x61, 0x61, 0x73, 0x7F, 0x3E, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F,
|
||||
0x7F, 0x01, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x03, 0xBC,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x87, 0x38, 0x40, 0x80, 0x08, 0x08,
|
||||
0x08, 0x04, 0x04, 0x02, 0x02, 0x01,
|
||||
0x00, 0x00, 0x80, 0x40, 0x38, 0x87,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0xBC, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
|
||||
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
|
||||
0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F,
|
||||
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
|
||||
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0,
|
||||
0xFC, 0xFE, 0xFC, 0xF8, 0xF9, 0xF3,
|
||||
0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||
0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x70, 0xD0, 0x70, 0x00, 0x07, 0x05,
|
||||
0x07, 0x02, 0x02, 0x82, 0xC2, 0x42,
|
||||
0x7E, 0xC0, 0xC0, 0xC0, 0x40, 0x7E,
|
||||
0x42, 0xC2, 0x82, 0x02, 0x02, 0x07,
|
||||
0x05, 0x07, 0x00, 0x70, 0xD0, 0x70,
|
||||
0x00, 0x00, 0x00, 0x80, 0x40, 0x20,
|
||||
0x10, 0xC8, 0xC8, 0x84, 0x04, 0x02,
|
||||
0x02, 0x02, 0x02, 0xC2, 0xC2, 0xC2,
|
||||
0xC2, 0xC4, 0xC4, 0xC8, 0x88, 0x90,
|
||||
0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0xFD, 0x05, 0x04, 0x04, 0x04,
|
||||
0x1F, 0x30, 0x40, 0x87, 0x9F, 0x1F,
|
||||
0x01, 0x81, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x1E, 0x9E, 0x86, 0x40, 0x30, 0x1F,
|
||||
0x04, 0x04, 0x04, 0x05, 0xFD, 0x01,
|
||||
0x00, 0x0F, 0x70, 0x80, 0x00, 0x00,
|
||||
0x00, 0x00, 0x80, 0xE0, 0xF8, 0x3E,
|
||||
0x0F, 0x03, 0x00, 0xFF, 0xFF, 0x01,
|
||||
0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x80, 0x70, 0x0F, 0x00,
|
||||
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
|
||||
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x00,
|
||||
0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x07, 0x03, 0x03,
|
||||
0x03, 0x03, 0x07, 0xFF, 0xFF, 0xFF,
|
||||
0xDF, 0x9F, 0x3F, 0x3C, 0x70, 0x40,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xC0, 0x5F, 0xD0, 0x90, 0x90, 0x90,
|
||||
0xFC, 0x06, 0x01, 0xF8, 0xFC, 0xFC,
|
||||
0xC0, 0xC0, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x3C, 0x3C, 0x30, 0x01, 0x06, 0xFC,
|
||||
0x90, 0x90, 0x90, 0xD0, 0x5F, 0xC0,
|
||||
0x00, 0xF0, 0x0E, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x01, 0x03, 0x07, 0x1E,
|
||||
0x3C, 0xF0, 0xE0, 0xFF, 0xFF, 0x80,
|
||||
0x80, 0x80, 0x80, 0xC1, 0xC1, 0xFF,
|
||||
0x3E, 0x00, 0x01, 0x0E, 0xF0, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x05, 0x07, 0x00, 0x70, 0x50,
|
||||
0x70, 0x20, 0x20, 0x20, 0x21, 0x3F,
|
||||
0x01, 0x61, 0x9F, 0x9F, 0x61, 0x01,
|
||||
0x3F, 0x21, 0x20, 0x20, 0x20, 0x70,
|
||||
0x50, 0x70, 0x00, 0x07, 0x05, 0x07,
|
||||
0x00, 0x00, 0x00, 0x01, 0x02, 0x04,
|
||||
0x08, 0x10, 0x13, 0x23, 0x20, 0x40,
|
||||
0x40, 0x40, 0x40, 0x43, 0x43, 0x40,
|
||||
0x40, 0x20, 0x20, 0x10, 0x10, 0x08,
|
||||
0x04, 0x02, 0x01, 0x00, 0x00, 0x00,
|
||||
0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F,
|
||||
0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
|
||||
0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F,
|
||||
0x3F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF,
|
||||
0x00, 0x80, 0xC0, 0x70, 0x7C, 0x3F,
|
||||
0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x07,
|
||||
0x07, 0x03, 0x03, 0x02, 0x00, 0x00,
|
||||
0x00, 0x00, 0x02, 0x03, 0x03, 0x07,
|
||||
0x07, 0x07, 0x0F, 0x0F, 0x1E, 0x3E,
|
||||
0x3C, 0x7C, 0x70, 0xC0, 0x80, 0x00,
|
||||
};
|
22
keyboards/0xcb/1337/info.json
Normal file
22
keyboards/0xcb/1337/info.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"keyboard_name": "0xCB 1337",
|
||||
"url": "https://0xCB.dev",
|
||||
"maintainer": "Conor-Burns",
|
||||
"width": 3,
|
||||
"height": 3,
|
||||
"layouts": {
|
||||
"LAYOUT": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
169
keyboards/0xcb/1337/keymaps/default/keymap.c
Normal file
169
keyboards/0xcb/1337/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include QMK_KEYBOARD_H
|
||||
#include <stdio.h>
|
||||
|
||||
enum layer_names {
|
||||
_HOME,
|
||||
_MISC,
|
||||
_RGB,
|
||||
_BLED
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_HOME] = LAYOUT(
|
||||
KC_MPRV, KC_MNXT, KC_MPLY,
|
||||
KC_PGUP, KC_PGDN, TO(3),
|
||||
KC_HOME, KC_END, TO(1)
|
||||
),
|
||||
[_MISC] = LAYOUT(
|
||||
_______, _______, _______,
|
||||
_______, _______, TO(0),
|
||||
_______, _______, TO(2)
|
||||
),
|
||||
[_RGB] = LAYOUT(
|
||||
RGB_HUI, RGB_HUD, RGB_MOD,
|
||||
RGB_SAI, RGB_SAD, TO(1),
|
||||
RGB_SPI, RGB_SPD, TO(3)
|
||||
),
|
||||
[_BLED] = LAYOUT(
|
||||
BL_STEP, BL_BRTG, BL_TOGG,
|
||||
BL_ON, BL_OFF, TO(2),
|
||||
BL_INC, BL_DEC, TO(0)
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
/* rotary encoder (SW3) - add more else if blocks for more granular layer control */
|
||||
#ifdef ENCODER_ENABLE
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (IS_LAYER_ON(_RGB)) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (clockwise) {
|
||||
rgblight_increase_val();
|
||||
} else {
|
||||
rgblight_decrease_val();
|
||||
}
|
||||
#endif
|
||||
} else if (IS_LAYER_ON(_BLED)) {
|
||||
if (clockwise) {
|
||||
backlight_increase();
|
||||
} else {
|
||||
backlight_decrease();
|
||||
}
|
||||
} else {
|
||||
if (clockwise) {
|
||||
tap_code(KC_VOLU);
|
||||
} else {
|
||||
tap_code(KC_VOLD);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* oled stuff :) */
|
||||
#ifdef OLED_DRIVER_ENABLE
|
||||
uint16_t startup_timer;
|
||||
|
||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
||||
startup_timer = timer_read();
|
||||
return rotation;
|
||||
}
|
||||
|
||||
static void render_logo(void) {
|
||||
static const char PROGMEM raw_logo[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 1, 2, 4, 2, 1, 1, 1, 1, 1, 1,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,248, 5, 2, 0, 0, 0, 0, 0, 0,128,192,192,224,224,112,120, 56, 63, 28, 14, 14, 14,254, 14, 14, 30, 28, 63, 56,120,112,224,224,192,128, 0, 0, 0, 0, 0, 0, 0, 2, 5,248, 5, 2, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,160, 19,162, 66, 66, 66, 66, 66, 66, 66,255,255,255, 0, 0, 0,252,254,254,192,192,192,192,255, 0, 0, 0, 62, 62, 60, 60, 0, 0, 1,255,255,255, 66, 66, 66, 66, 66, 66, 66,162, 19,160, 64, 0,
|
||||
0, 0, 0,128, 64, 64, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192, 64, 64,192,128, 0, 0,192, 64, 64,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64,192, 0, 0, 0, 0, 0,128,192, 64, 64,192,128, 0, 0,128,192, 64, 64,192,128, 0, 0, 64, 64, 64, 64, 64,192, 0, 0, 0, 0, 0,249, 8, 8, 8, 8, 8, 8, 8, 8,127,255,255,192,128,128, 15, 31, 31, 1, 1, 1, 1,255, 0, 0, 0, 30, 30, 14, 14,128,192,192,255,255,127, 8, 8, 8, 8, 8, 8, 8, 8,249, 0, 0, 0,
|
||||
0, 0, 31, 49, 64, 78, 64, 49, 31, 0, 0, 97, 22, 8, 22, 97, 0, 0, 31, 49, 96, 64, 64, 96, 32, 0, 0,127, 68, 68,100, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64,127, 64, 64, 0, 0, 0, 32,100, 68, 68,110, 59, 0, 0, 32,100, 68, 68,110, 59, 0, 0, 0, 0, 0,126, 3, 1, 0, 0, 0, 8, 20, 35, 20, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 7, 15,254, 30, 28, 28, 28,255, 28, 28, 28, 30,254, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 17, 10, 4, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 40, 68, 40, 16, 16, 16, 16, 16, 16, 31, 0, 0, 16, 40, 71, 40, 16, 0, 0, 31, 16, 16, 16, 16, 16, 16, 40, 68, 40, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
oled_write_raw_P(raw_logo, sizeof(raw_logo));
|
||||
}
|
||||
static void render_logo_font(void) {
|
||||
static const char PROGMEM qmk_logo[] = {
|
||||
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xCB, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0xCB, 0xCB, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
|
||||
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xCB, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xCB, 0xCB, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
|
||||
0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xCB, 0x88, 0x89, 0x8A, 0x8B, 0x8A, 0x8B, 0x8C, 0x8D, 0xCB, 0xCB, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5,
|
||||
0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xCB, 0xA8, 0xA9, 0xAA, 0xAB, 0xAA, 0xAB, 0xAC, 0xAD, 0xCB, 0xCB, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0x00
|
||||
};
|
||||
|
||||
oled_write_P(qmk_logo, false);
|
||||
}
|
||||
/* Shows the name of the current layer and locks for the host (CAPS etc.) */
|
||||
static void render_info(void) {
|
||||
oled_write_P(PSTR("Layer: "), false);
|
||||
|
||||
switch (get_highest_layer(layer_state)) {
|
||||
case _HOME:
|
||||
oled_write_ln_P(PSTR("HOME"), false);
|
||||
break;
|
||||
case _MISC:
|
||||
oled_write_ln_P(PSTR("MISC"), false);
|
||||
break;
|
||||
case _RGB:
|
||||
oled_write_ln_P(PSTR("RGB"), false);
|
||||
break;
|
||||
case _BLED:
|
||||
oled_write_ln_P(PSTR("Backlight"), false);
|
||||
break;
|
||||
default:
|
||||
oled_write_ln_P(PSTR("Undefined"), false);
|
||||
}
|
||||
led_t led_state = host_keyboard_led_state();
|
||||
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
|
||||
oled_write_ln_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
|
||||
}
|
||||
static void render_rgbled_status(bool full) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
char buf[30];
|
||||
if (RGBLIGHT_MODES > 1 && rgblight_is_enabled() && get_highest_layer(layer_state) == _RGB) {
|
||||
if (full) {
|
||||
snprintf(buf, sizeof(buf), "RGB mode %2d: %d,%d,%d \n",
|
||||
rgblight_get_mode(),
|
||||
rgblight_get_hue()/RGBLIGHT_HUE_STEP,
|
||||
rgblight_get_sat()/RGBLIGHT_SAT_STEP,
|
||||
rgblight_get_val()/RGBLIGHT_VAL_STEP);
|
||||
} else {
|
||||
snprintf(buf, sizeof(buf), "[%2d] ", rgblight_get_mode());
|
||||
}
|
||||
oled_write(buf, false);
|
||||
} else {
|
||||
oled_write_ln_P(PSTR("\n"), false);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void oled_task_user(void) {
|
||||
static bool finished_timer = false;
|
||||
if (!finished_timer && (timer_elapsed(startup_timer) < 1000)) {
|
||||
render_logo();
|
||||
} else {
|
||||
if (!finished_timer) {
|
||||
oled_clear();
|
||||
finished_timer = true;
|
||||
}
|
||||
render_info();
|
||||
render_rgbled_status(true);
|
||||
render_logo_font();
|
||||
}
|
||||
}
|
||||
#endif
|
169
keyboards/0xcb/1337/keymaps/jakob/keymap.c
Normal file
169
keyboards/0xcb/1337/keymaps/jakob/keymap.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include QMK_KEYBOARD_H
|
||||
#include <stdio.h>
|
||||
|
||||
enum layer_names {
|
||||
_HOME,
|
||||
_MISC,
|
||||
_RGB,
|
||||
_BLED
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_HOME] = LAYOUT(
|
||||
KC_MPRV, KC_MNXT, KC_MPLY,
|
||||
KC_PGUP, KC_PGDN, TO(3),
|
||||
KC_HOME, KC_END, TO(1)
|
||||
),
|
||||
[_MISC] = LAYOUT(
|
||||
_______, _______, _______,
|
||||
_______, _______, TO(0),
|
||||
_______, _______, TO(2)
|
||||
),
|
||||
[_RGB] = LAYOUT(
|
||||
RGB_HUI, RGB_HUD, RGB_MOD,
|
||||
RGB_SAI, RGB_SAD, TO(1),
|
||||
RGB_SPI, RGB_SPD, TO(3)
|
||||
),
|
||||
[_BLED] = LAYOUT(
|
||||
BL_STEP, BL_BRTG, BL_TOGG,
|
||||
BL_ON, BL_OFF, TO(2),
|
||||
BL_INC, BL_DEC, TO(0)
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
/* rotary encoder (SW3) - add more else if blocks for more granular layer control */
|
||||
#ifdef ENCODER_ENABLE
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (IS_LAYER_ON(_RGB)) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (clockwise) {
|
||||
rgblight_increase_val();
|
||||
} else {
|
||||
rgblight_decrease_val();
|
||||
}
|
||||
#endif
|
||||
} else if (IS_LAYER_ON(_BLED)) {
|
||||
if (clockwise) {
|
||||
backlight_increase();
|
||||
} else {
|
||||
backlight_decrease();
|
||||
}
|
||||
} else {
|
||||
if (clockwise) {
|
||||
tap_code16(C(A(KC_UP)));
|
||||
} else {
|
||||
tap_code16(C(A(KC_DOWN)));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* oled stuff :) */
|
||||
#ifdef OLED_DRIVER_ENABLE
|
||||
uint16_t startup_timer;
|
||||
|
||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
||||
startup_timer = timer_read();
|
||||
return rotation;
|
||||
}
|
||||
|
||||
static void render_logo(void) {
|
||||
static const char PROGMEM raw_logo[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 1, 2, 4, 2, 1, 1, 1, 1, 1, 1,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,248, 5, 2, 0, 0, 0, 0, 0, 0,128,192,192,224,224,112,120, 56, 63, 28, 14, 14, 14,254, 14, 14, 30, 28, 63, 56,120,112,224,224,192,128, 0, 0, 0, 0, 0, 0, 0, 2, 5,248, 5, 2, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,160, 19,162, 66, 66, 66, 66, 66, 66, 66,255,255,255, 0, 0, 0,252,254,254,192,192,192,192,255, 0, 0, 0, 62, 62, 60, 60, 0, 0, 1,255,255,255, 66, 66, 66, 66, 66, 66, 66,162, 19,160, 64, 0,
|
||||
0, 0, 0,128, 64, 64, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192, 64, 64,192,128, 0, 0,192, 64, 64,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64,192, 0, 0, 0, 0, 0,128,192, 64, 64,192,128, 0, 0,128,192, 64, 64,192,128, 0, 0, 64, 64, 64, 64, 64,192, 0, 0, 0, 0, 0,249, 8, 8, 8, 8, 8, 8, 8, 8,127,255,255,192,128,128, 15, 31, 31, 1, 1, 1, 1,255, 0, 0, 0, 30, 30, 14, 14,128,192,192,255,255,127, 8, 8, 8, 8, 8, 8, 8, 8,249, 0, 0, 0,
|
||||
0, 0, 31, 49, 64, 78, 64, 49, 31, 0, 0, 97, 22, 8, 22, 97, 0, 0, 31, 49, 96, 64, 64, 96, 32, 0, 0,127, 68, 68,100, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64,127, 64, 64, 0, 0, 0, 32,100, 68, 68,110, 59, 0, 0, 32,100, 68, 68,110, 59, 0, 0, 0, 0, 0,126, 3, 1, 0, 0, 0, 8, 20, 35, 20, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 7, 15,254, 30, 28, 28, 28,255, 28, 28, 28, 30,254, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 17, 10, 4, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 40, 68, 40, 16, 16, 16, 16, 16, 16, 31, 0, 0, 16, 40, 71, 40, 16, 0, 0, 31, 16, 16, 16, 16, 16, 16, 40, 68, 40, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
oled_write_raw_P(raw_logo, sizeof(raw_logo));
|
||||
}
|
||||
static void render_logo_font(void) {
|
||||
static const char PROGMEM qmk_logo[] = {
|
||||
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xCB, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0xCB, 0xCB, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
|
||||
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xCB, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xCB, 0xCB, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
|
||||
0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xCB, 0x88, 0x89, 0x8A, 0x8B, 0x8A, 0x8B, 0x8C, 0x8D, 0xCB, 0xCB, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5,
|
||||
0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xCB, 0xA8, 0xA9, 0xAA, 0xAB, 0xAA, 0xAB, 0xAC, 0xAD, 0xCB, 0xCB, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0x00
|
||||
};
|
||||
|
||||
oled_write_P(qmk_logo, false);
|
||||
}
|
||||
/* Shows the name of the current layer and locks for the host (CAPS etc.) */
|
||||
static void render_info(void) {
|
||||
oled_write_P(PSTR("Layer: "), false);
|
||||
|
||||
switch (get_highest_layer(layer_state)) {
|
||||
case _HOME:
|
||||
oled_write_ln_P(PSTR("HOME"), false);
|
||||
break;
|
||||
case _MISC:
|
||||
oled_write_ln_P(PSTR("MISC"), false);
|
||||
break;
|
||||
case _RGB:
|
||||
oled_write_ln_P(PSTR("RGB"), false);
|
||||
break;
|
||||
case _BLED:
|
||||
oled_write_ln_P(PSTR("Backlight"), false);
|
||||
break;
|
||||
default:
|
||||
oled_write_ln_P(PSTR("Undefined"), false);
|
||||
}
|
||||
led_t led_state = host_keyboard_led_state();
|
||||
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
|
||||
oled_write_ln_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
|
||||
}
|
||||
static void render_rgbled_status(bool full) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
char buf[30];
|
||||
if (RGBLIGHT_MODES > 1 && rgblight_is_enabled() && get_highest_layer(layer_state) == _RGB) {
|
||||
if (full) {
|
||||
snprintf(buf, sizeof(buf), "RGB mode %2d: %d,%d,%d \n",
|
||||
rgblight_get_mode(),
|
||||
rgblight_get_hue()/RGBLIGHT_HUE_STEP,
|
||||
rgblight_get_sat()/RGBLIGHT_SAT_STEP,
|
||||
rgblight_get_val()/RGBLIGHT_VAL_STEP);
|
||||
} else {
|
||||
snprintf(buf, sizeof(buf), "[%2d] ", rgblight_get_mode());
|
||||
}
|
||||
oled_write(buf, false);
|
||||
} else {
|
||||
oled_write_ln_P(PSTR("\n"), false);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void oled_task_user(void) {
|
||||
static bool finished_timer = false;
|
||||
if (!finished_timer && (timer_elapsed(startup_timer) < 1000)) {
|
||||
render_logo();
|
||||
} else {
|
||||
if (!finished_timer) {
|
||||
oled_clear();
|
||||
finished_timer = true;
|
||||
}
|
||||
render_info();
|
||||
render_rgbled_status(true);
|
||||
render_logo_font();
|
||||
}
|
||||
}
|
||||
#endif
|
169
keyboards/0xcb/1337/keymaps/via/keymap.c
Normal file
169
keyboards/0xcb/1337/keymaps/via/keymap.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include QMK_KEYBOARD_H
|
||||
#include <stdio.h>
|
||||
|
||||
enum layer_names {
|
||||
_HOME,
|
||||
_MISC,
|
||||
_RGB,
|
||||
_BLED
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_HOME] = LAYOUT(
|
||||
KC_MPRV, KC_MNXT, KC_MPLY,
|
||||
KC_PGUP, KC_PGDN, TO(3),
|
||||
KC_HOME, KC_END, TO(1)
|
||||
),
|
||||
[_MISC] = LAYOUT(
|
||||
_______, _______, _______,
|
||||
_______, _______, TO(0),
|
||||
_______, _______, TO(2)
|
||||
),
|
||||
[_RGB] = LAYOUT(
|
||||
RGB_HUI, RGB_HUD, RGB_MOD,
|
||||
RGB_SAI, RGB_SAD, TO(1),
|
||||
RGB_SPI, RGB_SPD, TO(3)
|
||||
),
|
||||
[_BLED] = LAYOUT(
|
||||
BL_STEP, BL_BRTG, BL_TOGG,
|
||||
BL_ON, BL_OFF, TO(2),
|
||||
BL_INC, BL_DEC, TO(0)
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
/* rotary encoder (SW3) - add more else if blocks for more granular layer control */
|
||||
#ifdef ENCODER_ENABLE
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (IS_LAYER_ON(_RGB)) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (clockwise) {
|
||||
rgblight_increase_val();
|
||||
} else {
|
||||
rgblight_decrease_val();
|
||||
}
|
||||
#endif
|
||||
} else if (IS_LAYER_ON(_BLED)) {
|
||||
if (clockwise) {
|
||||
backlight_increase();
|
||||
} else {
|
||||
backlight_decrease();
|
||||
}
|
||||
} else {
|
||||
if (clockwise) {
|
||||
tap_code(KC_VOLU);
|
||||
} else {
|
||||
tap_code(KC_VOLD);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* oled stuff :) */
|
||||
#ifdef OLED_DRIVER_ENABLE
|
||||
uint16_t startup_timer;
|
||||
|
||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
||||
startup_timer = timer_read();
|
||||
return rotation;
|
||||
}
|
||||
|
||||
static void render_logo(void) {
|
||||
static const char PROGMEM raw_logo[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 1, 2, 4, 2, 1, 1, 1, 1, 1, 1,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,248, 5, 2, 0, 0, 0, 0, 0, 0,128,192,192,224,224,112,120, 56, 63, 28, 14, 14, 14,254, 14, 14, 30, 28, 63, 56,120,112,224,224,192,128, 0, 0, 0, 0, 0, 0, 0, 2, 5,248, 5, 2, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,160, 19,162, 66, 66, 66, 66, 66, 66, 66,255,255,255, 0, 0, 0,252,254,254,192,192,192,192,255, 0, 0, 0, 62, 62, 60, 60, 0, 0, 1,255,255,255, 66, 66, 66, 66, 66, 66, 66,162, 19,160, 64, 0,
|
||||
0, 0, 0,128, 64, 64, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192, 64, 64,192,128, 0, 0,192, 64, 64,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64,192, 0, 0, 0, 0, 0,128,192, 64, 64,192,128, 0, 0,128,192, 64, 64,192,128, 0, 0, 64, 64, 64, 64, 64,192, 0, 0, 0, 0, 0,249, 8, 8, 8, 8, 8, 8, 8, 8,127,255,255,192,128,128, 15, 31, 31, 1, 1, 1, 1,255, 0, 0, 0, 30, 30, 14, 14,128,192,192,255,255,127, 8, 8, 8, 8, 8, 8, 8, 8,249, 0, 0, 0,
|
||||
0, 0, 31, 49, 64, 78, 64, 49, 31, 0, 0, 97, 22, 8, 22, 97, 0, 0, 31, 49, 96, 64, 64, 96, 32, 0, 0,127, 68, 68,100, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64,127, 64, 64, 0, 0, 0, 32,100, 68, 68,110, 59, 0, 0, 32,100, 68, 68,110, 59, 0, 0, 0, 0, 0,126, 3, 1, 0, 0, 0, 8, 20, 35, 20, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 7, 15,254, 30, 28, 28, 28,255, 28, 28, 28, 30,254, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 17, 10, 4, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 40, 68, 40, 16, 16, 16, 16, 16, 16, 31, 0, 0, 16, 40, 71, 40, 16, 0, 0, 31, 16, 16, 16, 16, 16, 16, 40, 68, 40, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
oled_write_raw_P(raw_logo, sizeof(raw_logo));
|
||||
}
|
||||
static void render_logo_font(void) {
|
||||
static const char PROGMEM qmk_logo[] = {
|
||||
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xCB, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0xCB, 0xCB, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
|
||||
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xCB, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xCB, 0xCB, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
|
||||
0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xCB, 0x88, 0x89, 0x8A, 0x8B, 0x8A, 0x8B, 0x8C, 0x8D, 0xCB, 0xCB, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5,
|
||||
0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xCB, 0xA8, 0xA9, 0xAA, 0xAB, 0xAA, 0xAB, 0xAC, 0xAD, 0xCB, 0xCB, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0x00
|
||||
};
|
||||
|
||||
oled_write_P(qmk_logo, false);
|
||||
}
|
||||
/* Shows the name of the current layer and locks for the host (CAPS etc.) */
|
||||
static void render_info(void) {
|
||||
oled_write_P(PSTR("Layer: "), false);
|
||||
|
||||
switch (get_highest_layer(layer_state)) {
|
||||
case _HOME:
|
||||
oled_write_ln_P(PSTR("HOME"), false);
|
||||
break;
|
||||
case _MISC:
|
||||
oled_write_ln_P(PSTR("MISC"), false);
|
||||
break;
|
||||
case _RGB:
|
||||
oled_write_ln_P(PSTR("RGB"), false);
|
||||
break;
|
||||
case _BLED:
|
||||
oled_write_ln_P(PSTR("Backlight"), false);
|
||||
break;
|
||||
default:
|
||||
oled_write_ln_P(PSTR("Undefined"), false);
|
||||
}
|
||||
led_t led_state = host_keyboard_led_state();
|
||||
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
|
||||
oled_write_ln_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
|
||||
}
|
||||
static void render_rgbled_status(bool full) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
char buf[30];
|
||||
if (RGBLIGHT_MODES > 1 && rgblight_is_enabled() && get_highest_layer(layer_state) == _RGB) {
|
||||
if (full) {
|
||||
snprintf(buf, sizeof(buf), "RGB mode %2d: %d,%d,%d \n",
|
||||
rgblight_get_mode(),
|
||||
rgblight_get_hue()/RGBLIGHT_HUE_STEP,
|
||||
rgblight_get_sat()/RGBLIGHT_SAT_STEP,
|
||||
rgblight_get_val()/RGBLIGHT_VAL_STEP);
|
||||
} else {
|
||||
snprintf(buf, sizeof(buf), "[%2d] ", rgblight_get_mode());
|
||||
}
|
||||
oled_write(buf, false);
|
||||
} else {
|
||||
oled_write_ln_P(PSTR("\n"), false);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void oled_task_user(void) {
|
||||
static bool finished_timer = false;
|
||||
if (!finished_timer && (timer_elapsed(startup_timer) < 1000)) {
|
||||
render_logo();
|
||||
} else {
|
||||
if (!finished_timer) {
|
||||
oled_clear();
|
||||
finished_timer = true;
|
||||
}
|
||||
render_info();
|
||||
render_rgbled_status(true);
|
||||
render_logo_font();
|
||||
}
|
||||
}
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user