Compare commits

..

240 Commits

Author SHA1 Message Date
John Morrison
4d297e6ab2 Typos 2022-04-18 13:28:26 +00:00
xs5871
1700aff408 implements scanner with rotaryio 2022-04-17 18:33:34 -07:00
xs5871
63973e4a6e fix late release of oneshot keys 2022-04-17 18:33:24 -07:00
xs5871
f7dac9e96e add documentation 2022-04-17 18:33:14 -07:00
xs5871
7ff77b97bb implement support for multiple scanners at once
fixup
2022-04-17 18:33:14 -07:00
Ryan Rotter
c7490087b6 Add ROPT and LOPT as alias for alt keys
Additional aliases for macOS key names to match QMK behavior
2022-04-16 17:09:47 -07:00
levpopov
a210c2bf62 Update Officially_Supported_Microcontrollers.md 2022-04-14 10:57:42 +00:00
levpopov
c8df1d10ad nice!nano compile instructions 2022-04-14 10:57:42 +00:00
xs5871
d2e87b3e70 add keypad scanner for shift registers 2022-04-12 08:29:23 -07:00
xs5871
b3ec37e274 expose keypad options through scanner init 2022-04-11 18:26:43 -07:00
xs5871
ec8e167996 add documentation 2022-04-11 17:07:12 -07:00
xs5871
175f0c6a97 introduce consistent naming scheme 2022-04-11 17:07:12 -07:00
xs5871
e395e89864 provide default coord_mapping from scanners 2022-04-11 17:07:12 -07:00
xs5871
8ac497d99b Make CPs keypad.KeyMatrix scanner the default. 2022-04-11 17:07:12 -07:00
levpopov
c880c02ad5 use keypad.Event instead of Matrix.KeyEvent 2022-04-10 14:30:45 -07:00
levpopov
89351fc203 Fix direct GPIO scanner for split keyboards
https://github.com/KMKfw/kmk_firmware/issues/372
2022-04-10 14:30:45 -07:00
Syed Hussaini
4b03ba846a formatted module with black 2022-04-09 15:19:02 -07:00
Syed Hussaini
87d1b0c6b9 updated doc based on the presentation on github 2022-04-09 15:19:02 -07:00
Syed Hussaini
be308d516f added docs 2022-04-09 15:19:02 -07:00
Syed Hussaini
c950785385 caps word implementation 2022-04-09 15:19:02 -07:00
xs5871
74fa1fb52e update docs and examples 2022-04-09 14:40:40 -07:00
xs5871
7431192e95 move old matrix to kmk.scanners.digitalio_matrix 2022-04-09 14:40:40 -07:00
Syed Hussaini
142a15e175 Updated doc to show the keys usage 2022-04-08 21:03:36 -07:00
Syed Hussaini
0cb69651c8 updated doc to reflect python style boolean 2022-04-08 20:22:43 -07:00
Syed Hussaini
6002ad33e1 rename to cg_swap and added docs 2022-04-08 20:22:43 -07:00
Syed Hussaini
3f0283422d swapping control with cmd 2022-04-08 20:22:43 -07:00
Jay Wiggins
cca5b91be2 add None to account for no encoder button
I had to dig through the code to find out what to do... adding it to the docs...
2022-04-08 08:44:52 -07:00
ldsands
f1d229c7ff Update main.py
Updated formatting to pass tests
2022-04-07 19:03:39 -07:00
ldsands
08df52e90d Update kb.py
Fixed formatting and so file can pass tests
2022-04-07 19:03:39 -07:00
ldsands
529e6101ab Update README.md
Updated with like to QMK default keymap
2022-04-07 19:03:39 -07:00
ldsands
ca773d0633 Update main.py
I forgot to implement the default QMK keymap for Sofle
2022-04-07 19:03:39 -07:00
ldsands
cc82433f74 Add Support for SofleV2
Added support for SofleV2 using the SparkFun Pro Micro RP2040
2022-04-07 19:03:39 -07:00
sparksThefire
7b92596937 Fix WinCompose usage
WinCompose requires the `enter` key to be typed at the end of a special unicode character. In order to help print emojis and emoticons in a windows environment, I have added the enter key to the Windows compose unicode sequence method. I have tested this with my local keyboard.
2022-04-05 18:01:53 -07:00
xs5871
e5f89963cf fix pystack exhaustion caused by make_shifted_key.
This removes multiple layers of indirection, effectively making
`make_shifted_key` only as heavy on the stack as the reguler `make_key`.
2022-04-03 13:47:27 -07:00
xs5871
cc70c8f4a8 fix failing unit test.
During timeout processing, cancelations have to take immediate effect,
but new 0-delay timeouts have to be moved to the next cycle.
2022-04-02 10:06:27 -07:00
xs5871
2a53bd8b64 Allow passing user-defined MPY_SOURCES and MPY_CROSS to make 2022-03-31 16:14:17 -07:00
xs5871
07a485b04d implement stricter and more consistent timeouts.
- stricter timeouts: Instead of adding an entire millisecond, use a list
  of timeouts that are supposed to be handled on the same tick. This
  reduces the delay between target tick and actual tick, especially for
  many timeouts issued to the same tick, i.e. combos.
- consistent timeouts: Timeouts are now guaranteed to be handled in the
  order they were issued. Timer rollover is handled properly.

caveat / change to the interface: the returned `timeout_key` is a tuple
of the target timeout tick and the index of the timeout at that tick.
2022-03-31 16:13:32 -07:00
xs5871
d4e72b98c9 remove dependency on neopixel lib for custom pixelbuffers 2022-03-24 17:56:59 -07:00
xs5871
ea19f5bb30 convert hsv_to_rgb to faster 16bit fixed point 2022-03-24 17:56:59 -07:00
xs5871
24d0587ac6 code deduplication: use utils.clamp 2022-03-24 17:56:59 -07:00
yswallow
d12f9a18f1 avoid "Already advertising" error 2022-03-23 21:16:09 -07:00
yswallow
1a7d1d53f6 Enabling Completely Wireless
You can use SplitType.BLE and HIDModes.BLE at the same time
2022-03-23 21:16:09 -07:00
tonasz
9539f2dc74 Fix formatting 2022-03-23 21:16:09 -07:00
tonasz
3687212ed7 Split BLE background advertising 2022-03-23 21:16:09 -07:00
tonasz
d47143463b Fix broken split BLE 2022-03-23 21:16:09 -07:00
Boot-Error
55a75cb9b3 fix: after_matrix_scan when board is the target 2022-03-23 21:00:51 -07:00
giovanniborella
9684e0d5f7 add vendor 2022-03-20 15:22:57 -07:00
giovanniborella
4f7f3dcc3c Implement easypoint 2022-03-20 15:22:57 -07:00
Kyle Brown
1863543428 fix comment 2022-03-20 11:04:15 -07:00
Hilary B. Brenum (they/them)
58ea87dcc2 fix typo 2022-03-18 17:15:01 -07:00
HBBisenieks
2a560cf3f3 added license section 2022-03-18 17:15:01 -07:00
Hilary B. Brenum
275e61832f call out make fix-isort etc before code commit 2022-03-18 17:15:01 -07:00
HBBisenieks
b2c7da2058 escaping graves is the worst 2022-03-18 17:15:01 -07:00
HBBisenieks
dc171360f6 backticks 2022-03-18 17:15:01 -07:00
HBBisenieks
32bafcdc46 documentation about documentation 2022-03-18 17:15:01 -07:00
xs5871
5c33fd3a9f implement combo/chord/sequence module 2022-03-14 19:27:12 -07:00
HBBisenieks
a8e7f43e59 updates to boot.py docs to bring it more in-line with docs style 2022-03-14 17:36:42 -07:00
zyxwars
c46d18ecb7 fix wrong commit 2022-03-12 08:37:05 -08:00
zyxwars
603833dbb7 Add more commets explaining the code 2022-03-12 08:37:05 -08:00
zyxwars
2d005048cc Temp fix del coord crash 2022-03-12 08:37:05 -08:00
zyxwars
cbaf995e33 Add boot.py docs 2022-03-12 08:37:05 -08:00
illness072
3442a21835 Fix _find_key_in_map callings 2022-03-08 17:45:07 +00:00
donutcat
4d1f9e487e Fix MIDI PR files 2022-03-06 00:56:05 -08:00
DonutCables
e52af4f58a MIDI module and docs 2022-03-06 00:56:05 -08:00
xs5871
de1d602b25 fix tick overflow and implement periodic timer class. 2022-03-06 00:02:17 -08:00
HBBisenieks
e2f2c228d1 changes per https://github.com/KMKfw/kmk_firmware/pull/350\#issuecomment-1059061967 2022-03-05 10:40:09 -08:00
HBBisenieks
8dbbc42496 added example code for all layer keys 2022-03-05 10:40:09 -08:00
Kyle Brown
067b7d2e5f Ignore mac specific files 2022-03-03 20:17:16 -08:00
Yoichiro Tanaka
201d127348 Fix the code style issue. 2022-03-01 16:19:01 -08:00
Yoichiro Tanaka
c11fffea2c Test the coord-mapping setting and fix the issue. 2022-03-01 16:19:01 -08:00
idesignstuff
b3c8245365 Update keys.md
Added example for use of .after_keys_handler() to change RGB settings and add serial print.
2022-02-27 18:06:01 -08:00
Kyle Brown
9f2142d706 Remove KMKpython reference 2022-02-27 16:04:38 -08:00
xs5871
54ae022846 fix keypad matrix init and unguarded debug print. 2022-02-27 09:58:57 -08:00
Hilary B. Brenum
2008e0ab3f Add example of simple_key_sequence 2022-02-25 16:04:20 -08:00
xs5871
8cec85e3ec base animation speed on system timer 2022-02-25 16:04:09 -08:00
tonasz
b7e3e4ea8c Add doc index 2022-02-25 13:41:08 -08:00
Ellie T
d54fff883d Fixed IS31FL3731 LEDs on keybow 2040 2022-02-20 21:07:52 -08:00
Ellie T
aae476b59f Updated scanner docs to reflect boilerplate changes 2022-02-20 18:42:38 -08:00
Ellie T
2fce09986e Adding Pimoroni Keybow and Keybow 2040 2022-02-20 18:42:38 -08:00
xs5871
ef7b29bd43 fix column flipping on rhs of split boards. (boards) 2022-02-20 13:55:37 -08:00
xs5871
ab7e0d3eb6 fix column flipping on rhs of split boards. 2022-02-20 13:55:37 -08:00
Jeroen Harkes
d26d397f10 Changed to single quotes 2022-02-20 12:10:04 -08:00
Jeroen Harkes
ecc8b46a2c Change documentation changing the original LED code to statusLED 2022-02-20 12:10:04 -08:00
Jeroen Harkes
fd30b7a8d8 extension for indicating layer status with leds 2022-02-20 12:10:04 -08:00
Ellie
57ba0fe8b2 Custom matrix scanners
- Introduce Scanner base class for MatrixScanner
- Create new Scanner using built-in keypad module
- Allow overriding the scanner used by KMKKeyboard
2022-02-20 12:00:15 -08:00
tonasz
e7d306cf30 Add Kyria board configuration and examples 2022-02-20 11:59:50 -08:00
Ellie T
2d4db12c46 Override LED creation in the RGB extension. 2022-02-19 22:27:31 -08:00
Rene Giovanni Borella
fb783c302c fix formatting, run test 2022-02-19 21:33:45 -08:00
René Giovanni Borella
2096f1a950 Update kmk/modules/encoder.py
Co-authored-by: Tonasz <27835465+Tonasz@users.noreply.github.com>
2022-02-19 21:33:45 -08:00
René Giovanni Borella
a34272dd18 Update kmk/modules/encoder.py
Co-authored-by: Tonasz <27835465+Tonasz@users.noreply.github.com>
2022-02-19 21:33:45 -08:00
René Giovanni Borella
7f5ea97bba Update kmk/modules/encoder.py
Co-authored-by: Tonasz <27835465+Tonasz@users.noreply.github.com>
2022-02-19 21:33:45 -08:00
René Giovanni Borella
7f7eaafbf3 Update kmk/modules/encoder.py
Co-authored-by: Tonasz <27835465+Tonasz@users.noreply.github.com>
2022-02-19 21:33:45 -08:00
Rene Giovanni Borella
8e4ab1d733 Encoder class rebuild
implement BaseEncoder
2022-02-19 21:33:45 -08:00
Rene Giovanni Borella
0e029ebf72 tests pass locally 2022-02-19 21:33:45 -08:00
Rene Giovanni Borella
f02ff1463a reformatted for black 2022-02-19 21:33:45 -08:00
Rene Giovanni Borella
3c4e74d50e typo 2022-02-19 21:33:45 -08:00
Rene Giovanni Borella
ba7b5ce15c Update i2c_encoder.md 2022-02-19 21:33:45 -08:00
Rene Giovanni Borella
671aa60838 basic functions 2022-02-19 21:33:45 -08:00
xs5871
dc4fc646aa port all boards to new intify_coordinate signature. 2022-02-19 18:01:33 -08:00
xs5871
6840330f50 update documentation 2022-02-19 18:01:33 -08:00
xs5871
da3e87ee2d convert matrix report from row/col byte array to linear key_number. 2022-02-19 18:01:33 -08:00
tonasz
7519a97eaa Move pio_uart.py to transports folder 2022-02-16 17:59:59 -08:00
tonasz
083f2e143d Add simple PIO manual to split doc 2022-02-16 17:59:59 -08:00
tonasz
8c0f8ccbc3 Fix pio_uart.py formatting 2022-02-16 17:59:59 -08:00
tonasz
fdf8e9f78c Add RP2040 PIO UART implementation for split keyboards 2022-02-16 17:59:59 -08:00
xs5871
f4807f341e fix table formatting in docs. 2022-02-15 08:24:33 -08:00
xs5871
ee4cce32cb implements oneshot/sticky keys. 2022-02-13 16:43:14 -08:00
xs5871
eb3a7bbf1e change unit test to reflect new modtap default behavior 2022-02-13 14:47:02 -08:00
xs5871
481c69b212 add at least some kind of documentation 2022-02-13 14:47:02 -08:00
xs5871
1c6b25517a implement hold-tap interrupt for Layers 2022-02-13 14:47:02 -08:00
xs5871
a685618480 implement hold-tap interrupt on other key tap (i.e. release) 2022-02-13 14:47:02 -08:00
xs5871
5cae17c9f3 fix permanent hid_send 2022-02-13 14:47:02 -08:00
xs5871
7573556f33 fix hold-tap key interrupted by other hold-tap key 2022-02-13 14:47:02 -08:00
xs5871
f30206c7d5 implement per-key tap_time. 2022-02-13 14:47:02 -08:00
xs5871
21c058aaa8 add hold-tap interrupt behavior: prefer hold.
The interrupt resolution of hold-tap keys can now be set to resolve to
either tap or hold key. The default mod-tap is set to prefer hold.
2022-02-13 14:47:02 -08:00
tonasz
0f7afe5b2c Add polling_interval to trackball 2022-02-08 13:23:35 -08:00
tonasz
119ab3d80a Fix pimoroni_trackball.py formatting 2022-02-08 13:23:35 -08:00
tonasz
7fba42f28c Small pimoroni_trackball.py refactors 2022-02-08 13:23:35 -08:00
tonasz
827862b34b Pimoroni Trackball draft module 2022-02-08 13:23:35 -08:00
xs5871
f2aabd87cd fix after rebase
fix after rebase
2022-02-07 16:25:45 -08:00
xs5871
91562abde9 update documentation 2022-02-07 16:25:45 -08:00
xs5871
65f48b53a4 remove out-of-scope reference 2022-02-07 16:25:45 -08:00
xs5871
cd4ba26e95 add a keycode for setting LED to a defined brightness 2022-02-07 16:25:45 -08:00
xs5871
967046587b apply suggested changes 2022-02-07 16:25:45 -08:00
xs5871
4a83e6de85 code deduplication 2022-02-07 16:25:45 -08:00
xs5871
9e8b8376c5 implement led backlight for multiple pwm channels 2022-02-07 16:25:45 -08:00
patrickmcquay
aa01da7e1d add checksum to split uart code. 2022-02-05 18:00:03 -08:00
patrickmcquay
1387cb2660 Update kmk/modules/split.py so that ble boards work with ee hands.
Co-authored-by: Tonasz <27835465+Tonasz@users.noreply.github.com>
2022-02-05 18:00:03 -08:00
Patrick McQuay
fa0062326b changes from black 2022-02-05 18:00:03 -08:00
Patrick McQuay
be2bbce21a fix some linting issues 2022-02-05 18:00:03 -08:00
Patrick McQuay
1c82f7d387 apply vylders fix and also figure out how to set _is_target correctly, as well as make it work nicely with ble. 2022-02-05 18:00:03 -08:00
Kyle Brown
9f373b4be0 Fix linter 2022-02-05 17:59:44 -08:00
xs5871
2874d49d20 disable hid_send on secondary split 2022-02-05 16:38:41 -08:00
pcharest2000
6ecb7807c2 Code refractor of private members, I am not python programmer, and final try to fix linting error after I quit 2022-02-05 16:37:51 -08:00
pcharest2000
99a9c6fd80 Tried to fix linting 2022-02-05 16:37:51 -08:00
pcharest2000
25fd205c3e Implemented basice linear acceleration.... This makes it more usable, ill update if PR is accepted 2022-02-05 16:37:51 -08:00
pcharest2000
a627102b52 Clarification regaring hadlers on keys 2022-02-05 16:37:51 -08:00
xs5871
3e3255ffea fix lock_status on secondary split 2022-02-05 07:29:01 +00:00
RT_GEN
55a6636741 Fixed multiple encoders not working
Multiple encoders didn't work as a result of an unbound value of 'idx', the loop counter in the during_bootup method. Binding this value has fixed the issue. This has been tested on hardware (6 encoders) and is confirmed working.
2022-02-05 07:28:02 +00:00
Josh Klar
46152ae8d9 feat(ci): run tests (from #288) in CI, which already runs make test 2022-02-04 08:38:20 -08:00
patrickmcquay
7fbda871c2 real fix for swallowing keys, use a buffer and only process one key at a time. 2022-02-04 08:37:19 -08:00
Patrick McQuay
c09cd48218 fix for dropping keys 2022-02-04 08:37:19 -08:00
dherrada
bff1bdf6d9 Added may pad files 2022-02-03 01:12:23 -08:00
Christian Tu
f90de872d8 fix bytearray.startswith not available in CircuitPython 2022-02-02 17:54:23 -08:00
Christian Tu
b6201d43d4 unit tests for execution in desktop dev environment 2022-02-01 00:48:23 -08:00
Kyle Brown
e70ce5f431 fix discord invite link 2022-01-28 17:58:34 -08:00
Kyle Brown
328a29c439 Fix isort on incorrect files 2022-01-28 17:58:06 -08:00
abhijithabhiakl
0bebdd6d27 fix monocolor LED 2022-01-25 23:44:07 -08:00
dependabot[bot]
af55acd584 Bump ipython from 7.24.1 to 7.31.1
Bumps [ipython](https://github.com/ipython/ipython) from 7.24.1 to 7.31.1.
- [Release notes](https://github.com/ipython/ipython/releases)
- [Commits](https://github.com/ipython/ipython/compare/7.24.1...7.31.1)

---
updated-dependencies:
- dependency-name: ipython
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-25 10:55:24 -08:00
xs5871
245f7912b6 fix formatting 2022-01-22 08:55:40 -08:00
xs5871
8419ed789c implement keyboard lock status reader API 2022-01-22 08:55:40 -08:00
xs5871
a62d39a252
make TapDance a module (#281)
* extract tapdance logic into a module

* clean out old tapdance code

* canonicalize key variable names

* split _process_tap_dance into td_pressed and td_released

* implement consistent argument order

* update documentation

* implement Module.process_key for key interception and modification

* fix tapdance realesing instead of pressing

* fix: default parameters in key handler

* cleanup holdtap

* add error handling to modules process_key

* fix: key released too late

Tapped keys didn't release on a "key released" event, but waited for a
timeout. Resulted in, for example, modifiers applying to keys after the
modifier was released.

* fix lint/formatting

* fix tap_time reference in modtap + minimal documentation

* fix lint
2022-01-18 05:21:05 +00:00
tonasz
10f8c74ad9 Allow declaring encoders without a button 2022-01-17 21:19:51 -08:00
dherrada
ef3d38f8ec Added navi10 led 2022-01-11 18:16:07 -08:00
Lee A. Butler
61de548acb improve wording on step 6 2022-01-02 07:08:22 +00:00
Lee A. Butler
2527542379 cleaner and smaller pins56.jpg 2022-01-02 07:08:22 +00:00
Lee A. Butler
14fd494cd4 clarify col_pins/row_pins example code in GettingStarted.md with image 2022-01-02 07:08:22 +00:00
iraytrace
c37170da56 Add specific example of setting row_pins/col_pins
The example code at least needs to
2022-01-02 07:08:22 +00:00
dherrada
3258e76ba4 Fixed link text 2022-01-02 07:06:28 +00:00
dherrada
7f207062e9 Added navi10 by u/emdarcher 2022-01-02 07:06:28 +00:00
xs5871
410cf7af07 fix: catch IndexError when looking up key in keymap 2021-12-12 20:53:02 -08:00
Josh Klar
8063898eb2
fix: resolve #276 (reimplement #142) by allowing custom matrix scanners 2021-12-06 12:02:35 -08:00
pcharest2000
5fcd31b97c Resolve issue 285 in parsing logic, KC.NO was being parsed has an alpha, swapped the control flow treating the special case KC.NO and KC.XXXXX before alphas and nimbers
-Fix linting error on last PR
2021-12-06 11:12:55 -08:00
xs5871
e1300ba767 fix hid report type disambiguition 2021-12-06 09:22:21 -08:00
xs5871
a8b2bf75ad fix unicode sequence 2021-12-03 15:28:15 -08:00
Josh Klar
a7a560bbca docs: README to reflect limited maintainership status 2021-12-01 23:01:54 -08:00
Robert
dc364a77fb
Added missing keys on lily58 (#274)
* Adding missing keys for the lily58

Using the Colemak layout, I added the missing keys from kmk_firmware/boards/lily58/main.py from master branch.

* Fix

Added missing last if statement.

* TellNoLies.py

Colemak_DH layout with bluetooth, no TRRS connection, keyboard setup.

* lily58_Colemak.py

Bluetooth setup with Colemak_dh layout; no rgb.

* Fix format

Fixed the (kc) error on right thumb lower layer.

* I realized that I submited the wrong main.py

I made sure that I added the correct amount of keys for the lily58 keyboard reverting back to default layout; from previous commit.
2021-12-01 17:50:18 +00:00
atsuyuki
5073a29501 Fixed wrong combination keycode conversion. 2021-12-01 09:49:23 -08:00
Christian Tu
11ff03523b fix BLE HID not working with consumer keys 2021-11-06 14:44:50 -07:00
foamyguy
f7c0bd962b fix boards link in getting started 2021-11-06 14:42:15 -07:00
Pierre Constantineau
08b41fda69 some more linter fixes - Black this time 2021-10-27 11:11:42 -07:00
Pierre Constantineau
797cdfe38a some more linter fixes 2021-10-27 11:11:42 -07:00
Pierre Constantineau
841f990481 fixed trailing spaces for linter 2021-10-27 11:11:42 -07:00
Pierre Constantineau
85fe8fef12 added offsetmx43.py in user keymaps 2021-10-27 11:11:42 -07:00
Pierre Constantineau
f9dd03f207 added gridmx47 keymap 2021-10-27 11:11:42 -07:00
Pierre Constantineau
9aa3a21900 added offsetmx43 board 2021-10-27 11:11:42 -07:00
Pierre Constantineau
899b95e586 added kb.py for gridmx47 2021-10-27 11:11:42 -07:00
Pierre Constantineau
0a81876eae added readme for gridmx47 2021-10-27 11:11:42 -07:00
Pierre Constantineau
1aa4db1dd3 fix to link in readme 2021-10-27 11:11:42 -07:00
Yoichiro Tanaka
235560bf72 Fix the issue #256 by changing the timing to set True fo the hid_pending flag. 2021-10-24 14:13:15 -07:00
Pierre Constantineau
72943a8fe1 Revert "updated readme.md and deleted pykey60"
This reverts commit 45b139a81a7d17b409bdad603b228d2901759651.
2021-10-22 14:34:24 -07:00
Pierre Constantineau
9dbecbcb86 Revert "updated readme.md and deleted pykey60"
This reverts commit ec7c04a104077a8dbca4a4cd07769016cf9c6a9e.
2021-10-22 14:34:24 -07:00
Pierre Constantineau
a2e26055a6 cleaned up linting error 2021-10-22 14:34:24 -07:00
Pierre Constantineau
d8445c1262 updated to fix linter 2021-10-22 14:34:24 -07:00
Pierre Constantineau
3bbadece8d minor updates/comments 2021-10-22 14:34:24 -07:00
Pierre Constantineau
27104cc28d initial batreus files 2021-10-22 14:34:24 -07:00
Pierre Constantineau
b2dae8175e updated readme.md and deleted pykey60 2021-10-22 14:34:24 -07:00
Pierre Constantineau
b3d4ffde0a updated to fix linter 2021-10-22 14:34:24 -07:00
Pierre Constantineau
2da3b1f5f4 minor updates/comments 2021-10-22 14:34:24 -07:00
Pierre Constantineau
14c1cacf02 initial batreus files 2021-10-22 14:34:24 -07:00
Pierre Constantineau
997f4651ee updated readme.md and deleted pykey60 2021-10-22 14:34:24 -07:00
Pierre Constantineau
8d01908468 updates from tindie 2021-10-22 14:34:24 -07:00
Pierre Constantineau
e92e122588 adding jpconstantineau's boards 2021-10-22 14:34:24 -07:00
Pierre Constantineau
09dd2be1bc updated layer 1 2021-10-21 17:51:30 -07:00
Pierre Constantineau
634d53b987 initial PyKey60 commit for JPConstantineau's keymap 2021-10-21 17:51:30 -07:00
Pierre Constantineau
aa95412a0e fix for linting 2021-10-21 17:49:59 -07:00
Pierre Constantineau
b4fd94e911 updated readme.md and deleted pykey60 2021-10-21 17:49:59 -07:00
Pierre Constantineau
7ce2827da7 cleaned up keymaps 2021-10-21 17:49:59 -07:00
Pierre Constantineau
0b43a3de38 updates from tindie 2021-10-21 17:49:59 -07:00
Pierre Constantineau
7427531494 adding jpconstantineau's boards 2021-10-21 17:49:59 -07:00
Pierre Constantineau
4a8b95ce93 initial VColChoc Commit 2021-10-21 17:49:59 -07:00
Althaf
6fce4c996c updates filename 2021-10-20 05:03:33 +00:00
xs5871
3e91f63c88 fix tapdance with momentary modifiers; tap-timeout per tap.
Improves handling of momentary modifiers (i.e. different actions on hold or
press/release) as tapdance targets.
tap_time is reset for each consecutive single tap, instead of being
applied to the entire tap sequence.
2021-10-19 00:16:49 -07:00
Josh Klar
5aa123b550
Merge pull request #264 from jpconstantineau/ErgoTravel
added jpconstantineau as alternate source for ErgoTravel
2021-10-19 06:26:27 +00:00
Pierre Constantineau
4165e25ff5 added jpconstantineau as alternate source for ErgoTravel 2021-10-18 22:43:38 -06:00
Josh Klar
997ddfc119
Merge pull request #258 from dgriswo/master
Add user_keymap for pyKey60
2021-10-17 21:56:53 -07:00
elric91
5f1b9d2b14 Reverted back format (bitten by auto formatting) 2021-10-17 09:12:20 -07:00
FHA
f381761507 replaced by encoder.md (merge) 2021-10-17 09:12:20 -07:00
elric91
4c73be5236 blacked atreaus/main.py for lint compliance 2021-10-17 09:12:20 -07:00
FHA
dffaec9f03 typo correction for lint check 2021-10-17 09:12:20 -07:00
FHA
6c13c97e83 update to support encoder module review 2021-10-17 09:12:20 -07:00
elric91
74186f20a1 typos 2021-10-17 09:12:20 -07:00
FHA
b2db921a5b merge new_encoder.py to encoder.py 2021-10-17 09:12:20 -07:00
elric91
ed68ddb79d Merge Encoder and NewEncoder. Enhance missteps handling 2021-10-17 09:12:20 -07:00
elric91
d9fb351448 Minor corrections to pass lint test 2021-10-17 09:12:20 -07:00
FHA
0f6e183235 new_encoder module basic documentation 2021-10-17 09:12:20 -07:00
elric91
484bcc4d22 Black formatting for lint test 2021-10-17 09:12:20 -07:00
elric91
7993a4e415 New encoder module, with button action support 2021-10-17 09:12:20 -07:00
dgriswo
2384550af4 change imports to satisfy linter 2021-10-16 19:30:43 -04:00
Leon Anavi
1222477866 docs/Getting_Started.md: Fix link to user examples
Fix the broken link to KMK user examples.

Signed-off-by: Leon Anavi <leon@anavi.org>
2021-10-16 10:34:23 -07:00
Leon Anavi
a6606c6957 docs/Getting_Started.md: Fix a typo
Fix a minor typo in the getting started page.

Signed-off-by: Leon Anavi <leon@anavi.org>
2021-10-15 23:39:27 -07:00
Daniel Griswold
dea2abb81a Add user_keymap for pyKey60 2021-10-15 22:59:33 -04:00
atsuyuki
2d3b2e95c6 Revert "Update .gitignore"
This reverts commit de4f267a3370eaf6d9b982d08d2bdce87b93c5c5.
2021-10-14 23:02:57 -07:00
atsuyuki
5572fabf8d Update .gitignore 2021-10-14 23:02:57 -07:00
atsuyuki
6357141165 Removed spaces at end of line. 2021-10-14 23:02:57 -07:00
atsuyuki
edfd127148 Fix for pass the test.
Add newline at end of file.
2021-10-14 23:02:57 -07:00
atsuyuki
04b720da5b Removed redundant parts and also simplified everything. 2021-10-14 23:02:57 -07:00
atsuyuki
d2b34097f2 Fix keymap_jp.py to pass the test 2021-10-14 23:02:57 -07:00
atsuyuki
0bc6fe0c97 Fix keymap_jp.py to pass the test 2021-10-14 23:02:57 -07:00
atsuyuki
d114a28f9e Ported keymap_jp from QMK
Ported keymap_jp from QMK. With this, KMK will work as a JIS keyboard.
2021-10-14 23:02:57 -07:00
Josh Klar
6a38b3cb0a
Merge pull request #254 from yoichiro/lunakey-pico
Add files to support Lunakey Pico keyboard
2021-10-09 19:21:03 +00:00
Yoichiro Tanaka
e3c1c86a0b Fix the linter errors. 2021-10-05 20:16:51 +09:00
Yoichiro Tanaka
0d27901b0d Remove _______ and XXXXXXX. Instead, use KC.TRNS. 2021-10-05 19:53:49 +09:00
Josh Klar
45e4356630
Merge pull request #255 from AndersonTorres/ptbr
ptBR translations
2021-10-05 07:20:44 +00:00
AndersonTorres
3069608e56 ptBR translations: docs/ptBR/mouse_keys.md 2021-10-05 01:39:59 -03:00
AndersonTorres
48ab6767e4 ptBR translations: docs/ptBR/adns9800.md 2021-10-05 01:39:39 -03:00
AndersonTorres
fb34038911 ptBR translations: hardware/README-ptBR.md 2021-10-05 01:39:05 -03:00
Yoichiro Tanaka
dac457d94c Add files to support Lunakey Pico. 2021-10-05 11:30:03 +09:00
Josh Klar
fc69245c57
Merge pull request #248 from honboubao/fix-no_release
Fix Key no_release argument
2021-10-04 19:57:06 +00:00
Christian Tu
7586df8de9 fix Key no_release argument 2021-10-01 15:13:45 +02:00
202 changed files with 6782 additions and 2596 deletions

3
.gitignore vendored
View File

@ -121,6 +121,9 @@ venv.bak/
mnt/
mnt2/
# Mac
.DS_Store
# build artifacts
kmk/release_info.py
kmk/release_info.mpy

View File

@ -21,7 +21,7 @@ PIPENV ?= $(shell which pipenv 2>/dev/null)
MPY_CROSS ?= $(shell which mpy-cross 2>/dev/null)
MPY_FLAGS ?= '-O2'
MPY_SOURCES = 'kmk/'
MPY_SOURCES ?= 'kmk/'
MPY_TARGET_DIR ?= .compiled
PY_KMK_TREE = $(shell find $(MPY_SOURCES) -name "*.py")
DIST_DESCRIBE = $(shell $(DIST_DESCRIBE_CMD))
@ -40,7 +40,7 @@ endif
@echo "===> Compiling all py files to mpy with flags $(MPY_FLAGS)"
@mkdir -p $(MPY_TARGET_DIR)
@echo "KMK_RELEASE = '$(DIST_DESCRIBE)'" > $(MPY_SOURCES)/release_info.py
@find $(MPY_SOURCES) -name "*.py" -exec sh -c 'mkdir -p $(MPY_TARGET_DIR)/$$(dirname {}) && mpy-cross $(MPY_FLAGS) {} -o $(MPY_TARGET_DIR)/$$(dirname {})/$$(basename -s .py {}).mpy' \;
@find $(MPY_SOURCES) -name "*.py" -exec sh -c 'mkdir -p $(MPY_TARGET_DIR)/$$(dirname {}) && $(MPY_CROSS) $(MPY_FLAGS) {} -o $(MPY_TARGET_DIR)/$$(dirname {})/$$(basename -s .py {}).mpy' \;
@rm -rf $(MPY_SOURCES)/release_info.py
@touch $(MPY_TARGET_DIR)/.mpy.compiled
@ -88,7 +88,11 @@ powerwash: clean
@echo "===> Removing pipenv-managed virtual environment"
@$(PIPENV) --rm || true
test: lint
test: lint unit-tests
.PHONY: unit-tests
unit-tests: devdeps
@$(PIPENV) run python3 -m unittest
reset-bootloader:
@echo "===> Rebooting your board to bootloader (safe to ignore file not found errors)"

View File

@ -20,7 +20,3 @@ s3cmd = "*"
black = "==21.6b0"
flake8-quotes = "*"
flake8-black = "*"
circuitpython-stubs = "==7.0.0a6.dev195"
pyright = "*"
typing = "*"
mypy = "*"

460
Pipfile.lock generated
View File

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "cee0eeba8c8dad66dccffe0935656829132f7ca928569e3aa957f278e6e92da6"
"sha256": "0a04ec24d4aef6828e4f5eefa0a7d2c312f21f2b2f18c42c7004cdbe0c02bd53"
},
"pipfile-spec": 6,
"requires": {},
@ -45,28 +45,21 @@
"index": "pypi",
"version": "==21.6b0"
},
"circuitpython-stubs": {
"hashes": [
"sha256:5963ef6b41b03e97049d48142cb23778f3e4ca841620296d7e13b00025522569"
],
"index": "pypi",
"version": "==7.0.0a6.dev195"
},
"click": {
"hashes": [
"sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a",
"sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"
"sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
"sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
],
"markers": "python_version >= '3.6'",
"version": "==8.0.1"
"version": "==8.0.3"
},
"decorator": {
"hashes": [
"sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323",
"sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
],
"markers": "python_version >= '3.5'",
"version": "==5.0.9"
"version": "==5.1.1"
},
"flake8": {
"hashes": [
@ -78,11 +71,11 @@
},
"flake8-black": {
"hashes": [
"sha256:c199844bc1b559d91195ebe8620216f21ed67f2cc1ff6884294c91a0d2492684",
"sha256:cc080ba5b3773b69ba102b6617a00cc4ecbad8914109690cfda4d565ea435d96"
"sha256:941514149cb8b489cb17a4bb1cf18d84375db3b34381bb018de83509437931a0",
"sha256:f26651bc10db786c03f4093414f7c9ea982ed8a244cec323c984feeffdf4c118"
],
"index": "pypi",
"version": "==0.2.3"
"version": "==0.2.1"
},
"flake8-commas": {
"hashes": [
@ -94,11 +87,11 @@
},
"flake8-comprehensions": {
"hashes": [
"sha256:4888de89248b7f7535159189ff693c77f8354f6d37a02619fa28c9921a913aa0",
"sha256:e9a010b99aa90c05790d45281ad9953df44a4a08a1a8f6cd41f98b4fc6a268a0"
"sha256:b07aef3277623db32310aa241a1cec67212b53c1d18e767d7e26d4d83aa05bf7",
"sha256:f24be9032587127f7a5bc6d066bf755b6e66834f694383adb8a673e229c1f559"
],
"index": "pypi",
"version": "==3.6.1"
"version": "==3.5.0"
},
"flake8-isort": {
"hashes": [
@ -110,66 +103,71 @@
},
"flake8-quotes": {
"hashes": [
"sha256:f1dd87830ed77ff2ce47fc0ee0fd87ae20e8f045355354ffbf4dcaa18d528217"
"sha256:3f1116e985ef437c130431ac92f9b3155f8f652fda7405ac22ffdfd7a9d1055e"
],
"index": "pypi",
"version": "==3.3.0"
"version": "==3.2.0"
},
"greenlet": {
"hashes": [
"sha256:04e1849c88aa56584d4a0a6e36af5ec7cc37993fdc1fda72b56aa1394a92ded3",
"sha256:05e72db813c28906cdc59bd0da7c325d9b82aa0b0543014059c34c8c4ad20e16",
"sha256:07e6d88242e09b399682b39f8dfa1e7e6eca66b305de1ff74ed9eb1a7d8e539c",
"sha256:090126004c8ab9cd0787e2acf63d79e80ab41a18f57d6448225bbfcba475034f",
"sha256:1796f2c283faab2b71c67e9b9aefb3f201fdfbee5cb55001f5ffce9125f63a45",
"sha256:2f89d74b4f423e756a018832cd7a0a571e0a31b9ca59323b77ce5f15a437629b",
"sha256:34e6675167a238bede724ee60fe0550709e95adaff6a36bcc97006c365290384",
"sha256:3e594015a2349ec6dcceda9aca29da8dc89e85b56825b7d1f138a3f6bb79dd4c",
"sha256:3f8fc59bc5d64fa41f58b0029794f474223693fd00016b29f4e176b3ee2cfd9f",
"sha256:3fc6a447735749d651d8919da49aab03c434a300e9f0af1c886d560405840fd1",
"sha256:40abb7fec4f6294225d2b5464bb6d9552050ded14a7516588d6f010e7e366dcc",
"sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68",
"sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142",
"sha256:4870b018ca685ff573edd56b93f00a122f279640732bb52ce3a62b73ee5c4a92",
"sha256:4adaf53ace289ced90797d92d767d37e7cdc29f13bd3830c3f0a561277a4ae83",
"sha256:4eae94de9924bbb4d24960185363e614b1b62ff797c23dc3c8a7c75bbb8d187e",
"sha256:5317701c7ce167205c0569c10abc4bd01c7f4cf93f642c39f2ce975fa9b78a3c",
"sha256:5c3b735ccf8fc8048664ee415f8af5a3a018cc92010a0d7195395059b4b39b7d",
"sha256:5cde7ee190196cbdc078511f4df0be367af85636b84d8be32230f4871b960687",
"sha256:655ab836324a473d4cd8cf231a2d6f283ed71ed77037679da554e38e606a7117",
"sha256:6ce9d0784c3c79f3e5c5c9c9517bbb6c7e8aa12372a5ea95197b8a99402aa0e6",
"sha256:6e0696525500bc8aa12eae654095d2260db4dc95d5c35af2b486eae1bf914ccd",
"sha256:75ff270fd05125dce3303e9216ccddc541a9e072d4fc764a9276d44dee87242b",
"sha256:8039f5fe8030c43cd1732d9a234fdcbf4916fcc32e21745ca62e75023e4d4649",
"sha256:84488516639c3c5e5c0e52f311fff94ebc45b56788c2a3bfe9cf8e75670f4de3",
"sha256:84782c80a433d87530ae3f4b9ed58d4a57317d9918dfcc6a59115fa2d8731f2c",
"sha256:8ddb38fb6ad96c2ef7468ff73ba5c6876b63b664eebb2c919c224261ae5e8378",
"sha256:98b491976ed656be9445b79bc57ed21decf08a01aaaf5fdabf07c98c108111f6",
"sha256:990e0f5e64bcbc6bdbd03774ecb72496224d13b664aa03afd1f9b171a3269272",
"sha256:9b02e6039eafd75e029d8c58b7b1f3e450ca563ef1fe21c7e3e40b9936c8d03e",
"sha256:a11b6199a0b9dc868990456a2667167d0ba096c5224f6258e452bfbe5a9742c5",
"sha256:a414f8e14aa7bacfe1578f17c11d977e637d25383b6210587c29210af995ef04",
"sha256:a91ee268f059583176c2c8b012a9fce7e49ca6b333a12bbc2dd01fc1a9783885",
"sha256:ac991947ca6533ada4ce7095f0e28fe25d5b2f3266ad5b983ed4201e61596acf",
"sha256:b050dbb96216db273b56f0e5960959c2b4cb679fe1e58a0c3906fa0a60c00662",
"sha256:b97a807437b81f90f85022a9dcfd527deea38368a3979ccb49d93c9198b2c722",
"sha256:bad269e442f1b7ffa3fa8820b3c3aa66f02a9f9455b5ba2db5a6f9eea96f56de",
"sha256:bf3725d79b1ceb19e83fb1aed44095518c0fcff88fba06a76c0891cfd1f36837",
"sha256:c0f22774cd8294078bdf7392ac73cf00bfa1e5e0ed644bd064fdabc5f2a2f481",
"sha256:c1862f9f1031b1dee3ff00f1027fcd098ffc82120f43041fe67804b464bbd8a7",
"sha256:c8d4ed48eed7414ccb2aaaecbc733ed2a84c299714eae3f0f48db085342d5629",
"sha256:cf31e894dabb077a35bbe6963285d4515a387ff657bd25b0530c7168e48f167f",
"sha256:d15cb6f8706678dc47fb4e4f8b339937b04eda48a0af1cca95f180db552e7663",
"sha256:dfcb5a4056e161307d103bc013478892cfd919f1262c2bb8703220adcb986362",
"sha256:e02780da03f84a671bb4205c5968c120f18df081236d7b5462b380fd4f0b497b",
"sha256:e2002a59453858c7f3404690ae80f10c924a39f45f6095f18a985a1234c37334",
"sha256:e22a82d2b416d9227a500c6860cf13e74060cf10e7daf6695cbf4e6a94e0eee4",
"sha256:e41f72f225192d5d4df81dad2974a8943b0f2d664a2a5cfccdf5a01506f5523c",
"sha256:f253dad38605486a4590f9368ecbace95865fea0f2b66615d121ac91fd1a1563",
"sha256:fddfb31aa2ac550b938d952bca8a87f1db0f8dc930ffa14ce05b5c08d27e7fd1"
"sha256:0051c6f1f27cb756ffc0ffbac7d2cd48cb0362ac1736871399a739b2885134d3",
"sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711",
"sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd",
"sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073",
"sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708",
"sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67",
"sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23",
"sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1",
"sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08",
"sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd",
"sha256:2bde6792f313f4e918caabc46532aa64aa27a0db05d75b20edfc5c6f46479de2",
"sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa",
"sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8",
"sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40",
"sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab",
"sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6",
"sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc",
"sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b",
"sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e",
"sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963",
"sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3",
"sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d",
"sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d",
"sha256:8c5d5b35f789a030ebb95bff352f1d27a93d81069f2adb3182d99882e095cefe",
"sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28",
"sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3",
"sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e",
"sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c",
"sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d",
"sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0",
"sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497",
"sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee",
"sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713",
"sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58",
"sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a",
"sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06",
"sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88",
"sha256:b336501a05e13b616ef81ce329c0e09ac5ed8c732d9ba7e3e983fcc1a9e86965",
"sha256:b8c008de9d0daba7b6666aa5bbfdc23dcd78cafc33997c9b7741ff6353bafb7f",
"sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4",
"sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5",
"sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c",
"sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a",
"sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1",
"sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43",
"sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627",
"sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b",
"sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168",
"sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d",
"sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5",
"sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478",
"sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf",
"sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce",
"sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c",
"sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==1.1.1"
"version": "==1.1.2"
},
"ipdb": {
"hashes": [
@ -180,42 +178,35 @@
},
"ipython": {
"hashes": [
"sha256:0cff04bb042800129348701f7bd68a430a844e8fb193979c08f6c99f28bb735e",
"sha256:892743b65c21ed72b806a3a602cca408520b3200b89d1924f4b3d2cdb3692362"
"sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874",
"sha256:b5548ec5329a4bcf054a5deed5099b0f9622eb9ea51aaa7104d215fece201d8c"
],
"index": "pypi",
"version": "==7.26.0"
},
"ipython-genutils": {
"hashes": [
"sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
"sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
],
"version": "==0.2.0"
"version": "==7.31.1"
},
"isort": {
"hashes": [
"sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899",
"sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"
"sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6",
"sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"
],
"index": "pypi",
"version": "==5.9.3"
"version": "==5.8.0"
},
"jedi": {
"hashes": [
"sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93",
"sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"
"sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d",
"sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"
],
"markers": "python_version >= '3.6'",
"version": "==0.18.0"
"version": "==0.18.1"
},
"matplotlib-inline": {
"hashes": [
"sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811",
"sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"
"sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee",
"sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"
],
"markers": "python_version >= '3.5'",
"version": "==0.1.2"
"version": "==0.1.3"
},
"mccabe": {
"hashes": [
@ -226,65 +217,42 @@
},
"msgpack": {
"hashes": [
"sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9",
"sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841",
"sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439",
"sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694",
"sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a",
"sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f",
"sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e",
"sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1",
"sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c",
"sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b",
"sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759",
"sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326",
"sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc",
"sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192",
"sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83",
"sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06",
"sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e",
"sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9",
"sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33",
"sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54",
"sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f",
"sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887",
"sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009",
"sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2",
"sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c",
"sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87",
"sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984",
"sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"
"sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc",
"sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147",
"sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3",
"sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba",
"sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39",
"sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85",
"sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9",
"sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a",
"sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec",
"sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88",
"sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e",
"sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a",
"sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b",
"sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1",
"sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3",
"sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef",
"sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079",
"sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52",
"sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a",
"sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a",
"sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4",
"sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996",
"sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73",
"sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a",
"sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920",
"sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7",
"sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d",
"sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770",
"sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50",
"sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2",
"sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2",
"sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d",
"sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea",
"sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"
],
"version": "==1.0.2"
},
"mypy": {
"hashes": [
"sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9",
"sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a",
"sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9",
"sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e",
"sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2",
"sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212",
"sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b",
"sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885",
"sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150",
"sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703",
"sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072",
"sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457",
"sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e",
"sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0",
"sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb",
"sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97",
"sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8",
"sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811",
"sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6",
"sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de",
"sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504",
"sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921",
"sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"
],
"index": "pypi",
"version": "==0.910"
"version": "==1.0.3"
},
"mypy-extensions": {
"hashes": [
@ -300,20 +268,13 @@
"index": "pypi",
"version": "==0.3.1"
},
"nodeenv": {
"hashes": [
"sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b",
"sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"
],
"version": "==1.6.0"
},
"parso": {
"hashes": [
"sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398",
"sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"
"sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0",
"sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"
],
"markers": "python_version >= '3.6'",
"version": "==0.8.2"
"version": "==0.8.3"
},
"pathspec": {
"hashes": [
@ -339,11 +300,11 @@
},
"prompt-toolkit": {
"hashes": [
"sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c",
"sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"
"sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6",
"sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"
],
"markers": "python_full_version >= '3.6.2'",
"version": "==3.0.20"
"version": "==3.0.24"
},
"ptyprocess": {
"hashes": [
@ -370,11 +331,11 @@
},
"pygments": {
"hashes": [
"sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
"sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
"sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65",
"sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"
],
"markers": "python_version >= '3.5'",
"version": "==2.10.0"
"version": "==2.11.2"
},
"pynvim": {
"hashes": [
@ -382,14 +343,6 @@
],
"version": "==0.4.3"
},
"pyright": {
"hashes": [
"sha256:dd8e18c54321340be44a708b6037c0b967486c32b3f492741fffdc205cb82f15",
"sha256:e2668730cddf580e696d4a11946e740e2f5647df1eb45f7c55b7029376eac5a1"
],
"index": "pypi",
"version": "==0.0.9"
},
"pyserial": {
"hashes": [
"sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb",
@ -407,11 +360,11 @@
},
"python-dotenv": {
"hashes": [
"sha256:aae25dc1ebe97c420f50b81fb0e5c949659af713f31fdb63c749ca68748f34b1",
"sha256:f521bc2ac9a8e03c736f62911605c5d83970021e3fa95b37d769e2bbbe9b6172"
"sha256:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3",
"sha256:a5de49a31e953b45ff2d2fd434bbc2670e8db5273606c1e737cc6b93eff3655f"
],
"markers": "python_version >= '3.5'",
"version": "==0.19.0"
"version": "==0.19.2"
},
"python-magic": {
"hashes": [
@ -423,49 +376,82 @@
},
"regex": {
"hashes": [
"sha256:0696eb934dee723e3292056a2c046ddb1e4dd3887685783a9f4af638e85dee76",
"sha256:105122fa63da98d8456d5026bc6ac5a1399fd82fa6bad22c6ea641b1572c9142",
"sha256:116c277774f84266044e889501fe79cfd293a8b4336b7a5e89b9f20f1e5a9f21",
"sha256:12eaf0bbe568bd62e6cade7937e0bf01a2a4cef49a82f4fd204401e78409e158",
"sha256:1401cfa4320691cbd91191ec678735c727dee674d0997b0902a5a38ad482faf5",
"sha256:19acdb8831a4e3b03b23369db43178d8fee1f17b99c83af6cd907886f76bd9d4",
"sha256:208851a2f8dd31e468f0b5aa6c94433975bd67a107a4e7da3bdda947c9f85e25",
"sha256:24d68499a27b2d93831fde4a9b84ea5b19e0ab141425fbc9ab1e5b4dad179df7",
"sha256:2778c6cb379d804e429cc8e627392909e60db5152b42c695c37ae5757aae50ae",
"sha256:2a0a5e323cf86760784ce2b91d8ab5ea09d0865d6ef4da0151e03d15d097b24e",
"sha256:2d9cbe0c755ab8b6f583169c0783f7278fc6b195e423b09c5a8da6f858025e96",
"sha256:2de1429e4eeab799c168a4f6e6eecdf30fcaa389bba4039cc8a065d6b7aad647",
"sha256:32753eda8d413ce4f208cfe01dd61171a78068a6f5d5f38ccd751e00585cdf1d",
"sha256:3ee8ad16a35c45a5bab098e39020ecb6fec3b0e700a9d88983d35cbabcee79c8",
"sha256:4f03fc0a25122cdcbf39136510d4ea7627f732206892db522adf510bc03b8c67",
"sha256:4f3e36086d6631ceaf468503f96a3be0d247caef0660c9452fb1b0c055783851",
"sha256:503c1ba0920a46a1844363725215ef44d59fcac2bd2c03ae3c59aa9d08d29bd6",
"sha256:507861cf3d97a86fbe26ea6cc04660ae028b9e4080b8290e28b99547b4e15d89",
"sha256:56ae6e3cf0506ec0c40b466e31f41ee7a7149a2b505ae0ee50edd9043b423d27",
"sha256:6530b7b9505123cdea40a2301225183ca65f389bc6129f0c225b9b41680268d8",
"sha256:6729914dd73483cd1c8aaace3ac082436fc98b0072743ac136eaea0b3811d42f",
"sha256:7406dd2e44c7cfb4680c0a45a03264381802c67890cf506c147288f04c67177d",
"sha256:7684016b73938ca12d160d2907d141f06b7597bd17d854e32bb7588be01afa1d",
"sha256:7db58ad61f3f6ea393aaf124d774ee0c58806320bc85c06dc9480f5c7219c250",
"sha256:83946ca9278b304728b637bc8d8200ab1663a79de85e47724594917aeed0e892",
"sha256:84057cfae5676f456b03970eb78b7e182fddc80c2daafd83465a3d6ca9ff8dbf",
"sha256:862b6164e9a38b5c495be2c2854e75fd8af12c5be4c61dc9b42d255980d7e907",
"sha256:8ddb4f9ce6bb388ecc97b4b3eb37e786f05d7d5815e8822e0d87a3dbd7100649",
"sha256:92eb03f47427fea452ff6956d11f5d5a3f22a048c90a0f34fa223e6badab6c85",
"sha256:a5f3bc727fea58f21d99c22e6d4fca652dc11dbc2a1e7cfc4838cd53b2e3691f",
"sha256:a6180dbf5945b27e9420e1b58c3cacfc79ad5278bdad3ea35109f5680fbe16d1",
"sha256:b158f673ae6a6523f13704f70aa7e4ce875f91e379bece4362c89db18db189d5",
"sha256:cd45b4542134de63e7b9dd653e0a2d7d47ffed9615e3637c27ca5f6b78ea68bb",
"sha256:d2404336fd16788ea757d4218a2580de60adb052d9888031e765320be8884309",
"sha256:db888d4fb33a2fd54b57ac55d5015e51fa849f0d8592bd799b4e47f83bd04e00",
"sha256:dde0ac721c7c5bfa5f9fc285e811274dec3c392f2c1225f7d07ca98a8187ca84",
"sha256:de0d06ccbc06af5bf93bddec10f4f80275c5d74ea6d28b456931f3955f58bc8c",
"sha256:e02dad60e3e8442eefd28095e99b2ac98f2b8667167493ac6a2f3aadb5d84a17",
"sha256:e960fe211496333b2f7e36badf4c22a919d740386681f79139ee346b403d1ca1",
"sha256:e9700c52749cb3e90c98efd72b730c97b7e4962992fca5fbcaf1363be8e3b849",
"sha256:ee318974a1fdacba1701bc9e552e9015788d6345416364af6fa987424ff8df53"
"sha256:04611cc0f627fc4a50bc4a9a2e6178a974c6a6a4aa9c1cca921635d2c47b9c87",
"sha256:0b5d6f9aed3153487252d00a18e53f19b7f52a1651bc1d0c4b5844bc286dfa52",
"sha256:0d2f5c3f7057530afd7b739ed42eb04f1011203bc5e4663e1e1d01bb50f813e3",
"sha256:11772be1eb1748e0e197a40ffb82fb8fd0d6914cd147d841d9703e2bef24d288",
"sha256:1333b3ce73269f986b1fa4d5d395643810074dc2de5b9d262eb258daf37dc98f",
"sha256:16f81025bb3556eccb0681d7946e2b35ff254f9f888cff7d2120e8826330315c",
"sha256:1a171eaac36a08964d023eeff740b18a415f79aeb212169080c170ec42dd5184",
"sha256:1d6301f5288e9bdca65fab3de6b7de17362c5016d6bf8ee4ba4cbe833b2eda0f",
"sha256:1e031899cb2bc92c0cf4d45389eff5b078d1936860a1be3aa8c94fa25fb46ed8",
"sha256:1f8c0ae0a0de4e19fddaaff036f508db175f6f03db318c80bbc239a1def62d02",
"sha256:2245441445099411b528379dee83e56eadf449db924648e5feb9b747473f42e3",
"sha256:22709d701e7037e64dae2a04855021b62efd64a66c3ceed99dfd684bfef09e38",
"sha256:24c89346734a4e4d60ecf9b27cac4c1fee3431a413f7aa00be7c4d7bbacc2c4d",
"sha256:25716aa70a0d153cd844fe861d4f3315a6ccafce22b39d8aadbf7fcadff2b633",
"sha256:2dacb3dae6b8cc579637a7b72f008bff50a94cde5e36e432352f4ca57b9e54c4",
"sha256:34316bf693b1d2d29c087ee7e4bb10cdfa39da5f9c50fa15b07489b4ab93a1b5",
"sha256:36b2d700a27e168fa96272b42d28c7ac3ff72030c67b32f37c05616ebd22a202",
"sha256:37978254d9d00cda01acc1997513f786b6b971e57b778fbe7c20e30ae81a97f3",
"sha256:38289f1690a7e27aacd049e420769b996826f3728756859420eeee21cc857118",
"sha256:385ccf6d011b97768a640e9d4de25412204fbe8d6b9ae39ff115d4ff03f6fe5d",
"sha256:3c7ea86b9ca83e30fa4d4cd0eaf01db3ebcc7b2726a25990966627e39577d729",
"sha256:49810f907dfe6de8da5da7d2b238d343e6add62f01a15d03e2195afc180059ed",
"sha256:519c0b3a6fbb68afaa0febf0d28f6c4b0a1074aefc484802ecb9709faf181607",
"sha256:51f02ca184518702975b56affde6c573ebad4e411599005ce4468b1014b4786c",
"sha256:552a39987ac6655dad4bf6f17dd2b55c7b0c6e949d933b8846d2e312ee80005a",
"sha256:596f5ae2eeddb79b595583c2e0285312b2783b0ec759930c272dbf02f851ff75",
"sha256:6014038f52b4b2ac1fa41a58d439a8a00f015b5c0735a0cd4b09afe344c94899",
"sha256:61ebbcd208d78658b09e19c78920f1ad38936a0aa0f9c459c46c197d11c580a0",
"sha256:6213713ac743b190ecbf3f316d6e41d099e774812d470422b3a0f137ea635832",
"sha256:637e27ea1ebe4a561db75a880ac659ff439dec7f55588212e71700bb1ddd5af9",
"sha256:6aa427c55a0abec450bca10b64446331b5ca8f79b648531138f357569705bc4a",
"sha256:6ca45359d7a21644793de0e29de497ef7f1ae7268e346c4faf87b421fea364e6",
"sha256:6db1b52c6f2c04fafc8da17ea506608e6be7086715dab498570c3e55e4f8fbd1",
"sha256:752e7ddfb743344d447367baa85bccd3629c2c3940f70506eb5f01abce98ee68",
"sha256:760c54ad1b8a9b81951030a7e8e7c3ec0964c1cb9fee585a03ff53d9e531bb8e",
"sha256:768632fd8172ae03852e3245f11c8a425d95f65ff444ce46b3e673ae5b057b74",
"sha256:7a0b9f6a1a15d494b35f25ed07abda03209fa76c33564c09c9e81d34f4b919d7",
"sha256:7e070d3aef50ac3856f2ef5ec7214798453da878bb5e5a16c16a61edf1817cc3",
"sha256:7e12949e5071c20ec49ef00c75121ed2b076972132fc1913ddf5f76cae8d10b4",
"sha256:7e26eac9e52e8ce86f915fd33380f1b6896a2b51994e40bb094841e5003429b4",
"sha256:85ffd6b1cb0dfb037ede50ff3bef80d9bf7fa60515d192403af6745524524f3b",
"sha256:8618d9213a863c468a865e9d2ec50221015f7abf52221bc927152ef26c484b4c",
"sha256:8acef4d8a4353f6678fd1035422a937c2170de58a2b29f7da045d5249e934101",
"sha256:8d2f355a951f60f0843f2368b39970e4667517e54e86b1508e76f92b44811a8a",
"sha256:90b6840b6448203228a9d8464a7a0d99aa8fa9f027ef95fe230579abaf8a6ee1",
"sha256:9187500d83fd0cef4669385cbb0961e227a41c0c9bc39219044e35810793edf7",
"sha256:93c20777a72cae8620203ac11c4010365706062aa13aaedd1a21bb07adbb9d5d",
"sha256:93cce7d422a0093cfb3606beae38a8e47a25232eea0f292c878af580a9dc7605",
"sha256:94c623c331a48a5ccc7d25271399aff29729fa202c737ae3b4b28b89d2b0976d",
"sha256:97f32dc03a8054a4c4a5ab5d761ed4861e828b2c200febd4e46857069a483916",
"sha256:9a2bf98ac92f58777c0fafc772bf0493e67fcf677302e0c0a630ee517a43b949",
"sha256:a602bdc8607c99eb5b391592d58c92618dcd1537fdd87df1813f03fed49957a6",
"sha256:a9d24b03daf7415f78abc2d25a208f234e2c585e5e6f92f0204d2ab7b9ab48e3",
"sha256:abfcb0ef78df0ee9df4ea81f03beea41849340ce33a4c4bd4dbb99e23ec781b6",
"sha256:b013f759cd69cb0a62de954d6d2096d648bc210034b79b1881406b07ed0a83f9",
"sha256:b02e3e72665cd02afafb933453b0c9f6c59ff6e3708bd28d0d8580450e7e88af",
"sha256:b52cc45e71657bc4743a5606d9023459de929b2a198d545868e11898ba1c3f59",
"sha256:ba37f11e1d020969e8a779c06b4af866ffb6b854d7229db63c5fdddfceaa917f",
"sha256:bb804c7d0bfbd7e3f33924ff49757de9106c44e27979e2492819c16972ec0da2",
"sha256:bf594cc7cc9d528338d66674c10a5b25e3cde7dd75c3e96784df8f371d77a298",
"sha256:c38baee6bdb7fe1b110b6b3aaa555e6e872d322206b7245aa39572d3fc991ee4",
"sha256:c73d2166e4b210b73d1429c4f1ca97cea9cc090e5302df2a7a0a96ce55373f1c",
"sha256:c9099bf89078675c372339011ccfc9ec310310bf6c292b413c013eb90ffdcafc",
"sha256:cf0db26a1f76aa6b3aa314a74b8facd586b7a5457d05b64f8082a62c9c49582a",
"sha256:d19a34f8a3429bd536996ad53597b805c10352a8561d8382e05830df389d2b43",
"sha256:da80047524eac2acf7c04c18ac7a7da05a9136241f642dd2ed94269ef0d0a45a",
"sha256:de2923886b5d3214be951bc2ce3f6b8ac0d6dfd4a0d0e2a4d2e5523d8046fdfb",
"sha256:defa0652696ff0ba48c8aff5a1fac1eef1ca6ac9c660b047fc8e7623c4eb5093",
"sha256:e54a1eb9fd38f2779e973d2f8958fd575b532fe26013405d1afb9ee2374e7ab8",
"sha256:e5c31d70a478b0ca22a9d2d76d520ae996214019d39ed7dd93af872c7f301e52",
"sha256:ebaeb93f90c0903233b11ce913a7cb8f6ee069158406e056f884854c737d2442",
"sha256:ecfe51abf7f045e0b9cdde71ca9e153d11238679ef7b5da6c82093874adf3338",
"sha256:f99112aed4fb7cee00c7f77e8b964a9b10f69488cdff626ffd797d02e2e4484f",
"sha256:fd914db437ec25bfa410f8aa0aa2f3ba87cdfc04d9919d608d02330947afaeab"
],
"version": "==2021.8.27"
"version": "==2022.1.18"
},
"s3cmd": {
"hashes": [
@ -475,6 +461,14 @@
"index": "pypi",
"version": "==2.1.0"
},
"setuptools": {
"hashes": [
"sha256:2404879cda71495fc4d5cbc445ed52fdaddf352b36e40be8dcc63147cb4edabe",
"sha256:68eb94073fc486091447fcb0501efd6560a0e5a1839ba249e5ff3c4c93f05f90"
],
"markers": "python_version >= '3.7'",
"version": "==60.5.0"
},
"six": {
"hashes": [
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
@ -485,10 +479,10 @@
},
"testfixtures": {
"hashes": [
"sha256:0a6422737f6d89b45cdef1e2df5576f52ad0f507956002ce1020daa9f44211d6",
"sha256:486be7b01eb71326029811878a3317b7e7994324621c0ec633c8e24499d8d5b3"
"sha256:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d",
"sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"
],
"version": "==6.18.1"
"version": "==6.18.3"
},
"toml": {
"hashes": [
@ -500,27 +494,11 @@
},
"traitlets": {
"hashes": [
"sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396",
"sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"
"sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7",
"sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"
],
"markers": "python_version >= '3.7'",
"version": "==5.0.5"
},
"typing": {
"hashes": [
"sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9",
"sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"
],
"index": "pypi",
"version": "==3.7.4.3"
},
"typing-extensions": {
"hashes": [
"sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
"sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
"sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
],
"version": "==3.10.0.0"
"version": "==5.1.1"
},
"wcwidth": {
"hashes": [

View File

@ -12,23 +12,18 @@ https://img.shields.io/discord/493256121075761173?logo=Discord
KMK is a feature-rich and beginner-friendly firmware for computer keyboards
written and configured in
[CircuitPython](https://github.com/adafruit/circuitpython). **KMK is currently
in public beta, however should handle most workflows without major issues**.
[CircuitPython](https://github.com/adafruit/circuitpython).
<!--
@klardotsh 06 July 2021: commented for now because CDN builds have been broken
for ages and folks are (reasonably) getting confused.
You can always find the latest releases on our CDN, in [compiled and
optimized](https://cdn.kmkfw.io/kmk-latest.zip) and [raw, hackable text
file](https://cdn.kmkfw.io/kmk-latest.unoptimized.zip) forms. These follow the
`master` branch here on GitHub.
-->
**KMK is currently looking for maintainers.** If you like keyboards and/or
Python, and ideally have contributed to KMK in the past, and are interested in
(co-)maintaining KMK, comment on [the relevant GitHub
issue](https://github.com/KMKfw/kmk_firmware/issues/196) or drop by the Matrix
channel below.
> If you need support with KMK or just want to say hi, find us in
> [#kmkfw:klar.sh on Matrix](https://matrix.to/#/#kmkfw:klar.sh). This channel
> is bridged to Discord
> [here](https://discordapp.com/widget?id=493256121075761173&theme=dark) for
> [here](https://discord.gg/QBHUUpeGUd) for
> convenience.
## Features
@ -58,10 +53,11 @@ Our getting started guide can be found
## The KMK Team
KMK is primarily written and maintained by @klardotsh and @kdb424, but
contributions are welcome from all, whether it's in the form of code,
documentation, hardware designs, feature ideas, or anything else that comes to
mind. A list of KMK's contributors can be found [on
KMK was originally authored by @klardotsh and @kdb424 over the winter of
2018-19, and has been contributed to by numerous others since. Contributions
are welcome from all, whether it's in the form of code, documentation, hardware
designs, feature ideas, or anything else that comes to mind. A list of KMK's
contributors can be found [on
GitHub](https://github.com/KMKfw/kmk_firmware/graphs/contributors).
> While Adafruit employees and affiliates are occasionally found in the commit
@ -80,10 +76,17 @@ found in `setup.cfg` loosening the rules in isolated cases, notably
`user_keymaps` (which is *also* not subject to Black formatting for reasons
documented in `pyproject.toml`).
## Tests
Unit tests within the `tests` folder mock various CircuitPython modules to allow
them to be executed in a desktop development environment.
Execute tests using the command `python -m unittest`.
## License, Copyright, and Legal
All software in this repository is licensed under the [GNU Public License,
verison 3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)).
version 3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)).
All documentation and hardware designs are licensed under the [Creative Commons
Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
license. Contributions to this repository must use these licenses unless

View File

@ -1,9 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
# from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -20,28 +20,13 @@ Zoom_out = KC.LCTRL(KC.MINUS)
_______ = KC.TRNS
XXXXXXX = KC.NO
# for use in the encoder extension
encoder_map = [
[
(
KC.VOLU,
KC.VOLD,
2,
), # Only 1 encoder is being used, so only one tuple per layer is required
],
[
(Zoom_in, Zoom_out, 1),
],
[
(_______, _______, 1), # no action taken by the encoder on this layer
],
]
layers_ext = Layers()
encoder_ext = EncoderHandler([board.D40], [board.D41], encoder_map)
encoder_ext.encoders[0].is_inverted = True
# 1 encoder, no button, inversed = True
encoder_ext = EncoderHandler(
(board.D40, board.D41, None, True),
)
keyboard.modules = [layers_ext, encoder_ext]
keyboard.tap_time = 250
@ -216,5 +201,23 @@ keyboard.keymap = [
],
]
# for use in the encoder extension
encoder_map = [
[
(
KC.VOLU,
KC.VOLD,
None,
), # Only 1 encoder is being used, so only one tuple per layer is required
],
[
(Zoom_in, Zoom_out, None),
],
[
(_______, _______, None), # no action taken by the encoder on this layer
],
]
if __name__ == '__main__':
keyboard.go()

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -11,9 +11,9 @@ Retailers (USA)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -15,10 +14,11 @@ class KMKKeyboard(_KMKKeyboard):
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(10))
coord_mapping.extend(ic(1, x) for x in range(10))
coord_mapping.extend(ic(2, x) for x in range(10))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))
# NOQA
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 20, 21, 22, 23, 24,
5, 6, 7, 8, 9, 25, 26, 27, 28, 29,
10, 11, 12, 13, 14, 30, 31, 32, 33, 34,
17, 18, 19, 35, 36, 37,
]

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitSide, SplitType

View File

@ -20,8 +20,8 @@ Corne LP
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -21,10 +20,11 @@ class KMKKeyboard(_KMKKeyboard):
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
21, 22, 23, 47, 46, 45,
]
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -20,10 +19,10 @@ class KMKKeyboard(_KMKKeyboard):
rgb_pixel_pin = board.D0
i2c = board.I2C
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
21, 22, 23, 47, 46, 45,
]

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -9,13 +9,16 @@ kb.py is designed to work with the nice!nano
Hardware Availability: [PCB & Case Source](https://github.com/jpconstantineau/ErgoTravel/blob/master/OrderingInstructions.md)
Retailers (USA)
[Boardsource](https://boardsource.xyz/store/5eed23430883e03ef9a69d6a)
[Boardsource](https://boardsource.xyz/store/5eed23430883e03ef9a69d6a)
Retailers (Canada)
[BlueMicro Store (ErgoTravel's creator)](https://store.jpconstantineau.com/#/group/split_boards)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -24,10 +23,11 @@ class KMKKeyboard(_KMKKeyboard):
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(14))
coord_mapping.extend(ic(1, x) for x in range(14))
coord_mapping.extend(ic(2, x) for x in range(14))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 12))
# NOQA
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 6, 34, 33, 32, 31, 30, 29, 28,
7, 8, 9, 10, 11, 12, 13, 41, 40, 39, 38, 37, 36, 35,
14, 15, 16, 17, 18, 19, 20, 48, 47, 46, 45, 44, 43, 42,
21, 22, 23, 24, 25, 26, 54, 53, 52, 51, 50, 49,
]

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.led import LED
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.led import LED
from kmk.extensions.rgb import RGB
from kmk.keys import KC

View File

@ -0,0 +1,13 @@
# JPConstantineau's Batreus44: An Atreus44 clone with Low Profile Switches and Wireless Options!
![Batreus44](https://preview.redd.it/yu090ikxiou71.jpg?width=4032&format=pjpg&auto=webp&s=6da758f1ca439ecee912b35a709eacef9b019cd8)
44 Keys Low Profile Keyboard inspired from Keyboardio's Atreus with a socket for a NiceNano, BlueMicro840 or Pro Micro RP2040 and a place to solder in a Battery.
kb_BlueMicro840.py is designed to work with the BlueMicro840
Retailers (USA)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

@ -0,0 +1,23 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.P0_15,
board.P0_17,
board.P0_20,
board.P0_13,
board.P0_24,
board.P0_09,
board.P0_03,
board.P1_13,
board.P0_02,
board.P0_29,
board.P0_26,
board.P0_30,
)
row_pins = (board.P0_28, board.P1_11, board.P0_10, board.P1_06)
diode_orientation = DiodeOrientation.COL2ROW

View File

@ -0,0 +1,15 @@
# JPConstantineau's PyKey60
![PyKey60](https://cdn.tindiemedia.com/images/resize/JYsH3WYq6GZD4xnvByhHXzwLhPo=/p/full-fit-in/2400x1600/i/556481/products/2021-09-17T19%3A53%3A16.118Z-PXL_20210917_194653430.jpg?1631883222)
A 60% RGB Keyboard PCB with Hot Swap Sockets, running CircuitPython on a RP2040 Soldered on board.
kb.py is designed to work with the [PyKey60 CircuitPython UF2](https://circuitpython.org/board/jpconstantineau_pykey60/)
Retailers (USA)
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/pykey60-rgb-keyboard-pcb-with-a-rp2040/)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

@ -0,0 +1,27 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.COL1,
board.COL2,
board.COL3,
board.COL4,
board.COL5,
board.COL6,
board.COL7,
board.COL8,
board.COL9,
board.COL10,
board.COL11,
board.COL12,
board.COL13,
board.COL14,
)
row_pins = (board.ROW1, board.ROW2, board.ROW3, board.ROW4, board.ROW5)
diode_orientation = DiodeOrientation.COL2ROW
rgb_pixel_pin = board.NEOPIXEL
rgb_num_pixels = 61

View File

@ -0,0 +1,15 @@
# JPConstantineau's GridMX47: A Planck clone
![GridMX47](https://cdn.tindiemedia.com/images/resize/alLUevg6WzBFO9uqkOwd5Lw5tJY=/p/fit-in/1370x912/filters:fill(fff)/i/556481/products/2021-10-26T23%3A29%3A50.131Z-PXL_20211026_230848859.jpg?1635265805)
47 Keys RGB Keyboard inspired from OLKB's Planck with a Raspberry Pi Pico
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
Retailers (USA)
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/47-keys-rgb-keyboard-using-raspberry-pi-pico/)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

@ -0,0 +1,25 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.GP11,
board.GP12,
board.GP13,
board.GP14,
board.GP15,
board.GP19,
board.GP20,
board.GP21,
board.GP22,
board.GP26,
board.GP27,
board.GP28,
)
row_pins = (board.GP7, board.GP8, board.GP9, board.GP10)
diode_orientation = DiodeOrientation.COL2ROW
rgb_pixel_pin = board.GP6
rgb_num_pixels = 47

View File

@ -0,0 +1,15 @@
# JPConstantineau's OffsetMX43: A 40% Staggered keyboard
![OffsetMX43](https://cdn.tindiemedia.com/images/resize/Y9o1UdtekCSE5Jp5FesV2Q3qvCE=/p/fit-in/653x435/filters:fill(fff)/i/556481/products/2021-10-26T23%3A40%3A53.317Z-PXL_20211026_234121626.jpg?1635266543)
43 Keys RGB Keyboard the same size as the GridMX47 but with staggered keys instead of ortholinear (keys in a grid). Uses a Raspberry Pi Pico as the controller.
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
Retailers (USA)
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/43-keys-rgb-keyboard-using-raspberry-pi-pico/)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

@ -0,0 +1,25 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.GP11,
board.GP12,
board.GP13,
board.GP14,
board.GP15,
board.GP19,
board.GP20,
board.GP21,
board.GP22,
board.GP26,
board.GP27,
board.GP28,
)
row_pins = (board.GP7, board.GP8, board.GP9, board.GP10)
diode_orientation = DiodeOrientation.COL2ROW
rgb_pixel_pin = board.GP6
rgb_num_pixels = 47

View File

@ -0,0 +1,15 @@
# JPConstantineau's VColChoc44: A Low Profile Atreus44 clone
![VColChoc44](https://cdn.tindiemedia.com/images/resize/tbqfM8nhMn0hoDM0ZkwYxM23mU0=/p/full-fit-in/2400x1600/i/556481/products/2021-10-15T15%3A33%3A13.288Z-qj04uaoo2ht71.jpg?1634287023)
44 Keys Low Profile RGB Keyboard inspired from Keyboardio's Atreus with a RP2040 Soldered on board.
kb.py is designed to work with the [PyKey60 CircuitPython UF2](https://circuitpython.org/board/jpconstantineau_pykey60/)
Retailers (USA)
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/low-profile-44-keys-rgb-keyboard-pcb-with-a-rp2040/)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

@ -0,0 +1,24 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.COL1,
board.COL2,
board.COL3,
board.COL4,
board.COL5,
board.COL6,
board.COL7,
board.COL8,
board.COL9,
board.COL10,
board.COL11,
)
row_pins = (board.ROW1, board.ROW2, board.ROW3, board.ROW4)
diode_orientation = DiodeOrientation.COL2ROW
rgb_pixel_pin = board.NEOPIXEL
rgb_num_pixels = 44

View File

@ -0,0 +1,16 @@
# JPConstantineau's VColMX44: An Atreus44 clone
![VColMX44](https://cdn.tindiemedia.com/images/resize/5oEyXgxteB6wYjXv8kFC1B3YqOk=/p/full-fit-in/2400x1600/i/556481/products/2021-10-20T05%3A14%3A24.776Z-PXL_20211016_060203733.jpg?1634681706v)
44 Keys RGB Keyboard inspired from Keyboardio's Atreus with a Raspberry Pi Pico
kb.py is designed to work with the [Pico CircuitPython UF2](https://circuitpython.org/board/raspberry_pi_pico/)
Retailers (USA)
[BlueMicro Store on Tindie](https://www.tindie.com/products/jpconstantineau/44-keys-rgb-keyboard-using-raspberry-pi-pico/)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

@ -0,0 +1,24 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.GP20,
board.GP19,
board.GP18,
board.GP17,
board.GP16,
board.GP5,
board.GP4,
board.GP3,
board.GP2,
board.GP1,
board.GP0,
)
row_pins = (board.GP22, board.GP21, board.GP14, board.GP15)
diode_orientation = DiodeOrientation.COL2ROW
rgb_pixel_pin = board.GP28
rgb_num_pixels = 44

View File

@ -8,8 +8,8 @@ kb_converter.py is designed to work with an itsybitsy with converter board found
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -23,11 +22,6 @@ class KMKKeyboard(_KMKKeyboard):
data_pin = board.P0_20
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# Buckle up friends, the bottom row of this keyboard is wild, and making
# our layouts match, visually, what the keyboard looks like, requires some
# surgery on the bottom two rows of coords
@ -36,10 +30,11 @@ class KMKKeyboard(_KMKKeyboard):
# just like the above three rows, however, visually speaking, the
# top-right thumb cluster button (when looking at the left-half PCB)
# is more inline with R3, so we'll jam that key (and its mirror) in here
coord_mapping.extend(ic(3, x) for x in range(6))
coord_mapping.append(ic(4, 2))
coord_mapping.append(ic(4, 9))
coord_mapping.extend(ic(3, x) for x in range(6, 12)) # Now, the rest of R3
# And now, to handle R4, which at this point is down to just six keys
coord_mapping.extend(ic(4, x) for x in range(3, 9))
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
18, 19, 20, 21, 22, 23, 26, 57, 54, 53, 52, 51, 50, 49,
28, 29, 30, 60, 59, 58,
]

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -14,7 +13,7 @@ class KMKKeyboard(_KMKKeyboard):
diode_orientation = DiodeOrientation.COLUMNS
split_flip = True
split_offsets = (6, 6, 6, 6, 6)
split_offset = (6, 6, 6, 6, 6)
split_type = 'UART'
data_pin = board.SCL
data_pin2 = board.SDA
@ -23,11 +22,6 @@ class KMKKeyboard(_KMKKeyboard):
rgb_pixel_pin = board.TX
led_pin = board.D7
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# Buckle up friends, the bottom row of this keyboard is wild, and making
# our layouts match, visually, what the keyboard looks like, requires some
# surgery on the bottom two rows of coords
@ -36,10 +30,11 @@ class KMKKeyboard(_KMKKeyboard):
# just like the above three rows, however, visually speaking, the
# top-right thumb cluster button (when looking at the left-half PCB)
# is more inline with R3, so we'll jam that key (and its mirror) in here
coord_mapping.extend(ic(3, x) for x in range(6))
coord_mapping.append(ic(4, 2))
coord_mapping.append(ic(4, 9))
coord_mapping.extend(ic(3, x) for x in range(6, 12)) # Now, the rest of R3
# And now, to handle R4, which at this point is down to just six keys
coord_mapping.extend(ic(4, x) for x in range(3, 9))
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
18, 19, 20, 21, 22, 23, 26, 57, 54, 53, 52, 51, 50, 49,
28, 29, 30, 60, 59, 58,
]

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.consts import UnicodeMode
from kmk.extensions.rgb import RGB
from kmk.handlers.sequences import compile_unicode_string_sequences as cuss

View File

@ -8,8 +8,8 @@ kb_converter.py is designed to work with an itsybitsy with converter board found
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -9,8 +9,8 @@ kb_converter.py is designed to work with an itsybitsy with converter board found
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -1,9 +1,9 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.modules.layers import Layers
from kmk.scanners import DiodeOrientation
from kmk.scanners import intify_coordinate as ic
# Implements what used to be handled by KMKKeyboard.swap_indicies for this
# board, by flipping various row3 (bottom physical row) keys so their
@ -37,10 +37,10 @@ class KMKKeyboard(_KMKKeyboard):
diode_orientation = DiodeOrientation.COLUMNS
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
coord_mapping.extend(ic(3, r3_swap(x)) for x in range(12))
coord_mapping.extend(ic(0, x, 12) for x in range(12))
coord_mapping.extend(ic(1, x, 12) for x in range(12))
coord_mapping.extend(ic(2, x, 12) for x in range(12))
coord_mapping.extend(ic(3, r3_swap(x), 12) for x in range(12))
layers_ext = Layers()
modules = [layers_ext]

53
boards/kyria/README.md Normal file
View File

@ -0,0 +1,53 @@
# Kyria Keyboard
A split keyboard with a 3x6 columnar stagger and 7 thumb keys. One button on each side is usually replaced by an
encoder.
Official retailer of Kyria PCB: [splitkb.com](https://splitkb.com/collections/keyboard-kits/products/kyria-pcb-kit). PCB
was designed with QMK in mind and KMK implementation is not officially supported by PCB designer and seller.
Keyboard works with controllers having Pro Micro layout. Existing configurations:
| PCB version | Board | Config file |
|:-----------:|----------------------------------------------------------------------|---------------------------|
| 1.* | [Sparkfun Pro Micro RP2040](https://www.sparkfun.com/products/18288) | kyria_v1_rp2040 |
| 1.* | [Adafruit KB2040](https://www.adafruit.com/product/5302) | kyria_v1_kb2040 |
| 2.* | [Sparkfun Pro Micro RP2040](https://www.sparkfun.com/products/18288) | _waiting for pinout docs_ |
| 2.* | [Adafruit KB2040](https://www.adafruit.com/product/5302) | _waiting for pinout docs_ |
## Compatibility issues
- **TRRS connection** - KMK has no protocol for one-pin communication between two splits. So, if you are using TRRS wire
connection, only right side send matrix events to the left side. No issue when using BLE.
- **Right side encoder** - right encoder currently doesn't send updates to left half and can even freeze right half
- **OLED screens** - OLED screens are not required, but often element of Kyria keyboards. KMK have no official OLED
implementation, but as it's based on Circuit Python, adding one is very simple and there are many examples, also on
KMK forks
## `main.py` example config
Current layout is based on default [QMK Kyria layout](https://config.qmk.fm/#/splitkb/kyria/rev1/LAYOUT)
It has the following modules/extensions enabled:
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Do you need more keys than switches? Use
layers.
- [ModTap](https://github.com/KMKfw/kmk_firmware/blob/master/docs/modtap.md) Enable press/hold double binding of keys
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/blob/master/docs/media_keys.md) Common media controls
Also uncomment right section to enable samples of following:
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Turn on the backlight (**requires neopixel.py
library to work**)
- [Encoder](https://github.com/KMKfw/kmk_firmware/blob/master/docs/encoder.md) Make the knobs do something
## More steps required during install
In order to mitigate lack of one-wire protocol, KMK use its UART implementation but with special low-level PIO
subprogram available only on RP2040. It allows using other pins for UART than on-board RX and TX.
Because of the above, besides of normal installation steps, you have to also:
- install Circuit Python in 7.2+ version
- add `adafruit_pioasm.mpy` library to lib or root folder of a board

View File

@ -0,0 +1,34 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
from kmk.scanners import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.A3,
board.A2,
board.A1,
board.A0,
board.SCK,
board.MISO,
board.MOSI,
board.D10,
)
row_pins = (board.D8, board.D7, board.D6, board.D4)
diode_orientation = DiodeOrientation.COL2ROW
data_pin = board.D1
rgb_pixel_pin = board.D0
encoder_pin_0 = board.D9
encoder_pin_1 = board.D5
coord_mapping = []
coord_mapping.extend(ic(0, x, 8) for x in range(6))
coord_mapping.extend(ic(4, x, 8) for x in range(5, -1, -1))
coord_mapping.extend(ic(1, x, 8) for x in range(6))
coord_mapping.extend(ic(5, x, 8) for x in range(5, -1, -1))
coord_mapping.extend(ic(2, x, 8) for x in range(8))
coord_mapping.extend(ic(6, x, 8) for x in range(7, -1, -1))
coord_mapping.extend(ic(3, x, 8) for x in range(3, 8))
coord_mapping.extend(ic(7, x, 8) for x in range(7, 2, -1))

View File

@ -0,0 +1,34 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
from kmk.scanners import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.D29,
board.D28,
board.D27,
board.D26,
board.D22,
board.D20,
board.D23,
board.D21,
)
row_pins = (board.D8, board.D7, board.D6, board.D4)
diode_orientation = DiodeOrientation.COL2ROW
data_pin = board.RX
rgb_pixel_pin = board.D0
encoder_pin_0 = board.D9
encoder_pin_1 = board.D5
coord_mapping = []
coord_mapping.extend(ic(0, x, 8) for x in range(6))
coord_mapping.extend(ic(4, x, 8) for x in range(5, -1, -1))
coord_mapping.extend(ic(1, x, 8) for x in range(6))
coord_mapping.extend(ic(5, x, 8) for x in range(5, -1, -1))
coord_mapping.extend(ic(2, x, 8) for x in range(8))
coord_mapping.extend(ic(6, x, 8) for x in range(7, -1, -1))
coord_mapping.extend(ic(3, x, 8) for x in range(3, 8))
coord_mapping.extend(ic(7, x, 8) for x in range(7, 2, -1))

99
boards/kyria/main.py Normal file
View File

@ -0,0 +1,99 @@
from kyria_v1_rp2040 import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.extensions.rgb import RGB, AnimationModes
from kmk.keys import KC
from kmk.modules.encoder import EncoderHandler
from kmk.modules.layers import Layers
from kmk.modules.modtap import ModTap
from kmk.modules.split import Split, SplitType
keyboard = KMKKeyboard()
keyboard.debug_enabled = True
keyboard.modules.append(Layers())
keyboard.modules.append(ModTap())
keyboard.extensions.append(MediaKeys())
# Using drive names (KYRIAL, KYRIAR) to recognize sides; use split_side arg if you're not doing it
split = Split(split_type=SplitType.UART, use_pio=True)
keyboard.modules.append(split)
# Uncomment below if you're using encoder
encoder_handler = EncoderHandler()
encoder_handler.pins = ((keyboard.encoder_pin_0, keyboard.encoder_pin_1, None, False),)
# Uncomment below if you're having RGB
rgb_ext = RGB(
pixel_pin=keyboard.rgb_pixel_pin,
num_pixels=10,
animation_mode=AnimationModes.BREATHING_RAINBOW,
)
keyboard.extensions.append(rgb_ext)
# Edit your layout below
# Currently, that's a default QMK Kyria Layout - https://config.qmk.fm/#/splitkb/kyria/rev1/LAYOUT
ESC_LCTL = KC.MT(KC.ESC, KC.LCTL)
QUOTE_RCTL = KC.MT(KC.QUOTE, KC.RCTL)
ENT_LALT = KC.MT(KC.ENT, KC.LALT)
MINUS_RCTL = KC.MT(KC.MINUS, KC.RCTL)
keyboard.keymap = [
[
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
ESC_LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, QUOTE_RCTL,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
],
[
KC.TAB, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC,
ESC_LCTL, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, MINUS_RCTL,
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.RSFT,
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
],
[
KC.TAB, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC,
ESC_LCTL, KC.A, KC.R, KC.S, KC.T, KC.G, KC.M, KC.N, KC.E, KC.I, KC.O, QUOTE_RCTL,
KC.LSFT, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.LBRC, KC.CAPS, KC.MO(5), KC.RBRC, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
KC.MO(6), KC.LGUI, ENT_LALT, KC.SPC, KC.MO(3), KC.MO(4), KC.SPC, KC.RALT, KC.RGUI, KC.APP,
],
[
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.PGUP, KC.HOME, KC.UP, KC.END, KC.VOLU, KC.DEL,
KC.TRNS, KC.LGUI, KC.LALT, KC.LCTL, KC.LSFT, KC.TRNS, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.VOLD, KC.INS,
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.SLCK, KC.TRNS, KC.TRNS, KC.PAUS, KC.MPRV, KC.MPLY, KC.MNXT, KC.MUTE, KC.PSCR,
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
],
[
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.EQL,
KC.TILD, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.PLUS,
KC.PIPE, KC.BSLS, KC.COLN, KC.SCLN, KC.MINS, KC.LBRC, KC.LCBR, KC.TRNS, KC.TRNS, KC.RCBR, KC.RBRC, KC.UNDS, KC.COMM, KC.DOT, KC.SLSH, KC.QUES,
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
],
[
KC.TRNS, KC.F9, KC.F10, KC.F11, KC.F12, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
KC.TRNS, KC.F5, KC.F6, KC.F7, KC.F8, KC.TRNS, KC.TRNS, KC.RSFT, KC.RCTL, KC.LALT, KC.RGUI, KC.TRNS,
KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F4, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
],
[
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(0), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(1), KC.TRNS, KC.TRNS, KC.RGB_TOG, KC.RGB_SAI, KC.RGB_HUI, KC.RGB_VAI, KC.RGB_M_P, KC.TRNS,
KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(2), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.RGB_SAD, KC.RGB_HUD, KC.RGB_VAD, KC.RGB_M_P, KC.TRNS,
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
],
]
# Uncomment below if using an encoder
# Edit your encoder layout below
encoder_handler.map = (
((KC.VOLD, KC.VOLU),),
((KC.VOLD, KC.VOLU),),
((KC.VOLD, KC.VOLU),),
((KC.MPRV, KC.MNXT),),
((KC.MPRV, KC.MNXT),),
((KC.MPRV, KC.MNXT),),
((KC.MPRV, KC.MNXT),),
)
keyboard.modules.append(encoder_handler)
if __name__ == '__main__':
keyboard.go()

View File

@ -1,8 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
@ -22,11 +21,11 @@ class KMKKeyboard(_KMKKeyboard):
i2c = board.I2C
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
coord_mapping.extend(ic(3, x) for x in range(12))
# And now, to handle R4, which at this point is down to just ten keys
coord_mapping.extend(ic(4, x) for x in range(1, 11))
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 36, 35, 34, 33, 32, 31,
6, 7, 8, 9, 10, 11, 42, 41, 40, 39, 38, 37,
12, 13, 14, 15, 16, 17, 48, 47, 46, 45, 44, 43,
18, 19, 20, 21, 22, 23, 54, 53, 52, 51, 50, 49,
26, 27, 28, 29, 30, 60, 59, 58, 57, 56,
]

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard, rgb_pixel_pin
from kmk.extensions.ble_split import BLE_Split
from kmk.extensions.layers import Layers
from kmk.extensions.rgb import RGB
@ -37,27 +38,31 @@ extensions = [layers_ext, split, rgb]
keyboard.keymap = [
[ #QWERTY
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.TAB, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
KC.LCTL, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, XXXXXXX, XXXXXXX, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #LOWER
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.ESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.LEFT, KC.DOWN, KC.UP, KC.RIGHT, XXXXXXX, XXXXXXX,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #RAISE
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.ESC, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.BSPC,\
KC.LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.MINS, KC.EQL, KC.LCBR, KC.RCBR, KC.PIPE, KC.GRV,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
KC.LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC.UNDS, KC.PLUS, KC.LBRC, KC.RBRC, KC.BSLS, KC.TILD,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
],
[ #ADJUST
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
KC.LGUI, LOWER, ADJUST, KC.ENT, RAISE, KC.RALT,
]
]

View File

@ -0,0 +1,24 @@
# Lunakey Pico
![Lunakey Pico](https://s2.booth.pm/08af5e15-6203-47a9-9ff4-0e949a678a9b/i/3324672/0b811a3b-27e8-412a-8aa5-57e2880afddb_base_resized.jpg)
Lunakey Pico is a 40% keyboard which has 44 keys and is split to left and right. Each side has 3 rows x 6 columns and 4 keys that are pressed by a thumb. Also, it has an ability to light up by Underglow LEDs on the bottom and an ability to play a sound by a speaker module. Of course, the column-staggered key layout is the result of deep thinking to fit each finger and each key naturally.
* 40% keyboard (3 rows and 6 columns for each side).
* Column-staggered key layout to fit each length of fingers.
* 4 keys for thumb fitted to range of movement of the finger naturally.
* Supported both Cherry MX compatible key switches and Kailh Choc low profile key switches.
* Can exchange key switches without soldering by adopting the key sockets.
* Underglow LEDs lighting effect.
* Provides a sound feedback by a piezoelectric speaker.
The special feature of this Lunakey Pico is that [Raspberry Pi Pico](https://www.raspberrypi.org/products/raspberry-pi-pico/) has been adopted. Users can use some firmwares including [KMK Firmware](https://github.com/KMKfw/kmk_firmware).
Hardware Availability: [PCB & Case Source](https://github.com/yoichiro/lunakey#lunakey-pico)
Retailers: [Lunakey Pico - Yoichiro's Garage - BOOTH](https://yoichiro.booth.pm/items/3324672)
## Dependencies
* [neopixel.py](https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel) - It is necessary to turn on the Underglow LEDs.
* [pwmio](https://circuitpython.readthedocs.io/en/latest/shared-bindings/pwmio/index.html) - It is necessary to support a sound feedback with a piezoelectric speaker.

18
boards/lunakey_pico/kb.py Normal file
View File

@ -0,0 +1,18 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.GP12, board.GP13, board.GP14, board.GP15)
col_pins = (board.GP21, board.GP20, board.GP19, board.GP18, board.GP17, board.GP16)
diode_orientation = DiodeOrientation.COLUMNS
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 29, 28, 27, 26, 25, 24,
6, 7, 8, 9, 10, 11, 35, 34, 33, 32, 31, 30,
12, 13, 14, 15, 16, 17, 41, 40, 39, 38, 37, 36,
20, 21, 22, 23, 47, 46, 45, 44,
]

120
boards/lunakey_pico/main.py Normal file
View File

@ -0,0 +1,120 @@
import board
import digitalio
import pwmio
import time
from kb import KMKKeyboard
from kmk.extensions.RGB import RGB, AnimationModes
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.modtap import ModTap
from kmk.modules.split import Split, SplitSide, SplitType
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
led.value = True
keyboard = KMKKeyboard()
keyboard.tap_time = 100
layers_ext = Layers()
modtap_ext = ModTap()
# TODO Comment one of these on each side
split_side = SplitSide.LEFT
split_side = SplitSide.RIGHT
data_pin = board.GP1 if split_side == SplitSide.LEFT else board.GP0
data_pin2 = board.GP0 if split_side == SplitSide.LEFT else board.GP1
split = Split(
split_side=split_side,
split_type=SplitType.UART,
split_flip=True,
data_pin=data_pin,
data_pin2=data_pin2
)
rgb_ext = RGB(
pixel_pin=board.GP6,
num_pixels=6,
animation_mode=AnimationModes.BREATHING_RAINBOW
)
keyboard.modules = [layers_ext, modtap_ext, split]
keyboard.extensions.append(rgb_ext)
if split_side == SplitSide.LEFT:
buzzer = pwmio.PWMOut(board.GP8, variable_frequency=True)
OFF = 0
ON = 2**15
buzzer.duty_cycle = ON
buzzer.frequency = 2000
time.sleep(0.2)
buzzer.frequency = 1000
time.sleep(0.2)
buzzer.duty_cycle = OFF
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.MO(3)
CT_TAB = KC.MT(KC.TAB, KC.LCTRL)
CT_QUOT = KC.MT(KC.QUOT, KC.LCTRL)
SF_MINS = KC.MT(KC.MINS, KC.LSHIFT)
SG_PSCR = KC.LSFT(KC.LGUI(KC.PSCR))
SF_PSCR = KC.LSFT(KC.PSCR)
CG_RGHT = KC.LCTRL(KC.LGUI(KC.RGHT))
RESET = KC.RESET
LANG1 = KC.LANG1
LANG2 = KC.LANG2
keyboard.keymap = [
[ # QWERTY
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.GESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
CT_TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, CT_QUOT,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, SF_MINS,\
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
KC.LALT, LANG2, LOWER, KC.SPC, KC.ENT, RAISE, LANG1, KC.RALT
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
],
[ # LOWER
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.BSLS, KC.CIRC, KC.EXLM, KC.AMPR, KC.PIPE, KC.DLR, KC.AT, KC.ASTR, KC.PLUS, KC.EQL, KC.PERC, KC.BSPC,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.TRNS, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.DQT,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.COLN, KC.LABK, KC.RABK, KC.QUES, KC.UNDS,\
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
KC.LGUI, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, ADJUST, KC.TRNS, KC.LGUI
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
],
[ # RAISE
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.BSLS, KC.CIRC, KC.EXLM, KC.AMPR, KC.PIPE, KC.DLR, KC.AT, KC.ASTR, KC.PLUS, KC.EQL, KC.PERC, KC.BSPC,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.HASH, KC.GRV, KC.LBRC, KC.RBRC, KC.LPRN, KC.RPRN, KC.PGUP, KC.HOME, KC.UP, KC.END, KC.TRNS, KC.DQT,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.TRNS, KC.TILD, KC.TRNS, KC.TRNS, KC.LCBR, KC.RCBR, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.TRNS, KC.TRNS,\
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
KC.LGUI, KC.TRNS, ADJUST, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.LGUI
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
],
[ # ADJUST
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.TRNS, RESET, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11, KC.F12,\
# ------+--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+
KC.TRNS, KC.TRNS, KC.VOLD, KC.VOLU, KC.MUTE, KC.TRNS, SG_PSCR, SF_PSCR, KC.CAPS, KC.TRNS, CG_RGHT, KC.TRNS,\
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS
# ------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
]
]
if __name__ == '__main__':
keyboard.go()

17
boards/may_pad/README.md Normal file
View File

@ -0,0 +1,17 @@
# May Pad
![Navi10](https://images.squarespace-cdn.com/content/v1/5a8723cb7131a5121206d464/1606191335495-CWRDEYORTXXPJLIAWX4K/_RO_5366.jpg?format=1500w)
A through hole kit using a pro micro footprint and through hole diodes! Can be a 20 key macropad or a numpad!
kb.py is designed to work with the Adafruit KB2040
Retailers (USA)
[KeyHive](https://keyhive.xyz/shop/may-pad)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

16
boards/may_pad/kb.py Normal file
View File

@ -0,0 +1,16 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
row_pins = (board.D5, board.D6, board.D7, board.D8, board.D9)
col_pins = (
board.A1,
board.A0,
board.SCK,
board.MISO,
)
diode_orientation = DiodeOrientation.COLUMNS
i2c = board.I2C

30
boards/may_pad/main.py Normal file
View File

@ -0,0 +1,30 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
media = MediaKeys()
layers_ext = Layers()
keyboard.extensions = [media]
keyboard.modules = [layers_ext]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
keyboard.keymap = [
[
KC.NLCK, KC.PSLS, KC.PAST, KC.PMNS,
KC.P7, KC.P8, KC.P9, _______,
KC.P4, KC.P5, KC.P6, KC.PPLS,
KC.P1, KC.P2, KC.P3, _______,
_______, KC.P0, KC.PDOT, KC.PENT,
]
]
if __name__ == '__main__':
keyboard.go()

17
boards/navi10/README.md Normal file
View File

@ -0,0 +1,17 @@
# Navi10 / ナビ10
![Navi10](https://images.squarespace-cdn.com/content/v1/5a8723cb7131a5121206d464/1578004186455-N1BQI79BSCTK93QAQ76A/20191206_152537.jpg?format=1500w)
A simple and fun navigation cluster macropad with exposed components.
kb.py is designed to work with the Adafruit KB2040
Retailers (USA)
[KeyHive](https://keyhive.xyz/shop/navi10)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions
Common Extensions
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

19
boards/navi10/kb.py Normal file
View File

@ -0,0 +1,19 @@
import board
import digitalio
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
led = digitalio.DigitalInOut(board.D9)
led.direction = digitalio.Direction.OUTPUT
led.value = False
row_pins = (board.D10, board.MOSI, board.MISO, board.D8)
col_pins = (
board.D4,
board.D7,
board.SCK,
)
diode_orientation = DiodeOrientation.COLUMNS
i2c = board.I2C

41
boards/navi10/main.py Normal file
View File

@ -0,0 +1,41 @@
from kb import KMKKeyboard
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
media = MediaKeys()
layers_ext = Layers()
keyboard.extensions = [media]
keyboard.modules = [layers_ext]
# Cleaner key names
_______ = KC.TRNS
XXXXXXX = KC.NO
keyboard.keymap = [
[ #Nav Keys
KC.INSERT, KC.HOME, KC.PGUP,
KC.DELETE, KC.END, KC.PGDOWN,
XXXXXXX, KC.UP, XXXXXXX,
KC.LEFT, KC.DOWN, KC.RIGHT
],
[ #I3
KC.LGUI(KC.L), KC.LGUI(KC.LSHIFT(KC.UP)), KC.LGUI(KC.LSHIFT(KC.P)),
KC.LGUI(KC.LSHIFT(KC.LEFT)), KC.LGUI(KC.LSHIFT(KC.DOWN)), KC.LGUI(KC.LSHIFT(KC.RIGHT)),
XXXXXXX, KC.LGUI(KC.UP), XXXXXXX,
KC.LGUI(KC.LEFT), KC.LGUI(KC.DOWN), KC.LGUI(KC.RIGHT)
],
[ #Media keys
KC.MUTE, KC.MPLY, KC.MSTP,
KC.MRWD, XXXXXXX, KC.MFFD,
XXXXXXX, KC.VOLU, XXXXXXX,
KC.MPRV, KC.VOLD, KC.MNXT
],
]
if __name__ == '__main__':
keyboard.go()

28
boards/pimoroni/README.md Normal file
View File

@ -0,0 +1,28 @@
# Pimoroni Keybow family
A family of macro pads based on raspberry pi hardware:
![Keybow](image url for keybow)
(Original) Keybow - Raspberry Pi hat. 4x3 hotswap keys, with an APA102 LED per key.
![Keybow 2040](image url for keybow 2040)
Keybow 2040 - custom RP2040 board. 4x4 hotswap keys, with an RGB LED per key driven by a shared IS31FL3731 controller.
These boards share the 'feature' of using a single GPIO per key rather than a row and column matrix, so these both
use CircuitPython's `keypad.Keys` module instead of the regular KMK matrix scanner.
## Retailers
### UK
- Pimoroni
- [Keybow](https://shop.pimoroni.com/products/keybow)
- [Keybow 2040](https://shop.pimoroni.com/products/keybow-2040)
### AU
- Core Electronics
- [Keybow](https://core-electronics.com.au/pimoroni-keybow-mini-mechanical-keyboard-kit-clicky-keys.html)
- [Keybow 2040](https://core-electronics.com.au/pimoroni-keybow-2040-tactile-keys.html)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up (Keybow only so far)
- [MediaKeys](https://github.com/KMKfw/kmk_firmware/tree/master/docs/media_keys.md) Control volume and other media functions

View File

View File

View File

@ -0,0 +1,24 @@
from keybow import Keybow
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
from kmk.modules.layers import Layers
keybow = Keybow()
# fmt: off
keybow.keymap = [
[
KC.A, KC.B, KC.C,
KC.E, KC.F, KC.G,
KC.I, KC.J, KC.K,
KC.M, KC.N, KC.O,
]
]
keybow.extensions.extend([MediaKeys()])
keybow.modules.extend([Layers()])
# fmt: on
if __name__ == '__main__':
keybow.go()

View File

@ -0,0 +1,94 @@
'''
KMK keyboard for Pimoroni Keybow.
WARNING: This doesn't currently function correctly on the Raspberry Pi Zero,
some of the keys are stuck in the 'pressed' position. There's either a bug in
the keypad implementation on the rpi0, or the pin numbers don't match the pins
in linux.
This is a 4x3 macro pad designed to fit the rpi's GPIO connector. Each key is
attached to a single GPIO and has an APA102 LED mounted underneath it.
The layout of the board is as follows (GPIO connector on the left):
R0 | D20 D6 D22
R1 | D17 D16 D12
R2 | D24 D27 D26
R0 | D13 D5 D23
------------------
C0 C1 C2
This board also functions with an adaptor (see
https://learn.adafruit.com/itsybitsy-keybow-mechanical-keypad/) to work with an
itsybitsy in place of the rpi, which uses an alternate pin mapping:
R0 | A2 A1 A0
R1 | A5 A4 A3
R2 | D10 D9 D7
R3 | D11 D12 D2
------------------
C0 C1 C2
This keyboard file should automatically select the correct mapping at runtime.
'''
import board
import adafruit_dotstar
import sys
from kmk.extensions.rgb import RGB, AnimationModes
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import KeysScanner
# fmt: off
def raspi_pins():
return [
board.D20, board.D16, board.D26,
board.D6, board.D12, board.D13,
board.D22, board.D24, board.D5,
board.D17, board.D27, board.D23,
]
def itsybitsy_pins():
return [
board.D11, board.D12, board.D2,
board.D10, board.D9, board.D7,
board.A5, board.A4, board.A3,
board.A2, board.A1, board.A0,
]
# fmt: on
def isPi():
return sys.platform == 'BROADCOM'
if isPi():
_KEY_CFG = raspi_pins()
_LED_PINS = (board.SCK, board.MOSI)
else:
_KEY_CFG = itsybitsy_pins()
_LED_PINS = (board.SCK, board.MOSI)
led_strip = adafruit_dotstar.DotStar(_LED_PINS[0], _LED_PINS[1], 12)
rgb_ext = RGB(
pixel_pin=0,
pixels=led_strip,
num_pixels=12,
animation_mode=AnimationModes.BREATHING_RAINBOW,
)
class Keybow(KMKKeyboard):
'''
Default keyboard config for the Keybow.
'''
extensions = [rgb_ext]
def __init__(self):
self.matrix = KeysScanner(_KEY_CFG)

View File

View File

@ -0,0 +1,30 @@
from is31fl3731_pixelbuf import Keybow2040Leds
from keybow_2040 import Keybow2040
from kmk.extensions.rgb import RGB, AnimationModes
from kmk.keys import KC
rgb_ext = RGB(
pixel_pin=0,
pixels=Keybow2040Leds(16),
num_pixels=16,
animation_mode=AnimationModes.BREATHING_RAINBOW,
)
keybow = Keybow2040()
keybow.extensions = [rgb_ext]
# fmt: off
keybow.keymap = [
[
KC.A, KC.B, KC.C, KC.D,
KC.E, KC.F, KC.G, KC.H,
KC.I, KC.J, KC.K, KC.L,
KC.M, KC.N, KC.O, KC.P,
KC.Q
]
]
# fmt: on
if __name__ == '__main__':
keybow.go()

View File

@ -0,0 +1,26 @@
'''
Simple PixelBuf wrapper for the IS31FL3731 controller used for the Keybow2040's RGB LEDs.
'''
import board
from adafruit_is31fl3731.keybow2040 import Keybow2040 as KeybowLeds
from adafruit_pixelbuf import PixelBuf
class Keybow2040Leds(PixelBuf):
'''
Minimal PixelBuf wrapper for the Keybow 2040's LED array.
'''
def __init__(self, size: int):
self.leds = KeybowLeds(board.I2C())
self._pixels = size
super().__init__(size, byteorder='RGB')
def _transmit(self, buffer):
for pixel in range(self._pixels):
r = buffer[pixel * 3 + 0]
g = buffer[pixel * 3 + 1]
b = buffer[pixel * 3 + 2]
self.leds.pixelrgb(pixel // 4, pixel % 4, r, g, b)

View File

@ -0,0 +1,46 @@
'''
KMK keyboard for Pimoroni Keybow 2040.
This is a 4x4 macro pad based on the RP2040. Each key is attached to a single
GPIO, so the KMK matrix scanner needs to be overridden. Additionally, each
key has an RGB LED controlled by an IS31FL3731 controller which is incompatible
with the default RGB module.
The layout of the board is as follows:
[RESET] [USB-C] [BOOT]
R0 | SW3 SW7 SW11 SW15
R1 | SW2 SW6 SW10 SW14
R2 | SW1 SW5 SW9 SW13
R3 | SW0 SW4 SW8 SW12
-----------------------------
C0 C1 C2 C3
The binding defined in the _KEY_CFG array binds the switches to keys such that
the keymap can be written in a way that lines up with the natural order of the
key switches, then adds [BOOT] in (4,0). [RESET] can't be mapped as a key.
'''
import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import KeysScanner
# fmt: off
_KEY_CFG = [
board.SW3, board.SW7, board.SW11, board.SW15,
board.SW2, board.SW6, board.SW10, board.SW14,
board.SW1, board.SW5, board.SW9, board.SW13,
board.SW0, board.SW4, board.SW8, board.SW12,
board.USER_SW,
]
# fmt: on
class Keybow2040(KMKKeyboard):
'''
Default keyboard config for the Keybow2040.
'''
def __init__(self):
self.matrix = KeysScanner(_KEY_CFG)

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -1,8 +1,8 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
from kmk.scanners import DiodeOrientation
from kmk.scanners import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
@ -30,9 +30,9 @@ class KMKKeyboard(_KMKKeyboard):
powersave_pin = board.P0_13
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
coord_mapping.extend(ic(0, x, 12) for x in range(12))
coord_mapping.extend(ic(1, x, 12) for x in range(12))
coord_mapping.extend(ic(2, x, 12) for x in range(12))
# And now, to handle R3, which at this point is down to just five keys
coord_mapping.extend(ic(3, x) for x in range(5))
coord_mapping.extend(ic(3, x, 12) for x in range(5))

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -11,9 +11,9 @@ Retailers (USA)
Extensions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers.
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves without wires
- [BLE_Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves without wires
- [ModTap](https://github.com/KMKfw/kmk_firmware/tree/master/docs/modtap.md) Allows mod keys to act as different keys when tapped.
Common Extensions
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split.md) Connects halves using a wire
- [Split](https://github.com/KMKfw/kmk_firmware/tree/master/docs/split_keyboards.md) Connects halves using a wire
- [Power](https://github.com/KMKfw/kmk_firmware/tree/master/docs/power.md) Powersaving features for battery life

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.layers import Layers
from kmk.extensions.split import Split, SplitSide, SplitType
from kmk.keys import KC

View File

@ -0,0 +1,25 @@
# Sofle V2
![Sofle V2](https://github.com/josefadamcik/SofleKeyboard)
"Sofle is 6×4+5 keys column-staggered split keyboard with encoder support. Based on Lily58, Corne and Helix keyboards."
Hardware Availability: [PCB & Case Source](https://github.com/josefadamcik/SofleKeyboard)
`kb.py` is designed to work with the [SparkFun Pro Micro RP2040](https://www.sparkfun.com/products/18288).
Retailers
[beekeeb (Hong Kong)](https://shop.beekeeb.com/product/sofle-v2-soflekeyboard-v2-0-1-split-ergonomic-diy-mechanical-keyboard-pcb-kit/)
[Ergomech Store (Vietnam)](https://ergomech.store/shop/product/sofle-v2-2#attr=5,23)
Extentions enabled by default
- [Layers](https://github.com/KMKfw/kmk_firmware/blob/master/docs/layers.md) "Layers module adds keys for accessing other layers."
- [Split](https://github.com/KMKfw/kmk_firmware/blob/master/docs/split_keyboards.md) Connects halves with or without wires (currently uses wires)
- You must add the `adafruit_pioasm.mpy` to the `lib` folder on the RP2040 for this code to work. More about this is described [here](https://github.com/KMKfw/kmk_firmware/blob/master/docs/split_keyboards.md#rp2040-pio-implementation).
- [Encoder](https://github.com/KMKfw/kmk_firmware/blob/master/docs/encoder.md) "Add twist control to your keyboard!"
## Notes
- This keymap I used the [default used by QMK for Sofle](https://github.com/qmk/qmk_firmware/blob/master/keyboards/sofle/keymaps/default/keymap.c) (I only used QWERTY, RAISE and LOWER)
- As of 2022-04-05: Only one encoder will work at the moment. The side that is plugged in will work and the way I wrote it is designed to work with the left plugged in. If the right is plugged in the encoder will work but the encoder will work backwards.
- It is possible that the KMK code used for the Sofle V2 could be used on the Sofle V1 or the Sofle RGB or the Sofle Choc. These would each need to be tested to see if they work.

View File

@ -0,0 +1,21 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
col_pins = (board.A1, board.A0, board.SCK, board.MISO, board.MOSI, board.D21)
row_pins = (board.D5, board.D6, board.D7, board.D8, board.D9)
diode_orientation = DiodeOrientation.COL2ROW
encoder_pin_0 = board.A2
encoder_pin_1 = board.A3
# NOQA
# flake8: noqa
coord_mapping = [
0, 1, 2, 3, 4, 5, 35, 34, 33, 32, 31, 30,
6, 7, 8, 9, 10, 11, 41, 40, 39, 38, 37, 36,
12, 13, 14, 15, 16, 17, 47, 46, 45, 44, 43, 42,
18, 19, 20, 21, 22, 23, 53, 52, 51, 50, 49, 48,
24, 25, 26, 27, 28, 29, 59, 58, 57, 56, 55, 54
]

View File

@ -0,0 +1,77 @@
import board
from kb import KMKKeyboard
from kmk.keys import KC
from kmk.modules.encoder import EncoderHandler
from kmk.modules.layers import Layers
from kmk.modules.split import Split, SplitType
keyboard = KMKKeyboard()
layers_ext = Layers()
split = Split(
split_flip=True, # If both halves are the same, but flipped, set this True
split_type=SplitType.UART, # Defaults to UART
uart_interval=20, # Sets the uarts delay. Lower numbers draw more power
data_pin=board.RX, # The primary data pin to talk to the secondary device with
data_pin2=board.TX, # Second uart pin to allow 2 way communication
use_pio=True, # allows for UART to be used with PIO
)
keyboard.modules = [layers_ext, split]
# Cleaner key names
XXXXXXX = KC.NO
UNDO = KC.LCTL(KC.Z)
CUT = KC.LCTL(KC.X)
COPY = KC.LCTL(KC.C)
PASTE = KC.LCTL(KC.V)
LSTRT = KC.LCTL(KC.HOME)
LEND = KC.LCTL(KC.END)
BACK = KC.LALT(KC.LEFT)
NEXT = KC.LALT(KC.RGHT)
LBSPC = KC.LCTL(KC.BSPC)
LOWER = KC.MO(1)
RAISE = KC.MO(2)
keyboard.keymap = [
[ # QWERTY
# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----#ENCODER--#ENCODER--# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.GRV,
KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC,
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT,
KC.LGUI, KC.LALT, KC.LCTL, LOWER, KC.ENT, KC.MUTE, KC.MPLY, KC.SPC, RAISE, KC.RCTL, KC.RALT, KC.RGUI,
],
[ #LOWER
# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----#ENCODER--#ENCODER--# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----
XXXXXXX, KC.F1, KC.F2, KC.F3, KC.F4, KC.F5, KC.F6, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.F12,
XXXXXXX, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.PIPE,
XXXXXXX, KC.EQL, KC.MINS, KC.PLUS, KC.LCBR, KC.RCBR, KC.LBRC, KC.RBRC, KC.SCLN, KC.COLN, KC.BSLS, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
],
[ #RAISE
# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----#ENCODER--#ENCODER--# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----# HERE----
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, KC.INS, KC.PSCR, KC.APP, XXXXXXX, XXXXXXX, KC.PGUP, BACK, KC.UP, NEXT, LBSPC, KC.BSPC,
XXXXXXX, KC.LALT, KC.LCTL, KC.LSFT, XXXXXXX, KC.CAPS, KC.PGDN, KC.LEFT, KC.DOWN, KC.RGHT, KC.DEL, KC.BSPC,
XXXXXXX, UNDO, CUT, COPY, PASTE, XXXXXXX, XXXXXXX, LSTRT, XXXXXXX, LEND, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
]
]
encoder_handler = EncoderHandler()
encoder_handler.pins = ((keyboard.encoder_pin_1, keyboard.encoder_pin_0, None, False),)
encoder_handler.map = (
((KC.VOLD, KC.VOLU),), # base layer
((KC.VOLD, KC.VOLU),), # Raise
((KC.VOLD, KC.VOLU),), # Lower
)
keyboard.modules.append(encoder_handler)
if __name__ == '__main__':
keyboard.go()

View File

@ -1,7 +1,7 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):

View File

@ -1,4 +1,5 @@
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers

View File

@ -4,8 +4,6 @@
KMK is a keyboard focused layer that sits on top of [CircuitPython](https://circuitpython.org/). As such, it should work with most [boards that support CircuitPython](https://circuitpython.org/downloads). It is best to use the last stable version (>5.0).
Known working and recommended devices can be found [here](Officially_Supported_Microcontrollers.md)
We are also providing a keyboard optimized version of CircuitPython (simplified to cope with memory limits of certain boards and with a selection of preinstalled relevant modules). If you're wondering why use KMKPython rather than barebone CircuitPython, we tried to compare both approaches [here](kmkpython_vs_circuitpython.md)
<br>
## TL;DR Quick start guide
@ -15,11 +13,8 @@ We are also providing a keyboard optimized version of CircuitPython (simplified
3. Unzip it and copy the KMK folder and the boot.py file at the root of the USB drive corresponding to your board (often appearing as CIRCUITPY)
4. Create a new *code.py* or *main.py* file in the same root directory (same level as boot.py) with the example content hereunder:
***IMPORTANT:*** adapt the GP0 / GP1 pins to your specific board ! <br>
```
print("Starting")
@ -27,12 +22,12 @@ import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
keyboard = KMKKeyboard()
keyboard.col_pins = (board.GP0,)
keyboard.row_pins = (board.GP1,)
keyboard.col_pins = (board.GP0,) # try D5 on Feather, keeboar
keyboard.row_pins = (board.GP1,) # try D6 on Feather, keeboar
keyboard.diode_orientation = DiodeOrientation.COL2ROW
keyboard.keymap = [
@ -43,9 +38,12 @@ if __name__ == '__main__':
keyboard.go()
```
5. With a wire / paperclip / whatever, connect GPIO 0 & GPIO 1 together (or the pins you chose for your boards)
6. If it prints a "A" (or a "Q" or ... depending on your keyboard layout), you're done!
5. With a wire / paperclip / whatever, connect the pins you selected for col_pin and row_pin together.
![feather and keeboar example pins](pins56.jpg)
6. If it prints the letter "a" (or a "Q" or ... depending on your keyboard layout), you're done!
<br>
@ -54,8 +52,7 @@ if __name__ == '__main__':
> This is your last chance. After this, there is no turning back. You take the blue pill—the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill—you stay in Wonderland, and I show you how deep the rabbit hole goes. Remember: all I'm offering is the truth. Nothing more.
### You're extremely lucky and you have a fully supported keyboard
If your keyboard and microcontroller are officially supported, simply visit the page for your files, and dropping them on the root of the "flash drive". Those pages can be found [here](https://github.com/KMKfw/boards). You will need the `kb.py` and `main.py`. More advanced instructions can be found [here](config_and_keymap.md).
Please note that we recommend using [KMKPython](https://github.com/KMKfw/kmkpython) for these boards as it is optimized for them. If using Circuitpython and NOT KMKPython, you will also need [boot.py](https://github.com/KMKfw/kmk_firmware/blob/master/boot.py)
If your keyboard and microcontroller are officially supported, simply visit the page for your files, and dropping them on the root of the "flash drive". Those pages can be found [here](https://github.com/KMKfw/kmk_firmware/tree/master/boards). You will need the `kb.py` and `main.py`. More advanced instructions can be found [here](config_and_keymap.md).
### You've got another, maybe DIY, board and want to customise KMK for it
First, be sure to understand how your device work, and particularly its specific matrix configuration. You can have a look [here](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) or read the [guide](https://docs.qmk.fm/#/hand_wire) provided by the QMK team for handwired keyboards
@ -67,10 +64,10 @@ First, be sure to understand how your device work, and particularly its specific
And to go even further:
- [Sequences](sequences.md) are used for sending multiple keystrokes in a single action
- [Layers](layers.md) can transform the whole way your keyboard is behaving with a single touch
- [ModTap](modtap.md) allow you tu customize the way a key behaves wether it is tapped or hold, and [TapDance](tapdance.md) depending on the number of times it is pressed
- [ModTap](modtap.md) allow you to customize the way a key behaves wether it is tapped or hold, and [TapDance](tapdance.md) depending on the number of times it is pressed
Want to have fun features such as RGB, split keyboards and more? Check out what builtin [modules](modules.md) and [extensions](extensions.md) can do!
You can also get ideas from the various [user examples](https://github.com/KMKfw/user_keymaps) that we provide and dig into our [documentation](https://github.com/KMKfw/kmk_firmware/tree/master/docs)
You can also get ideas from the various [user examples](https://github.com/KMKfw/kmk_firmware/tree/master/user_keymaps) that we provide and dig into our [documentation](README.md).
<br>

View File

@ -13,6 +13,10 @@ Features include
Downsides
- $25 USD per microcontroller at most retailers
### Pre-compiling KMK for Nice!Nano
Nice!Nano has limited flash memory which does not fit CircuitPython, adafruit-ble, and KMK by default. You will need to use pre-compiled KMK to get it to fit. Grab [compatible mpy-cross](https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/mpy-cross/) and run `make compile` to generate `.mpy` version of KMK files before copying them over.
Common Retailers
[Boardsource](https://boardsource.xyz/store/5f4a1733bbaa5c635b83ed67)
[NiceKeyboards](https://nicekeyboards.com/collections/group-buy/products/nice-nano-v1-0).
@ -57,6 +61,6 @@ Common Retailers
## Other microcontrollers
What you'll need to have at minimum
- CircuitPython/KMKpython
- CircuitPython
- 256KB of flash storage
- HID over USB and/or Bluetooth.

53
docs/README.md Normal file
View File

@ -0,0 +1,53 @@
# Documentation index
> Before you look further, you probably want to start with our [getting started guide](https://github.com/KMKfw/kmk_firmware/blob/master/docs/Getting_Started.md)
## Basics
- [Getting Started](Getting_Started.md)
- [Bluetooth HID](ble_hid.md): Connect keyboard to PC or mobile device using BLE
- [Configuring KMK](config_and_keymap.md)
- [Porting to KMK](porting_to_kmk.md): Creating a `kb.py` file for a board
- [Debugging](debugging.md)
- [Keycodes](keycodes.md): List of all available keycodes
- [Officially supported microcontrollers](Officially_Supported_Microcontrollers.md)
- [Support](support.md)
- [Contributing](contributing.md)
## Advanced
- [Flashing instructions](flashing.md)
- [Handwiring](handwiring.md): Resources helpful when handwiring a keyboard circuit
- [Keys](keys.md): Technical explanation of key handling
- [Scanners](scanners.md): Setting up non-default key reading
## [Modules](modules.md)
- [Combos](combos.md): Adds chords and sequences
- [Layers](layers.md): Adds layer support (Fn key) to allow many more keys to be put on your keyboard
- [ModTap](modtap.md): Adds support for augmented modifier keys to act as one key when tapped, and modifier when held.
- [Mouse keys](mouse_keys.md): Adds mouse keycodes
- [OneShot](oneshot.md): Adds support for oneshot/sticky keys.
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!
- [TapDance](tapdance.md): Different key actions depending on how often it is pressed.
### Peripherals
- [ADNS9800](adns9800.md): Controlling ADNS9800 optical sensor
- [Encoder](encoder.md): Handling rotary encoders
- [Pimoroni trackball](pimoroni_trackball.md): Handling a small I2C trackball made by Pimoroni
## [Extensions](extensions.md)
- [International](international.md): Adds international keycodes
- [LED](led.md): Adds backlight support. This is for monocolor backlight, not RGB
- [LockStatus](lock_status.md): Exposes host-side locks like caps or num lock.
- [MediaKeys](media_keys.md): Adds support for media keys such as volume
- [RGB](rgb.md): RGB lighting for underglow. Will work on most matrix RGB as will be treated the same as underglow.
- [Status LED](extension_statusled.md): Indicates which layer you are on with an array of single leds.
## Language versions
- [Japanese getting started](ja/Getting_Started.md)
- [Brazilian Portuguese](https://github.com/KMKfw/kmk_firmware/tree/master/docs/ptBR)

62
docs/boot.md Normal file
View File

@ -0,0 +1,62 @@
# boot.py
`boot.py` lives in the root of your keyboard when mounted as a storage device.
There is a more detailed explanation in the [circuit python docs](https://docs.circuitpython.org/en/latest/README.html),
however there are some common use cases for your keyboard listed here.
## Hiding device storage
You can hide your device from showing up as a usb storage by default (this can be overridden
at startup if desired, per the example code further down this page).
```python
storage.disable_usb_drive()
```
## Using your keyboard before the OS loads
You can make your keyboard work in your computer's BIOS and bootloader (useful if you dual-boot).
```python
usb_hid.enable(boot_device=1)
```
## Disabling serial communication
By default, you can connect to your board's serial console, which can be useful for debugging,
but may not be desired for everyday use.
```python
# Equivalent to usb_cdc.enable(console=False, data=False)
usb_cdc.disable()
```
## Example code
Below is a fully working example, which disables usb storage, cdc and enables BIOS mode.
```python
import supervisor
import board
import digitalio
import storage
import usb_cdc
import usb_hid
# This is from the base kmk boot.py
supervisor.set_next_stack_limit(4096 + 4096)
# If this key is held during boot, don't run the code which hides the storage and disables serial
# To use another key just count its row and column and use those pins
# You can also use any other pins not already used in the matrix and make a button just for accesing your storage
col = digitalio.DigitalInOut(board.GP2)
row = digitalio.DigitalInOut(board.GP13)
# TODO: If your diode orientation is ROW2COL, then make row the output and col the input
col.switch_to_output(value=True)
row.switch_to_input(pull=digitalio.Pull.DOWN)
if not row.value:
storage.disable_usb_drive()
# Equivalent to usb_cdc.enable(console=False, data=False)
usb_cdc.disable()
usb_hid.enable(boot_device=1)
row.deinit()
col.deinit()
```

27
docs/capsword.md Normal file
View File

@ -0,0 +1,27 @@
# CapsWord
The capsword module functions similar to caps lock but will deactive automatically when its encounters a key that breaks the word or after inactivity timeout.
By default it will not deactive capsword on numbers, alphabets, underscore, modifiers, minus, backspace and other keys like modtap, layers, etc.
Add it to your keyboard's modules list with:
```python
from kmk.modules.capsword import CapsWord
# default inactivity timeout is 8s
caps_word=CapsWord()
# change inactivity timeout
# caps_word=CapsWord(timeout=5000)
# for no inactivity timeout
# caps_word=CapsWord(timeout=0)
# add additional ignored keys
# caps_word.keys_ignored.append(KC.COMMA)
keyboard.modules.append(caps_word)
keyboard.keymap = [
[
KC.CW,
],
]
```
## Keycodes
|Key |Aliases |Description |
|-----------------------|--------------------|-----------------------------------------------|
|`KC.CW` |`KC.CAPSWORD` |Enables/disables capsword |

21
docs/cg_swap.md Normal file
View File

@ -0,0 +1,21 @@
# Ctrl Gui Swap
This module allows to swap Ctrl with Gui and vice versa. This will reset on restart to the default implementation
## Enabling the module
```python
from kmk.module.cg_swap import CgSwap
# cg_swap disabled on startup
cg_swap = CgSwap()
# cg_swap enabled on startup
# cg_swap = CgSwap(cg_swap_enable=True)
keyboard.modules.append(cg_swap)
keyboard.keymap = [
[
KC.CG_SWAP, # swap ctrl and gui
KC.CG_NORM, # unswap ctrl and gui
KC.CG_TOGG, # toggles ctrl and gui swap
],
]
```

45
docs/combos.md Normal file
View File

@ -0,0 +1,45 @@
# Combos
Combos allow you to assign special functionality to combinations of key presses.
The two default behaviors are:
* Chords: match keys in random order, all pressed within 50ms.
* Sequences: match keys in order, pressed within 1s of one another.
You can define combos to listen to any valid KMK key, even internal or
functional keys, like HoldTap. When using internal KMK keys, be aware that the
order of modules matters.
The result of a combo is another key being pressed/released; if the desired
action isn't covered by KMK keys: create your own with `make_key` and attach
corresponding handlers.
Combos may overlap, i.e. share match keys amongst each other.
The optional arguments `timeout` and `per_key_timeout` define the time window
within which the match has to happen and wether the timeout is renewed after
each key press, respectively. These can be customized for every combo
individually.
## Keycodes
|New Keycode |Description |
|------------|----------------------------------------------------|
|`KC.LEADER` | a dummy / convenience key for leader key sequences |
## Example Code
```python
from kmk.keys import KC, make_key
from kmk.modules.combos import Combos, Chord, Sequence
combos = Combos()
keyboard.modules.append(combos)
make_key(
names=('MYKEY',),
on_press=lambda: print('I pressed MYKEY'),
)
combos.combos = [
Chord((KC.A, KC.B), KC.LSFT)
Chord((KC.A, KC.B, KC.C), KC.LALT)
Sequence((KC.LEADER, KC.A, KC.B), KC.C)
Sequence((KC.E, KC.F) KC.MYKEY, timeout=500, per_key_timeout=False)
]
```

View File

@ -35,7 +35,7 @@ if __name__ == '__main__':
```python
import board
from kmk.matrix import DiodeOrientation
from kmk.scanners import DiodeOrientation
col_pins = (board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4)
row_pins = (board.D10, board.D11, board.D12, board.D13, board.D9, board.D6, board.D5, board.SCL)

68
docs/contributing.md Normal file
View File

@ -0,0 +1,68 @@
# Contributing
KMK is a community effort and welcomes contributions of code and documentation from people
of all backgrounds and levels of technical skill. As such, these guidelines should serve
to make contributing as easy as possible for everyone while maintaining a consistent style.
## Contributing Code
The following guidelines should ensure that any code contributed can be merged in as
painlessly as possible. If you're unsure how to set up your development environment,
feel free to join the chat, [#kmkfw:klar.sh on Matrix](https://matrix.to/#/#kmkfw:klar.sh).
This channel is bridged to Discord [here](https://discord.gg/QBHUUpeGUd) for convenience.
### Code Style
KMK uses [Black](https://github.com/psf/black) with a Python 3.6 target and,
[(controversially?)](https://github.com/psf/black/issues/594) single quotes.
Further code styling is enforced with isort and flake8 with several plugins.
**NOTE:** before committing code, run `make fix-isort fix-formatting test` to
reduce workload for the project's maintainers and prevent the CI pipeline from
failing.
There are some limited exceptions to the code formatting rules, which can be
found in `setup.cfg`, notably around `user_keymaps` (which are also not subject
to Black formatting as documented in `pyproject.toml`)
### Tests
Unit tests within the `tests` folder mock various CicuitPython modules to allow
them to be executed in a desktop development environment.
Execute tests using the command `python -m unittest`.
## Contriburing Documentation
While KMK welcomes documentation from anyone with and understanding of the issues
and a willingness to write them up, it's a good idea to familiarize yourself with
the docs. Documentation should be informative but concise.
### Styling
Docs are written and rendered in GitHub Markdown. A comprehensive guide to GitHub's
Markdown can be found [here](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax).
In particular, KMK's docs should include a title, demarcated with `#`, and subheadings
should be demarcated with `##`, `###`, and so on. Headings should be short and specific.
### Example Code
Where possible, practical code examples should be included in documentation to help
new users understand how to implement features. In general, it's better to have a code-
block with comments inside it rather than multiple blocks of code broken up with
explanation.
Code blocks should be formatted as Python code as follows:
````
```python
print('Hello, world!')
```
````
Inline code, indicated with `` `backticks` ``, should be used when calling out specific
functions or Python keywords within the body of paragraphs or in lists.
## License, Copyright, and Legal
All software in this repository is licensed under the [GNU Public License,
verison 3](https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)).
All documentation and hardware designs are licensed under the [Creative Commons
Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
license. Contributions to this repository must use these licenses unless
otherwise agreed to by the Core team.

25
docs/easypoint.md Normal file
View File

@ -0,0 +1,25 @@
# AS5013 (aka. 'EasyPoint')
Module handles the AM5013 Two-dimensional magnetic position sensor with digital coordinates output
Product page: https://www.mouser.dk/ProductDetail/ams/AS5013-IQFT?qs=abmNkq9no6D3ApA%252BrWSMNQ%3D%3D
### Usage
Declare I2C bus and add this module in your main class.
```python
from kmk.modules.easypoint import Easypoint
import busio as io
i2c = busio.I2C(scl=board.GP1, sda=board.GP0)
easypoint = Easypoint(i2c, address=0x40)
keyboard.modules.append(easypoint)
```
Further configuring the AS5013 involved x/y-offset, and deadzone.
```python
easypoint = Easypoint(i2c, address=0x40, y_offset=Y_OFFSET, x_offset=X_OFFSET, dead_x=DEAD_X, dead_y=DEAD_Y)
```

View File

@ -1,59 +1,165 @@
# Encoder
Add twist control to your keyboard! Volume, zoom, anything you want.
## Enabling the extension
The constructor(`EncoderHandler` class) takes a minimum of 3 arguments: a list of pad_a pins, a list of pad_b pins,
and an encoder_map. The encoder_map is modeled after the keymap and works the
same way. It should have as many layers as your keymap, and use KC.NO keys for
layers that you don't require any action. The encoder supports a velocity mode
if you desire to make something for video or sound editing. The direction of
increment/decrement can be changed to make sense for the direction the knob is
turning by setting the is_inverted flag.
## Configuration
There is a complete example in the Atreus62 [main.py](/boards/atreus62/main.py)
Create the encoder_map.
> Anatomy of an encoder_map tuple: (increment_key, decrement_key, keys presses per encoder click)
> `encoder_map` is a Nested List with a Tuple as the list element (`List[List[Tuple(Key,Key,Int)]]`)
```python
from kmk.modules.encoder import EncoderHandler # import the Encoder module
Zoom_in = KC.LCTRL(KC.EQUAL)
Zoom_out = KC.LCTRL(KC.MINUS)
# create the encoder map, modeled after the keymap
encoder_map = [
[
# Only 1 encoder is being used, so only one tuple per layer is required
# Increment key is volume up, decrement key is volume down, and sends 2
# key presses for every "click" felt while turning the encoder.
(KC.VOLU,KC.VOLD,2),
],
[
# only one key press sent per encoder click
(Zoom_in, Zoom_out,1),
],
[
# No action keys sent here, the resolution is a dummy number, to be
# removed in the future.
(_______,_______,1),#
]
]
# create the encoder instance, and pass in a list of pad_a pins, a list of pad_b
# pins, and the encoder map created above
encoder_ext = EncoderHandler([board.D40],[board.D41], encoder_map)
# if desired, you can flip the incrfement/decrement direction of the knob by
# setting the is_inerted flag to True. If you turn the knob to the right and
# the volume goes down, setting this flag will make it go up. It's default
# setting is False
encoder_ext.encoders[0].is_inverted = True
# Make sure to add the encoder_ext to the modules list
keyboard.modules = [encoder_ext]
```
# Encoder module
Add twist control to your keyboard! Volume, zoom, anything you want
I2C encoder type has been tested with the Adafruit I2C QT Rotary Encoder with NeoPixel
## Enabling the extension
The constructor(`EncoderHandler` class) takes a list of encoder, each one defined as either:
* a list of pad_a pin, pad_b pin, button_pin and optionnally a flag set to True is you want it to be reversed
* a `busio.I2C`, address and optionally a flag set to True if you want it to be reversed
The encoder_map is modeled after the keymap and works the same way. It should have as many layers (key pressed on "turned left", key pressed on "turned right", key pressed on "knob pressed") as your keymap, and use KC.NO keys for layers that you don't require any action.
The encoder supports a velocity mode if you desire to make something for video or sound editing.
## How to use
How to use this module in your main / code file
1. load the module
```python
from kmk.modules.encoder import EncoderHandler
encoder_handler = EncoderHandler()
keyboard.modules = [layers, modtap, encoder_handler]
```
2. Define the pins for each encoder (pin_a, pin_b, pin_button [or `None` if the encoder's button is handled differently or not at all], True for an inversed encoder)
```python
#GPIO Encoder
encoder_handler.pins = ((board.GP17, board.GP15, board.GP14, False), (encoder 2 definition), etc. )
```
OR
```python
# I2C Encoder
# Setup i2c
SDA = board.GP0
SCL = board.GP1
i2c = busio.I2C(SCL, SDA)
encoder_handler.pins = ((i2c, 0x36, False),)
```
3. Define the mapping of keys to be called (1 / layer)
```python
# You can optionally predefine combo keys as for your layout
Zoom_in = KC.LCTRL(KC.EQUAL)
Zoom_out = KC.LCTRL(KC.MINUS)
encoder_handler.map = [(( KC.VOLD, KC.VOLU, KC.MUTE),(encoder 2 definition), etc. ), # Layer 1
((KC.Zoom_out, KC.Zoom_in, KC.NO),(encoder 2 definition), etc. ), # Layer 2
((KC.A, KC.Z, KC.N1),(encoder 2 definition), etc. ), # Layer 3
((KC.NO, KC.NO, KC.NO),(encoder 2 definition), etc. ), # Layer 4
]
```
4. Encoder methods on_move_do and on_button_do can be overwritten for complex use cases
## Full example (with 1 encoder)
```python
import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.consts import UnicodeMode
from kmk.keys import KC
from kmk.scanners import DiodeOrientation
from kmk.modules.layers import Layers
from kmk.modules.encoder import EncoderHandler
keyboard = KMKKeyboard()
layers = Layers()
encoder_handler = EncoderHandler()
keyboard.modules = [layers, encoder_handler]
keyboard.col_pins = (
board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5,
board.GP6, board.GP7, board.GP8, board.GP9, board.GP10, board.GP11,
board.GP12, board.GP13,
)
keyboard.row_pins = (board.GP28, board.GP27, board.GP22, board.GP26, board.GP21)
keyboard.diode_orientation = DiodeOrientation.COLUMNS
# I2C example
#import busio
#SDA = board.GP0
#SCL = board.GP1
#i2c = busio.I2C(SCL, SDA)
#encoder_handler.i2c = ((i2c, 0x36, False),)
encoder_handler.pins = ((board.GP17, board.GP15, board.GP14, False),)
keyboard.tap_time = 250
keyboard.debug_enabled = False
# Filler keys
_______ = KC.TRNS
xxxxxxx = KC.NO
tbdtbd = KC.A
# Layers
LYR_STD, LYR_EXT, LYR_NUM, LYR_GAME = 0, 1, 2, 3
TO_STD = KC.DF(LYR_STD)
MT_EXT = KC.MO(LYR_EXT)
TO_NUM = KC.MO(LYR_NUM)
TO_GAME = KC.DF(LYR_GAME)
# Keymap
keyboard.keymap = [
# Standard (ISO) Layer
[
KC.ESC , KC.N1 , KC.N2 , KC.N3 , KC.N4 , KC.N5 , KC.N6 , KC.N7 , KC.N8 , KC.N9 , KC.N0 , KC.MINS, KC.EQL , KC.BSPC,
KC.TAB , KC.Q , KC.W , KC.E , KC.R , KC.T , KC.Y , KC.U , KC.I , KC.O , KC.P , KC.LBRC, KC.RBRC, KC.DEL ,
xxxxxxx, KC.A , KC.S , KC.D , KC.F , KC.G , KC.H , KC.J , KC.K , KC.L , KC.SCLN, KC.QUOT, KC.NUHS, xxxxxxx,
KC.LSFT, KC.NUBS, KC.Z , KC.X , KC.C , KC.V , KC.B , KC.N , KC.M , KC.COMM, KC.DOT , KC.SLSH, KC.UP , KC.ENT ,
KC.LCTL, KC.LGUI, xxxxxxx, KC.LALT, MT_EXT , xxxxxxx, KC.SPC , xxxxxxx, KC.RALT, TO_NUM , KC.RSFT, KC.LEFT, KC.DOWN, KC.RGHT,
],
# Extra Keys Layer
[
TO_STD , KC.F1 , KC.F2 , KC.F3 , KC.F4 , KC.F5 , KC.F6 , KC.F7 , KC.F8 , KC.F9 , KC.F10 , KC.F11 , KC.F12 , KC.RESET,
_______, KC.N1 , KC.N2 , KC.N3 , KC.N4 , KC.N5 , KC.N6 , KC.N7 , KC.N8 , KC.N9 , KC.N0 , KC.MINS, KC.EQL , _______,
xxxxxxx, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, xxxxxxx,
KC.LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC.PGUP, _______,
KC.LCTL, KC.LGUI, xxxxxxx, KC.LALT, MT_EXT , xxxxxxx, _______, xxxxxxx, _______, TO_NUM , _______, KC.HOME, KC.PGDN, KC.END ,
],
# NumPad Layer
[
TO_STD , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.P7 , KC.P8 , KC.P9 , KC.PSLS, xxxxxxx, xxxxxxx, KC.BSPC,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.P4 , KC.P5 , KC.P6 , KC.PAST, xxxxxxx, xxxxxxx, KC.DEL ,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.LPRN, KC.P1 , KC.P2 , KC.P3 , KC.PPLS, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.RPRN, KC.P0 , KC.PDOT, _______, KC.PMNS, xxxxxxx, xxxxxxx, KC.PENT,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, MT_EXT , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, TO_NUM , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
],
# Gaming Layer
[
TO_STD , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, MT_EXT , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, TO_NUM , xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
],
]
# Rotary Encoder (1 encoder / 1 definition per layer)
encoder_handler.map = ( ((KC.UP, KC.DOWN, KC.MUTE),), # Standard
((KC.VOLD, KC.VOLU, KC.MUTE),), # Extra
((KC.A, KC.Z, KC.N1),), # NumPad not yet properly configured
((KC.A, KC.Z, KC.N1),), # Gaming not yet properly configured
)
if __name__ == "__main__":
keyboard.go()

Some files were not shown because too many files have changed in this diff Show More