From 6b73a5ec56ba7115b30a2ba0fba70b45ea27bd12 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Wed, 24 Jul 2019 22:27:16 -0700 Subject: [PATCH 01/16] Update keymap/keyboardconfig docs --- docs/config_and_keymap.md | 103 ++++++++++++++++++++++ docs/keymap.md | 177 -------------------------------------- 2 files changed, 103 insertions(+), 177 deletions(-) create mode 100644 docs/config_and_keymap.md delete mode 100644 docs/keymap.md diff --git a/docs/config_and_keymap.md b/docs/config_and_keymap.md new file mode 100644 index 0000000..f0eab0d --- /dev/null +++ b/docs/config_and_keymap.md @@ -0,0 +1,103 @@ +# Configuring KMK + +KMK is configured through a rather large plain-old-Python class called +`KeyboardConfig`. Subclasses of this configuration exist which pre-fill defaults +for various known keyboards (for example, many Keebio keyboards are supported +through our ItsyBitsy to ProMicro pinout adapter). This class is the main +interface between end users and the inner workings of KMK. Let's dive in! + +- Edit or create a file called `main.py` on your `CIRCUITPY` drive. You can also + keep this file on your computer (perhaps under `user_keymaps` - please feel + free to submit a pull request with your layout definitions!) and copy it over + (either manually or, if you're adept with developer tooling and/or a command + line, [our + Makefile](https://github.com/KMKfw/kmk_firmware/blob/master/docs/flashing.md)). + It's definitely recommended to keep a backup of your configuration somewhere + that isn't the microcontroller itself - MCUs die, CircuitPython may run into + corruption bugs, or you might just have bad luck and delete the wrong file + some day. + +- Import the `KeyboardConfig` object for your keyboard from `kmk.boards` (or, if + handwiring your keyboard, import `KeyboardConfig` from the appropriate MCU for your + board from `kmk.mcus`. See `hardware.md` for the list of supported boards and + map this to the correct Python module under either of those paths. + +- Assign a `KeyboardConfig` instance to a variable (ex. `keyboard = KeyboardConfig()` - note + the parentheses) + +- Make sure this `KeyboardConfig` instance is actually run at the end of the file with + a block such as the following: + +```python +if __name__ == '__main__': + keyboard.go() +``` + +- Assign pins and your diode orientation (only necessary on handwire keyboards), + for example: + +```python +col_pins = (P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4) +row_pins = (P.D10, P.D11, P.D12, P.D13, P.D9, P.D6, P.D5, P.SCL) +rollover_cols_every_rows = 4 +diode_orientation = DiodeOrientation.COLUMNS +``` + +The pins should be based on whatever CircuitPython calls pins on your particular +board. You can find these in the REPL on your CircuitPython device: + +```python +import board +print(dir(board)) +``` + +> Note: `rollover_cols_every_rows` is only supported with +> `DiodeOrientation.COLUMNS`, not `DiodeOrientation.ROWS`. It is used for boards +> such as the Planck Rev6 which reuse column pins to simulate a 4x12 matrix in +> the form of an 8x6 matrix + +- Import the global list of key definitions with `from kmk.keys import KC`. You + can either print this out in the REPL as we did with `board` above, or simply + look at [our Key + documentation](https://github.com/KMKfw/kmk_firmware/blob/master/docs/keycodes.md). + We've tried to keep that listing reasonably up to date, but if it feels like + something is missing, you may need to read through `kmk/keys.py` (and then + open a ticket to tell us our docs are out of date, or open a PR and fix the + docs yourself!) + +- Define a keymap, which is, in Python terms, a List of Lists of `Key` objects. + A very simple keymap, for a keyboard with just two physical keys on a single + layer, may look like this: + +```python +keyboard.keymap = [[KC.A, KC.B]] +``` + +You can further define a bunch of other stuff: + +- `debug_enabled` which will spew a ton of debugging information to the serial + console. This is very rarely needed, but can provide very valuable information + if you need to open an issue. + +- `unicode_mode` from `kmk.consts.UnicodeMode`, which defines the default + operating system implementation to use for unicode sequences (see examples + below, or `unicode.md`. This can be changed after boot with a key (see + `keycodes.md`) + +- `tap_time` which defines how long `KC.TT` and `KC.LT` will wait before + considering a key "held" (see `keycodes.md`) + +- `leader_dictionary`, which defines leader sequences (see `leader.md`), defined + as tuples of keycode objects (or you can use + `kmk.keycodes.generate_leader_dictionary_seq` with a string) + +We also support unicode sequences (emojis, emoticons, umlauted letters, +whatever) if your operating system and system setup do! See `unicode.md` for +details. + +[Here's a giant example of all the +above](https://github.com/KMKfw/kmk_firmware/blob/master/user_keymaps/klardotsh/klarank_featherm4.py). +This is my personal 4x12 matrix layout running on a Planck Rev6 PCB, with a +Feather M4 Express wired up to the outer matrix pins (in somewhat of a "spider" +setup), utilizing most of the above features - it's one of the "kitchen sink +tester" definitions we use on the KMK Core team. diff --git a/docs/keymap.md b/docs/keymap.md deleted file mode 100644 index d8651ea..0000000 --- a/docs/keymap.md +++ /dev/null @@ -1,177 +0,0 @@ -# Keymap - -Keymaps in KMK are simple Python class objects with various attributes assigned -(some by default, however all are overridable). - -The basics of what you'll need to get started are: - -- Import the `KeyboardConfig` object for your keyboard from `kmk.boards` (or, if - handwiring your keyboard, import `KeyboardConfig` from the appropriate MCU for your - board from `kmk.mcus`. See `hardware.md` for the list of supported boards and - map this to the correct Python module under either of those paths. - -- Add a file to `user_keymaps/your_username` called whatever you'd like - -- Assign a `KeyboardConfig` instance to a variable (ex. `keyboard = KeyboardConfig()` - note - the parentheses) - -- Make sure this `KeyboardConfig` instance is actually run at the end of the file with - a block such as the following: - -```python -if __name__ == '__main__': - keyboard.go() -``` - -- Assign pins and your diode orientation (only necessary on handwire keyboards), - for example: - -```python -col_pins = (P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4) -row_pins = (P.D10, P.D11, P.D12, P.D13, P.D9, P.D6, P.D5, P.SCL) -rollover_cols_every_rows = 4 -diode_orientation = DiodeOrientation.COLUMNS - -swap_indicies = { - (3, 3): (3, 9), - (3, 4): (3, 10), - (3, 5): (3, 11), -} -``` - -The pins should be based on whatever CircuitPython calls pins on your particular -board. You can find these in the REPL on your CircuitPython device: - -```python -import board -print(dir(board)) -``` - -> Note: `rollover_cols_every_rows` is only supported with -> `DiodeOrientation.COLUMNS`, not `DiodeOrientation.ROWS`. It is used for boards -> such as the Planck Rev6 which reuse column pins to simulate a 4x12 matrix in -> the form of an 8x6 matrix - -> Note: `swap_indicies` is used to literally flip two keys' positions in the -> matrix. This is pretty rarely needed, but for example the Planck Rev6 in full -> 1u Grid mode swaps the bottom three right keys on each "half", thus the -> example above - -You can further define a bunch of other stuff: - -- `debug_enabled` which will spew a ton of debugging information to the serial - console. This is very rarely needed, but can provide very valuable information - if you need to open an issue. - -- `unicode_mode` from `kmk.consts.UnicodeMode`, which defines the default - operating system implementation to use for unicode sequences (see examples - below, or `unicode.md`. This can be changed after boot with a key (see - `keycodes.md`) - -- `tap_time` which defines how long `KC.TT` and `KC.LT` will wait before - considering a key "held" (see `keycodes.md`) - -- `leader_dictionary`, which defines leader sequences (see `leader.md`), defined - as tuples of keycode objects (or you can use - `kmk.keycodes.generate_leader_dictionary_seq` with a string) - -We also support unicode sequences (emojis, emoticons, umlauted letters, -whatever) if your operating system and system setup do! See `unicode.md` for -details. - -Here's a giant example of all the above. This is my personal 4x12 matrix layout -running on a Planck Rev6 PCB, with a Feather M4 Express wired up to the outer -matrix pins (in somewhat of a "spider" setup), utilizing most of the above -features: - -```python -from kmk.boards.klarank import KeyboardConfig -from kmk.consts import UnicodeMode -from kmk.keycodes import KC -from kmk.keycodes import generate_leader_dictionary_seq as glds -from kmk.macros.simple import send_string -from kmk.macros.unicode import compile_unicode_string_sequences as cuss - -keyboard = KeyboardConfig() - -keyboard.debug_enabled = True -keyboard.unicode_mode = UnicodeMode.LINUX - -_______ = KC.TRNS -xxxxxxx = KC.NO - -emoticons = cuss({ - # Emojis - 'BEER': r'🍺', - 'BEER_TOAST': r'🍻', - 'FACE_CUTE_SMILE': r'😊', - 'FACE_HEART_EYES': r'😍', - 'FACE_JOY': r'πŸ˜‚', - 'FACE_SWEAT_SMILE': r'πŸ˜…', - 'FACE_THINKING': r'πŸ€”', - 'FIRE': r'πŸ”₯', - 'FLAG_CA': r'πŸ‡¨πŸ‡¦', - 'FLAG_US': r'πŸ‡ΊπŸ‡Έ', - 'HAND_CLAP': r'πŸ‘', - 'HAND_HORNS': r'🀘', - 'HAND_OK': r'πŸ‘Œ', - 'HAND_THUMB_DOWN': r'πŸ‘Ž', - 'HAND_THUMB_UP': r'πŸ‘', - 'HAND_WAVE': r'πŸ‘‹', - 'HEART': r'❀️', - 'MAPLE_LEAF': r'🍁', - 'POOP': r'πŸ’©', - 'TADA': r'πŸŽ‰', - - # Emoticons, but fancier - 'ANGRY_TABLE_FLIP': r'(γƒŽΰ² η—Šΰ² )γƒŽε½‘β”»β”β”»', - 'CELEBRATORY_GLITTER': r'+q:.οΎŸγƒ½(Β΄βˆ€ο½‘)οΎ‰οΎŸ.:q+゚゚+q:.οΎŸγƒ½(*Β΄βˆ€)οΎ‰οΎŸ.:q+゚', - 'SHRUGGIE': r'Β―\_(ツ)_/Β―', - 'TABLE_FLIP': r'(β•―Β°β–‘Β°οΌ‰β•―οΈ΅ ┻━┻', -}) - -WPM = send_string("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Bibendum arcu vitae elementum curabitur vitae nunc sed. Facilisis sed odio morbi quis.") - -keyboard.leader_dictionary = { - glds('hello'): send_string('hello world from kmk macros'), - glds('wpm'): WPM, - glds('atf'): emoticons.ANGRY_TABLE_FLIP, - glds('tf'): emoticons.TABLE_FLIP, - glds('fca'): emoticons.FLAG_CA, - glds('fus'): emoticons.FLAG_US, - glds('cel'): emoticons.CELEBRATORY_GLITTER, -} - -keyboard.keymap = [ - [ - [KC.GESC, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC], - [KC.TAB, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENT], - [KC.LGUI, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.LALT], - [KC.LCTL, KC.LEAD, KC.LSHIFT(KC.LGUI), KC.MO(2), KC.MO(3), KC.LSFT, KC.SPC, KC.MO(1), KC.LEFT, KC.DOWN, KC.UP, KC.RGHT], - ], - - [ - [KC.GESC, xxxxxxx, xxxxxxx, KC.F10, KC.F11, KC.F12, xxxxxxx, KC.PSLS, KC.N7, KC.N8, KC.N9, KC.BSPC], - [KC.TAB, xxxxxxx, xxxxxxx, KC.F7, KC.F8, KC.F9, xxxxxxx, KC.PAST, KC.N4, KC.N5, KC.N6, _______], - [KC.LGUI, xxxxxxx, xxxxxxx, KC.F4, KC.F5, KC.F6, xxxxxxx, KC.PMNS, KC.N1, KC.N2, KC.N3, _______], - [KC.LCTL, xxxxxxx, _______, KC.F1, KC.F2, KC.F3, KC.SPC, _______, KC.N0, KC.DOT, xxxxxxx, KC.EQL], - ], - - [ - [KC.GESC, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.BSLS, KC.LBRC, KC.RBRC, KC.DEL], - [KC.TAB, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.MINS], - [KC.LGUI, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.LBRC, xxxxxxx, xxxxxxx, KC.INS], - [KC.LCTL, xxxxxxx, _______, _______, xxxxxxx, _______, xxxxxxx, xxxxxxx, KC.HOME, KC.PGDN, KC.PGUP, KC.END], - ], - - [ - [KC.GRV, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.SLSH], - [KC.TAB, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, KC.MINS], - [KC.LGUI, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx], - [KC.LCTL, xxxxxxx, xxxxxxx, xxxxxxx, _______, _______, xxxxxxx, xxxxxxx, KC.MUTE, KC.VOLD, KC.VOLU, xxxxxxx], - ], -] - -if __name__ == '__main__': - keyboard.go() -``` From 4bdf926360321fc46d227bf0f7ea25974a7022b1 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Wed, 24 Jul 2019 23:28:13 -0700 Subject: [PATCH 02/16] boot.py is still required - ensure it ends up in our dists and is documented --- Makefile | 7 ++++--- README.md | 4 +++- docs/flashing.md | 7 +++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 5ce5448..494e84c 100644 --- a/Makefile +++ b/Makefile @@ -50,20 +50,21 @@ dist-deploy: devdeps dist @[[ -n "$${CIRCLE_TAG}" ]] && $(PIPENV) run s3cmd -c .s3cfg put -P dist/kmk-latest.zip s3://kmk-releases/$${CIRCLE_TAG}.zip >/dev/null || true @[[ -n "$${CIRCLE_TAG}" ]] && $(PIPENV) run s3cmd -c .s3cfg put -P dist/kmk-latest.unoptimized.zip s3://kmk-releases/$${CIRCLE_TAG}.unoptimized.zip >/dev/null || true -dist/kmk-latest.zip: compile +dist/kmk-latest.zip: compile boot.py @echo "===> Building optimized ZIP" @mkdir -p dist @cd $(MPY_TARGET_DIR) && zip -r ../dist/kmk-latest.zip kmk 2>&1 >/dev/null + @zip -r dist/kmk-latest.zip boot.py 2>&1 >/dev/null dist/$(DIST_DESCRIBE).zip: dist/kmk-latest.zip @echo "===> Aliasing optimized ZIP" @cp dist/kmk-latest.zip dist/kmk-$(DIST_DESCRIBE).zip -dist/kmk-latest.unoptimized.zip: $(PY_KMK_TREE) +dist/kmk-latest.unoptimized.zip: $(PY_KMK_TREE) boot.py @echo "===> Building unoptimized ZIP" @mkdir -p dist @echo "KMK_RELEASE = '$(DIST_DESCRIBE)'" > kmk/release_info.py - @zip -r dist/kmk-latest.unoptimized.zip kmk 2>&1 >/dev/null + @zip -r dist/kmk-latest.unoptimized.zip kmk boot.py 2>&1 >/dev/null @rm -rf kmk/release_info.py dist/$(DIST_DESCRIBE).unoptimized.zip: dist/kmk-latest.unoptimized.zip diff --git a/README.md b/README.md index 0fcc6a0..715840a 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,9 @@ Coming (hopefully) soon: Bluetooth support! Stay tuned. extract the zip to the USB drive exposed by CircuitPython, typically labeled `CIRCUITPY`. Again, [we'll defer to Adafruit's documentation](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) - on adding libraries to a CircuitPython installation. + on adding libraries to a CircuitPython installation. You should end up with a + folder called `kmk` and a file called `boot.py`, both living at the top of + this USB drive. - Define your keyboard in a file called `main.py` on this `CIRCUITPY` drive and get tinkering! Examples of both handwired and ProMicro-\>ItsyBitsy converted diff --git a/docs/flashing.md b/docs/flashing.md index 9069e66..9ddb6ec 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -8,8 +8,11 @@ Linux). Given `make` and `rsync` are available on your system (in `$PATH`), the following will copy the `kmk` tree to your CircuitPython device, and will copy -the file defined as `USER_KEYMAP` as your `main.py`. If any of these files exist -on your CircuitPython device already, they will be overwritten without a prompt. +the file defined as `USER_KEYMAP` as your `main.py`. It will also copy our +`boot.py`, which allocates a larger stack size (simply - more of the device's +RAM will be available to KMK and your keyboard config) than CircuitPython's +default. If any of these files exist on your CircuitPython device already, they +will be overwritten without a prompt. If you get permissions errors here, **don't run make as root or with sudo**. See `Troubleshooting` below. From ef1c69aa2cebaf850ddfdcdc891e6498e2665899 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Wed, 24 Jul 2019 23:43:00 -0700 Subject: [PATCH 03/16] Fix linting; move kmk.util.intify_coordinate to kmk.matrix.intify_coordinate (trying to deprecate/remove util) --- Makefile | 1 - Pipfile | 1 + Pipfile.lock | 9 ++++++++- kmk/boards/converter/keebio/iris_r2.py | 2 +- kmk/boards/klarank.py | 2 +- kmk/internal_state.py | 2 +- kmk/keyboard_config.py | 3 ++- kmk/matrix.py | 4 ++++ kmk/util.py | 4 ---- setup.cfg | 14 +++++++++++--- user_keymaps/kdb424/gherkin.py | 3 +-- user_keymaps/kdb424/klanck.py | 3 +-- 12 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 494e84c..50da5db 100644 --- a/Makefile +++ b/Makefile @@ -90,7 +90,6 @@ docker-base-deploy: docker-base devdeps: .devdeps lint: devdeps - @$(PIPENV) run black --check @$(PIPENV) run flake8 fix-formatting: devdeps diff --git a/Pipfile b/Pipfile index a8579ee..6dddf33 100644 --- a/Pipfile +++ b/Pipfile @@ -20,6 +20,7 @@ neovim = "*" s3cmd = "*" black = "==19.3b0" flake8-quotes = "*" +flake8-black = "*" [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index ddcad6c..c63b1df 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "019b67ce05e7e68766ba54ddbfd3e2faf5dd81c7ded79f80ff3ef85b0017c99d" + "sha256": "e2a8058d3c40039167ababbfee7347b3b61cb679c65b7f98c2b56ba91fafa0dd" }, "pipfile-spec": 6, "requires": { @@ -76,6 +76,13 @@ "index": "pypi", "version": "==3.6.0" }, + "flake8-black": { + "hashes": [ + "sha256:6b5fe2a609fa750170da8d5b1ed7c11029bceaff025660be7f19307ec6fa0c35" + ], + "index": "pypi", + "version": "==0.1.0" + }, "flake8-commas": { "hashes": [ "sha256:d3005899466f51380387df7151fb59afec666a0f4f4a2c6a8995b975de0f44b7", diff --git a/kmk/boards/converter/keebio/iris_r2.py b/kmk/boards/converter/keebio/iris_r2.py index 1646588..582963f 100644 --- a/kmk/boards/converter/keebio/iris_r2.py +++ b/kmk/boards/converter/keebio/iris_r2.py @@ -1,9 +1,9 @@ import board from kmk.consts import DiodeOrientation +from kmk.matrix import intify_coordinate as ic from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig from kmk.pins import Pin as P -from kmk.util import intify_coordinate as ic class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/klarank.py b/kmk/boards/klarank.py index db3f397..9f73690 100644 --- a/kmk/boards/klarank.py +++ b/kmk/boards/klarank.py @@ -1,7 +1,7 @@ from kmk.consts import DiodeOrientation +from kmk.matrix import intify_coordinate as ic from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig from kmk.pins import Pin as P -from kmk.util import intify_coordinate as ic # Implements what used to be handled by KeyboardConfig.swap_indicies for this # board, by flipping various row3 (bottom physical row) keys so their diff --git a/kmk/internal_state.py b/kmk/internal_state.py index c149589..3707ca0 100644 --- a/kmk/internal_state.py +++ b/kmk/internal_state.py @@ -1,8 +1,8 @@ from kmk.consts import LeaderMode from kmk.keys import KC from kmk.kmktime import ticks_ms +from kmk.matrix import intify_coordinate from kmk.types import TapDanceKeyMeta -from kmk.util import intify_coordinate class InternalState: diff --git a/kmk/keyboard_config.py b/kmk/keyboard_config.py index 5b64f15..4a78827 100644 --- a/kmk/keyboard_config.py +++ b/kmk/keyboard_config.py @@ -49,7 +49,8 @@ import kmk.internal_state # isort:skip # Thanks for sticking around. Now let's do real work, starting below from kmk.kmktime import sleep_ms -from kmk.util import intify_coordinate as ic +from kmk.matrix import intify_coordinate as ic + from kmk import led, rgb # isort:skip diff --git a/kmk/matrix.py b/kmk/matrix.py index 81806ec..480ffec 100644 --- a/kmk/matrix.py +++ b/kmk/matrix.py @@ -3,6 +3,10 @@ import digitalio from kmk.consts import DiodeOrientation +def intify_coordinate(row, col): + return row << 8 | col + + class MatrixScanner: def __init__( self, diff --git a/kmk/util.py b/kmk/util.py index 9d450a9..124ecb5 100644 --- a/kmk/util.py +++ b/kmk/util.py @@ -1,7 +1,3 @@ -def intify_coordinate(row, col): - return row << 8 | col - - def get_wide_ordinal(char): if len(char) != 2: return ord(char) diff --git a/setup.cfg b/setup.cfg index d4d6f77..c7656a0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,14 +4,22 @@ exclude = .git,__pycache__,vendor,.venv,build max_line_length = 88 # enforce single quotes -select = Q0 docstring-quotes = ''' multiline-quotes = ''' -ignore = X100, E262 +extend-ignore = + X100, E262, + # See https://github.com/PyCQA/pycodestyle/issues/373 + E203, + # comply with black + # it will handle line lengths automatically + E501, + # it also controls trailing commas in general + C812, C813, C815, + per-file-ignores = # Allow crazy line lengths, unused variables, and multiple spaces after commas in lists (for grid alignment) - user_keymaps/**/*.py: F401,E501,E241,E131 + user_keymaps/**/*.py: F401,E501,E241,E131,BLK100 tests/test_data/keymaps/**/*.py: F401,E501 # Forgive me for my RAM hack sins kmk/keyboard_config.py: I001,I003,I004,F401 diff --git a/user_keymaps/kdb424/gherkin.py b/user_keymaps/kdb424/gherkin.py index 1d55b55..bcb3c08 100644 --- a/user_keymaps/kdb424/gherkin.py +++ b/user_keymaps/kdb424/gherkin.py @@ -1,6 +1,5 @@ from kmk.consts import DiodeOrientation, UnicodeMode -from kmk.handlers.sequences import (compile_unicode_string_sequences, - send_string) +from kmk.handlers.sequences import compile_unicode_string_sequences, send_string from kmk.keys import KC from kmk.mcus.circuitpython_usbhid import KeyboardConfig from kmk.pins import Pin as P diff --git a/user_keymaps/kdb424/klanck.py b/user_keymaps/kdb424/klanck.py index 9bf8b7f..a650206 100644 --- a/user_keymaps/kdb424/klanck.py +++ b/user_keymaps/kdb424/klanck.py @@ -1,6 +1,5 @@ from kmk.consts import DiodeOrientation, UnicodeMode -from kmk.handlers.sequences import (compile_unicode_string_sequences, - send_string) +from kmk.handlers.sequences import compile_unicode_string_sequences, send_string from kmk.keys import KC from kmk.mcus.circuitpython_usbhid import KeyboardConfig from kmk.pins import Pin as P From 1eaf0e2c79eea01a410224f84368db532e5b40bf Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Wed, 24 Jul 2019 23:43:39 -0700 Subject: [PATCH 04/16] flatten_dict is no longer used, remove it --- kmk/util.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/kmk/util.py b/kmk/util.py index 124ecb5..5a7c768 100644 --- a/kmk/util.py +++ b/kmk/util.py @@ -5,18 +5,6 @@ def get_wide_ordinal(char): return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00) -def flatten_dict(d): - items = {} - - for k, v in d.items(): - if isinstance(v, dict): - items.update(flatten_dict(v)) - else: - items[k] = v - - return items - - def reset_keyboard(): try: import machine From 02401e2ec0d5438b52a304a27d8af8a59a186082 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Wed, 24 Jul 2019 23:44:26 -0700 Subject: [PATCH 05/16] Move kmk.util.get_wide_ordinal to kmk.handlers.sequences --- kmk/handlers/sequences.py | 8 +++++++- kmk/util.py | 7 ------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/kmk/handlers/sequences.py b/kmk/handlers/sequences.py index 9b5d907..6583ea3 100644 --- a/kmk/handlers/sequences.py +++ b/kmk/handlers/sequences.py @@ -2,7 +2,13 @@ from kmk.consts import UnicodeMode from kmk.handlers.stock import passthrough from kmk.keys import KC, make_key from kmk.types import AttrDict, KeySequenceMeta -from kmk.util import get_wide_ordinal + + +def get_wide_ordinal(char): + if len(char) != 2: + return ord(char) + + return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00) def sequence_press_handler(key, state, KC, *args, **kwargs): diff --git a/kmk/util.py b/kmk/util.py index 5a7c768..099465f 100644 --- a/kmk/util.py +++ b/kmk/util.py @@ -1,10 +1,3 @@ -def get_wide_ordinal(char): - if len(char) != 2: - return ord(char) - - return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00) - - def reset_keyboard(): try: import machine From 38e81025323c3587ec3ee4e94de58641adaf7ac6 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Wed, 24 Jul 2019 23:45:37 -0700 Subject: [PATCH 06/16] Remove kmk.util by moving reboot/bootloader to their only use location --- kmk/handlers/stock.py | 22 +++++++++++++++++++--- kmk/keyboard_config.py | 1 - kmk/util.py | 23 ----------------------- 3 files changed, 19 insertions(+), 27 deletions(-) delete mode 100644 kmk/util.py diff --git a/kmk/handlers/stock.py b/kmk/handlers/stock.py index 88fadf2..bf0f353 100644 --- a/kmk/handlers/stock.py +++ b/kmk/handlers/stock.py @@ -1,5 +1,4 @@ from kmk.kmktime import sleep_ms -from kmk.util import reset_bootloader, reset_keyboard def passthrough(key, state, *args, **kwargs): @@ -29,11 +28,28 @@ def default_released(key, state, KC, coord_int=None, coord_raw=None): def reset(*args, **kwargs): - reset_keyboard() + try: + import machine + + machine.reset() + + except ImportError: + import microcontroller + + microcontroller.reset() def bootloader(*args, **kwargs): - reset_bootloader() + try: + import machine + + machine.bootloader() + + except ImportError: + import microcontroller + + microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER) + microcontroller.reset() def debug_pressed(key, state, KC, *args, **kwargs): diff --git a/kmk/keyboard_config.py b/kmk/keyboard_config.py index 4a78827..2a3e819 100644 --- a/kmk/keyboard_config.py +++ b/kmk/keyboard_config.py @@ -25,7 +25,6 @@ import supervisor # isort:skip import kmk.consts # isort:skip import kmk.kmktime # isort:skip import kmk.types # isort:skip -import kmk.util # isort:skip from kmk.consts import LeaderMode, UnicodeMode, KMK_RELEASE # isort:skip from kmk.hid import USB_HID # isort:skip diff --git a/kmk/util.py b/kmk/util.py deleted file mode 100644 index 099465f..0000000 --- a/kmk/util.py +++ /dev/null @@ -1,23 +0,0 @@ -def reset_keyboard(): - try: - import machine - - machine.reset() - - except ImportError: - import microcontroller - - microcontroller.reset() - - -def reset_bootloader(): - try: - import machine - - machine.bootloader() - - except ImportError: - import microcontroller - - microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER) - microcontroller.reset() From 11a4604f88387d7aadec3d0d3e8f0cdc4fe72633 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:03:35 -0700 Subject: [PATCH 07/16] Move our preload hacks out of keyboard_config into their own module. Isolate the ugliness --- kmk/keyboard_config.py | 61 +++++++++--------------------------------- kmk/preload_imports.py | 45 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 49 deletions(-) create mode 100644 kmk/preload_imports.py diff --git a/kmk/keyboard_config.py b/kmk/keyboard_config.py index 2a3e819..cda1c1e 100644 --- a/kmk/keyboard_config.py +++ b/kmk/keyboard_config.py @@ -1,57 +1,20 @@ -# Welcome to RAM and stack size hacks central, I'm your host, klardotsh! -# We really get stuck between a rock and a hard place on CircuitPython -# sometimes: our import structure is deeply nested enough that stuff -# breaks in some truly bizarre ways, including: -# - explicit RuntimeError exceptions, complaining that our -# stack depth is too deep -# -# - silent hard locks of the device (basically unrecoverable without -# UF2 flash if done in main.py, fixable with a reboot if done -# in REPL) -# -# However, there's a hackaround that works for us! Because sys.modules -# caches everything it sees (and future imports will use that cached -# copy of the module), let's take this opportunity _way_ up the import -# chain to import _every single thing_ KMK eventually uses in a normal -# workflow, in order from fewest to least nested dependencies. +# There's a chance doing preload RAM hacks this late will cause recursion +# errors, but we'll see. I'd rather do it here than require everyone copy-paste +# a line into their keymaps. +import kmk.preload_imports # isort:skip # NOQA -# First, system-provided deps -import busio # isort:skip -import collections # isort:skip -import gc # isort:skip -import supervisor # isort:skip - -# Now "light" KMK stuff with few/no external deps -import kmk.consts # isort:skip -import kmk.kmktime # isort:skip -import kmk.types # isort:skip - -from kmk.consts import LeaderMode, UnicodeMode, KMK_RELEASE # isort:skip -from kmk.hid import USB_HID # isort:skip -from kmk.internal_state import InternalState # isort:skip -from kmk.keys import KC # isort:skip -from kmk.matrix import MatrixScanner # isort:skip - -# Now handlers that will be used in keys later -import kmk.handlers.layers # isort:skip -import kmk.handlers.stock # isort:skip - -# Now stuff that depends on the above (and so on) -import kmk.keys # isort:skip -import kmk.matrix # isort:skip - -import kmk.hid # isort:skip -import kmk.internal_state # isort:skip - -# GC runs automatically after CircuitPython imports. - -# Thanks for sticking around. Now let's do real work, starting below +import busio +import gc +from kmk import led, rgb +from kmk.consts import KMK_RELEASE, LeaderMode, UnicodeMode +from kmk.hid import USB_HID +from kmk.internal_state import InternalState +from kmk.keys import KC from kmk.kmktime import sleep_ms +from kmk.matrix import MatrixScanner from kmk.matrix import intify_coordinate as ic -from kmk import led, rgb # isort:skip - class KeyboardConfig: debug_enabled = False diff --git a/kmk/preload_imports.py b/kmk/preload_imports.py new file mode 100644 index 0000000..4dbdcc8 --- /dev/null +++ b/kmk/preload_imports.py @@ -0,0 +1,45 @@ +# Welcome to RAM and stack size hacks central, I'm your host, klardotsh! +# Our import structure is deeply nested enough that stuff +# breaks in some truly bizarre ways, including: +# - explicit RuntimeError exceptions, complaining that our +# stack depth is too deep +# +# - silent hard locks of the device (basically unrecoverable without +# UF2 flash if done in main.py, fixable with a reboot if done +# in REPL) +# +# However, there's a hackaround that works for us! Because sys.modules +# caches everything it sees (and future imports will use that cached +# copy of the module), let's take this opportunity _way_ up the import +# chain to import _every single thing_ KMK eventually uses in a normal +# workflow, in nesting order +# +# GC runs automatically after CircuitPython imports. + +# First, system-provided deps +import busio +import collections +import gc +import supervisor + +# Now "light" KMK stuff with few/no external deps +import kmk.consts # isort:skip +import kmk.kmktime # isort:skip +import kmk.types # isort:skip + +from kmk.consts import LeaderMode, UnicodeMode, KMK_RELEASE # isort:skip +from kmk.hid import USB_HID # isort:skip +from kmk.internal_state import InternalState # isort:skip +from kmk.keys import KC # isort:skip +from kmk.matrix import MatrixScanner # isort:skip + +# Now handlers that will be used in keys later +import kmk.handlers.layers # isort:skip +import kmk.handlers.stock # isort:skip + +# Now stuff that depends on the above (and so on) +import kmk.keys # isort:skip +import kmk.matrix # isort:skip + +import kmk.hid # isort:skip +import kmk.internal_state # isort:skip From 45cadc7e5a367779f03e94b240b8cacb0168f0d4 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:04:06 -0700 Subject: [PATCH 08/16] CircuitPython-provided modules should be considered stdlib-equiv by isort terms. Apply this new rule. --- kmk/led.py | 3 +-- kmk/rgb.py | 1 - setup.cfg | 27 +++++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/kmk/led.py b/kmk/led.py index 9921ad1..a0c2e15 100644 --- a/kmk/led.py +++ b/kmk/led.py @@ -1,7 +1,6 @@ +import pulseio import time from math import e, exp, pi, sin - -import pulseio from micropython import const led_config = { diff --git a/kmk/rgb.py b/kmk/rgb.py index 7b01815..3d826e6 100644 --- a/kmk/rgb.py +++ b/kmk/rgb.py @@ -1,6 +1,5 @@ import time from math import e, exp, pi, sin - from micropython import const rgb_config = { diff --git a/setup.cfg b/setup.cfg index c7656a0..557f47a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,10 +22,33 @@ per-file-ignores = user_keymaps/**/*.py: F401,E501,E241,E131,BLK100 tests/test_data/keymaps/**/*.py: F401,E501 # Forgive me for my RAM hack sins - kmk/keyboard_config.py: I001,I003,I004,F401 + kmk/preload_imports.py: I001,I003,I004,F401 [isort] -known_third_party = analogio,bitbangio,bleio,board,busio,digitalio,framebuf,gamepad,gc,microcontroller,micropython,pulseio,pyb,pydux,uio,ubluepy,machine,pyb,uos +known_standard_library = + analogio, + bitbangio, + bleio, + board, + busio, + digitalio, + framebuf, + gamepad, + gc, + machine, + microcontroller, + micropython, + neopixel, + pulseio, + pyb, + pyb, + pydux, + supervisor, + ubluepy, + uio, + uos, + +# black compat multi_line_output=3 include_trailing_comma=True force_grid_wrap=0 From 17ba405bccebc29b3f6572811a93e9a6d2253150 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:05:29 -0700 Subject: [PATCH 09/16] Don't try to lint dist/compiled files --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 557f47a..e8239ef 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [flake8] -exclude = .git,__pycache__,vendor,.venv,build +exclude = .git,__pycache__,vendor,.venv,build,dist,.compiled # match black expectations max_line_length = 88 From 86c8e006e02dce97154236b614b23fd73d8c7539 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:07:08 -0700 Subject: [PATCH 10/16] Remove ancient, no-way-this-is-working-right-now test leftovers --- Makefile | 2 +- tests/test_data/__init__.py | 0 tests/test_data/keymaps/__init__.py | 0 tests/test_data/keymaps/duplicate_row_pins.py | 21 ------------------- .../duplicated_pins_between_row_col.py | 21 ------------------- tests/test_data/keymaps/ghosted_layer_mo.py | 21 ------------------- tests/test_data/keymaps/known_good.py | 21 ------------------- 7 files changed, 1 insertion(+), 85 deletions(-) delete mode 100644 tests/test_data/__init__.py delete mode 100644 tests/test_data/keymaps/__init__.py delete mode 100644 tests/test_data/keymaps/duplicate_row_pins.py delete mode 100644 tests/test_data/keymaps/duplicated_pins_between_row_col.py delete mode 100644 tests/test_data/keymaps/ghosted_layer_mo.py delete mode 100644 tests/test_data/keymaps/known_good.py diff --git a/Makefile b/Makefile index 50da5db..e14ddd8 100644 --- a/Makefile +++ b/Makefile @@ -96,7 +96,7 @@ fix-formatting: devdeps @$(PIPENV) run black . fix-isort: devdeps - @find kmk/ tests/ user_keymaps/ -name "*.py" | xargs $(PIPENV) run isort + @find kmk/ user_keymaps/ -name "*.py" | xargs $(PIPENV) run isort clean: @echo "===> Cleaning build artifacts" diff --git a/tests/test_data/__init__.py b/tests/test_data/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_data/keymaps/__init__.py b/tests/test_data/keymaps/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_data/keymaps/duplicate_row_pins.py b/tests/test_data/keymaps/duplicate_row_pins.py deleted file mode 100644 index d82c928..0000000 --- a/tests/test_data/keymaps/duplicate_row_pins.py +++ /dev/null @@ -1,21 +0,0 @@ -import machine - -from kmk.consts import DiodeOrientation -from kmk.entrypoints.handwire.pyboard import main -from kmk.keycodes import KC - -p = machine.Pin.board -cols = (p.X10, p.X10, p.X12) -rows = (p.X1, p.X2, p.X3) - -diode_orientation = DiodeOrientation.COLUMNS - -keymap = [ - [ - [KC.MO(1), KC.H, KC.RESET], - [KC.MO(2), KC.I, KC.ENTER], - [KC.LCTRL, KC.SPACE, KC.LSHIFT], - ], - [[KC.TRNS, KC.B, KC.C], [KC.NO, KC.D, KC.E], [KC.F, KC.G, KC.H]], - [[KC.X, KC.Y, KC.Z], [KC.TRNS, KC.N, KC.O], [KC.R, KC.P, KC.Q]], -] diff --git a/tests/test_data/keymaps/duplicated_pins_between_row_col.py b/tests/test_data/keymaps/duplicated_pins_between_row_col.py deleted file mode 100644 index 799333e..0000000 --- a/tests/test_data/keymaps/duplicated_pins_between_row_col.py +++ /dev/null @@ -1,21 +0,0 @@ -import machine - -from kmk.consts import DiodeOrientation -from kmk.entrypoints.handwire.pyboard import main -from kmk.keycodes import KC - -p = machine.Pin.board -cols = (p.X10, p.X11, p.X12) -rows = (p.X1, p.X11, p.X3) - -diode_orientation = DiodeOrientation.COLUMNS - -keymap = [ - [ - [KC.MO(1), KC.H, KC.RESET], - [KC.MO(2), KC.I, KC.ENTER], - [KC.LCTRL, KC.SPACE, KC.LSHIFT], - ], - [[KC.TRNS, KC.B, KC.C], [KC.NO, KC.D, KC.E], [KC.F, KC.G, KC.H]], - [[KC.X, KC.Y, KC.Z], [KC.TRNS, KC.N, KC.O], [KC.R, KC.P, KC.Q]], -] diff --git a/tests/test_data/keymaps/ghosted_layer_mo.py b/tests/test_data/keymaps/ghosted_layer_mo.py deleted file mode 100644 index 1e11b18..0000000 --- a/tests/test_data/keymaps/ghosted_layer_mo.py +++ /dev/null @@ -1,21 +0,0 @@ -import machine - -from kmk.consts import DiodeOrientation -from kmk.entrypoints.handwire.pyboard import main -from kmk.keycodes import KC - -p = machine.Pin.board -cols = (p.X10, p.X11, p.X12) -rows = (p.X1, p.X2, p.X3) - -diode_orientation = DiodeOrientation.COLUMNS - -keymap = [ - [ - [KC.MO(1), KC.H, KC.RESET], - [KC.MO(2), KC.I, KC.ENTER], - [KC.LCTRL, KC.SPACE, KC.LSHIFT], - ], - [[KC.A, KC.B, KC.C], [KC.NO, KC.D, KC.E], [KC.F, KC.G, KC.H]], - [[KC.X, KC.Y, KC.Z], [KC.TRNS, KC.N, KC.O], [KC.R, KC.P, KC.Q]], -] diff --git a/tests/test_data/keymaps/known_good.py b/tests/test_data/keymaps/known_good.py deleted file mode 100644 index 0ed5001..0000000 --- a/tests/test_data/keymaps/known_good.py +++ /dev/null @@ -1,21 +0,0 @@ -import machine - -from kmk.consts import DiodeOrientation -from kmk.entrypoints.handwire.pyboard import main -from kmk.keycodes import KC - -p = machine.Pin.board -cols = (p.X10, p.X11, p.X12) -rows = (p.X1, p.X2, p.X3) - -diode_orientation = DiodeOrientation.COLUMNS - -keymap = [ - [ - [KC.MO(1), KC.H, KC.RESET], - [KC.MO(2), KC.I, KC.ENTER], - [KC.LCTRL, KC.SPACE, KC.LSHIFT], - ], - [[KC.TRNS, KC.B, KC.C], [KC.NO, KC.D, KC.E], [KC.F, KC.G, KC.H]], - [[KC.X, KC.Y, KC.Z], [KC.TRNS, KC.N, KC.O], [KC.R, KC.P, KC.Q]], -] From 8c57844a221cb3e155f7d767c54d0126a189ced4 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:32:20 -0700 Subject: [PATCH 11/16] Remove a ton of leftover MicroPython code and abstractions, including all of kmk.pins --- .../converter/fourtypercentclub/gherkin.py | 7 +- .../converter/fourtypercentclub/luddite.py | 23 ++++- kmk/boards/converter/keebio/bdn9.py | 13 ++- kmk/boards/converter/keebio/fourier.py | 5 +- kmk/boards/converter/keebio/iris_r1.py | 5 +- kmk/boards/converter/keebio/iris_r2.py | 5 +- kmk/boards/converter/keebio/lapace.py | 22 ++++- kmk/boards/converter/keebio/levinson_r1.py | 5 +- kmk/boards/converter/keebio/levinson_r2.py | 5 +- kmk/boards/converter/keebio/nyquist_r1.py | 5 +- kmk/boards/converter/keebio/nyquist_r2.py | 5 +- kmk/boards/converter/keebio/quefrency.py | 14 ++- kmk/boards/converter/keebio/rorschach.py | 5 +- kmk/boards/converter/keebio/tragicforce68.py | 26 ++++- kmk/boards/converter/keebio/viterbi_r1.py | 5 +- kmk/boards/converter/keebio/viterbi_r2.py | 5 +- .../converter/lets-split/lets-split_r1.py | 5 +- .../converter/lets-split/lets-split_r2.py | 5 +- kmk/boards/klarank.py | 16 ++- kmk/consts.py | 1 - kmk/hid.py | 60 +++++------ kmk/matrix.py | 30 +++--- kmk/pins.py | 99 ------------------- pyproject.toml | 1 + setup.cfg | 3 +- user_keymaps/kdb424/gherkin.py | 7 +- user_keymaps/kdb424/klanck.py | 7 +- 27 files changed, 179 insertions(+), 210 deletions(-) delete mode 100644 kmk/pins.py diff --git a/kmk/boards/converter/fourtypercentclub/gherkin.py b/kmk/boards/converter/fourtypercentclub/gherkin.py index 3795337..83b3ce7 100644 --- a/kmk/boards/converter/fourtypercentclub/gherkin.py +++ b/kmk/boards/converter/fourtypercentclub/gherkin.py @@ -1,9 +1,10 @@ +import board + from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.D9, P.D10, P.D11, P.D12, P.D13, P.SCL) - row_pins = (P.A3, P.A4, P.A5, P.SCK, P.MOSI) + col_pins = (board.D9, board.D10, board.D11, board.D12, board.D13, board.SCL) + row_pins = (board.A3, board.A4, board.A5, board.SCK, board.MOSI) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/fourtypercentclub/luddite.py b/kmk/boards/converter/fourtypercentclub/luddite.py index 5a41b71..ed9c826 100644 --- a/kmk/boards/converter/fourtypercentclub/luddite.py +++ b/kmk/boards/converter/fourtypercentclub/luddite.py @@ -2,12 +2,29 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A0, P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.TX, P.RX, P.SDA, P.SCL, P.D13, P.D12, P.D11, P.D10) + col_pins = ( + board.A0, + board.A1, + board.A2, + board.A3, + board.A4, + board.A5, + board.SCK, + board.MOSI, + ) + row_pins = ( + board.TX, + board.RX, + board.SDA, + board.SCL, + board.D13, + board.D12, + board.D11, + board.D10, + ) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.D9 rgb_num_pixels = 12 diff --git a/kmk/boards/converter/keebio/bdn9.py b/kmk/boards/converter/keebio/bdn9.py index 06d0984..674ea61 100644 --- a/kmk/boards/converter/keebio/bdn9.py +++ b/kmk/boards/converter/keebio/bdn9.py @@ -2,10 +2,19 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.RX, P.D13, P.A0, P.D11, P.A4, P.A5, P.D10, P.D9, P.SCK) + col_pins = ( + board.RX, + board.D13, + board.A0, + board.D11, + board.A4, + board.A5, + board.D10, + board.D9, + board.SCK, + ) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX diff --git a/kmk/boards/converter/keebio/fourier.py b/kmk/boards/converter/keebio/fourier.py index f59e042..56f25af 100644 --- a/kmk/boards/converter/keebio/fourier.py +++ b/kmk/boards/converter/keebio/fourier.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.A0, P.D11, P.D10, P.D9) + col_pins = (board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.A0, board.D11, board.D10, board.D9) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/iris_r1.py b/kmk/boards/converter/keebio/iris_r1.py index a8c7e11..dc9165c 100644 --- a/kmk/boards/converter/keebio/iris_r1.py +++ b/kmk/boards/converter/keebio/iris_r1.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.D11, P.D10, P.D9, P.D7, P.D13) + col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.D11, board.D10, board.D9, board.D7, board.D13) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/iris_r2.py b/kmk/boards/converter/keebio/iris_r2.py index 582963f..c7058b4 100644 --- a/kmk/boards/converter/keebio/iris_r2.py +++ b/kmk/boards/converter/keebio/iris_r2.py @@ -3,15 +3,14 @@ import board from kmk.consts import DiodeOrientation from kmk.matrix import intify_coordinate as ic from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): # Pin mappings for converter board found at hardware/README.md # QMK: MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 } # QMK: MATRIX_ROW_PINS { D7, E6, B4, D2, D4 } - col_pins = (P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.D11, P.D10, P.D9, P.RX, P.D13) + col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.D11, board.D10, board.D9, board.RX, board.D13) diode_orientation = DiodeOrientation.COLUMNS split_flip = True diff --git a/kmk/boards/converter/keebio/lapace.py b/kmk/boards/converter/keebio/lapace.py index efbb365..a59b949 100644 --- a/kmk/boards/converter/keebio/lapace.py +++ b/kmk/boards/converter/keebio/lapace.py @@ -2,11 +2,27 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.SDA, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.TX, P.A0, P.RX, P.A1, P.D11, P.D9, P.D12, P.D10) + col_pins = ( + board.SDA, + board.A2, + board.A3, + board.A4, + board.A5, + board.SCK, + board.MOSI, + ) + row_pins = ( + board.TX, + board.A0, + board.RX, + board.A1, + board.D11, + board.D9, + board.D12, + board.D10, + ) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.D13 diff --git a/kmk/boards/converter/keebio/levinson_r1.py b/kmk/boards/converter/keebio/levinson_r1.py index 3bffe8d..10dcce3 100644 --- a/kmk/boards/converter/keebio/levinson_r1.py +++ b/kmk/boards/converter/keebio/levinson_r1.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A2, P.A3, P.A4, P.A5, P.SCK, P.A0) - row_pins = (P.D11, P.D10, P.D9, P.D7) + col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.A0) + row_pins = (board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/levinson_r2.py b/kmk/boards/converter/keebio/levinson_r2.py index cc85f37..c835d9e 100644 --- a/kmk/boards/converter/keebio/levinson_r2.py +++ b/kmk/boards/converter/keebio/levinson_r2.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.D13, P.D11, P.D10, P.D9) + col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.D13, board.D11, board.D10, board.D9) diode_orientation = DiodeOrientation.COLUMNS split_type = 'UART' diff --git a/kmk/boards/converter/keebio/nyquist_r1.py b/kmk/boards/converter/keebio/nyquist_r1.py index 3a79ada..1f70323 100644 --- a/kmk/boards/converter/keebio/nyquist_r1.py +++ b/kmk/boards/converter/keebio/nyquist_r1.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.D13, P.D11, P.D10, P.D9, P.D7) + col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/nyquist_r2.py b/kmk/boards/converter/keebio/nyquist_r2.py index ea57f25..b0a5d90 100644 --- a/kmk/boards/converter/keebio/nyquist_r2.py +++ b/kmk/boards/converter/keebio/nyquist_r2.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.RX, P.A1, P.A2, P.A3, P.A4, P.A5) - row_pins = (P.D13, P.D11, P.D10, P.D9, P.D7) + col_pins = (board.RX, board.A1, board.A2, board.A3, board.A4, board.A5) + row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS split_type = 'UART' diff --git a/kmk/boards/converter/keebio/quefrency.py b/kmk/boards/converter/keebio/quefrency.py index 5b1a76f..1334901 100644 --- a/kmk/boards/converter/keebio/quefrency.py +++ b/kmk/boards/converter/keebio/quefrency.py @@ -2,13 +2,21 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): # Will need additional work and testing - col_pins = (P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI, P.D12) - row_pins = (P.A0, P.D13, P.D11, P.D10, P.D9, P.D7) + col_pins = ( + board.A1, + board.A2, + board.A3, + board.A4, + board.A5, + board.SCK, + board.MOSI, + board.D12, + ) + row_pins = (board.A0, board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/rorschach.py b/kmk/boards/converter/keebio/rorschach.py index bdf3c17..bec13cd 100644 --- a/kmk/boards/converter/keebio/rorschach.py +++ b/kmk/boards/converter/keebio/rorschach.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.D11, P.D10, P.D9, P.RX, P.D13) + col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.D11, board.D10, board.D9, board.RX, board.D13) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/tragicforce68.py b/kmk/boards/converter/keebio/tragicforce68.py index 812d666..f6158e7 100644 --- a/kmk/boards/converter/keebio/tragicforce68.py +++ b/kmk/boards/converter/keebio/tragicforce68.py @@ -1,9 +1,29 @@ +import board + from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A0, P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.TX, P.RX, P.SDA, P.SCL, P.D9, P.D10, P.D12, P.D11, P.D13) + col_pins = ( + board.A0, + board.A1, + board.A2, + board.A3, + board.A4, + board.A5, + board.SCK, + board.MOSI, + ) + row_pins = ( + board.TX, + board.RX, + board.SDA, + board.SCL, + board.D9, + board.D10, + board.D12, + board.D11, + board.D13, + ) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/viterbi_r1.py b/kmk/boards/converter/keebio/viterbi_r1.py index fef2459..b6c0b49 100644 --- a/kmk/boards/converter/keebio/viterbi_r1.py +++ b/kmk/boards/converter/keebio/viterbi_r1.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI) - row_pins = (P.D13, P.D11, P.D10, P.D9, P.D7) + col_pins = (board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) + row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/keebio/viterbi_r2.py b/kmk/boards/converter/keebio/viterbi_r2.py index c9d156b..fb0a3c6 100644 --- a/kmk/boards/converter/keebio/viterbi_r2.py +++ b/kmk/boards/converter/keebio/viterbi_r2.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A0, P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK) - row_pins = (P.D13, P.D11, P.D10, P.D9, P.D7) + col_pins = (board.A0, board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK) + row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/lets-split/lets-split_r1.py b/kmk/boards/converter/lets-split/lets-split_r1.py index 89d6290..0c2084d 100644 --- a/kmk/boards/converter/lets-split/lets-split_r1.py +++ b/kmk/boards/converter/lets-split/lets-split_r1.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.A5, P.A4, P.A3, P.A2, P.A1, P.A0) - row_pins = (P.D7, P.D9, P.D10, P.D11) + col_pins = (board.A5, board.A4, board.A3, board.A2, board.A1, board.A0) + row_pins = (board.D7, board.D9, board.D10, board.D11) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/converter/lets-split/lets-split_r2.py b/kmk/boards/converter/lets-split/lets-split_r2.py index 7e9ea8a..2d96c94 100644 --- a/kmk/boards/converter/lets-split/lets-split_r2.py +++ b/kmk/boards/converter/lets-split/lets-split_r2.py @@ -2,12 +2,11 @@ import board from kmk.consts import DiodeOrientation from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P class KeyboardConfig(_KeyboardConfig): - col_pins = (P.MOSI, P.SCK, P.A5, P.A4, P.A3, P.A2) - row_pins = (P.D11, P.D10, P.D9, P.D7) + col_pins = (board.MOSI, board.SCK, board.A5, board.A4, board.A3, board.A2) + row_pins = (board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS rgb_pixel_pin = board.TX uart_pin = board.SCL diff --git a/kmk/boards/klarank.py b/kmk/boards/klarank.py index 9f73690..00fa2b2 100644 --- a/kmk/boards/klarank.py +++ b/kmk/boards/klarank.py @@ -1,7 +1,8 @@ +import board + from kmk.consts import DiodeOrientation from kmk.matrix import intify_coordinate as ic from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig -from kmk.pins import Pin as P # Implements what used to be handled by KeyboardConfig.swap_indicies for this # board, by flipping various row3 (bottom physical row) keys so their @@ -20,8 +21,17 @@ def r3_swap(col): class KeyboardConfig(_KeyboardConfig): # physical, visible cols (SCK, MO, MI, RX, TX, D4) # physical, visible rows (10, 11, 12, 13) (9, 6, 5, SCL) - col_pins = (P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4) - row_pins = (P.D10, P.D11, P.D12, P.D13, P.D9, P.D6, P.D5, P.SCL) + 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, + ) rollover_cols_every_rows = 4 diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/consts.py b/kmk/consts.py index e7b59c8..be4d915 100644 --- a/kmk/consts.py +++ b/kmk/consts.py @@ -4,7 +4,6 @@ except Exception: KMK_RELEASE = 'copied-from-git' CIRCUITPYTHON = 'CircuitPython' -MICROPYTHON = 'MicroPython' class HIDReportTypes: diff --git a/kmk/hid.py b/kmk/hid.py index e2eb2b7..5b8a7a5 100644 --- a/kmk/hid.py +++ b/kmk/hid.py @@ -1,3 +1,5 @@ +import usb_hid + from kmk.consts import HID_REPORT_SIZES, HIDReportTypes, HIDUsage, HIDUsagePage from kmk.keys import FIRST_KMK_INTERNAL_KEY, ConsumerKey, ModifierKey @@ -152,44 +154,36 @@ class USB_HID: return self -try: - import usb_hid +class CircuitPythonUSB_HID(USB_HID): + REPORT_BYTES = 9 - PLATFORM_CIRCUITPYTHON = True -except ImportError: - PLATFORM_CIRCUITPYTHON = False -else: + def post_init(self): + self.devices = {} - class CircuitPythonUSB_HID(USB_HID): - REPORT_BYTES = 9 + for device in usb_hid.devices: + us = device.usage + up = device.usage_page - def post_init(self): - self.devices = {} + if up == HIDUsagePage.CONSUMER and us == HIDUsage.CONSUMER: + self.devices[HIDReportTypes.CONSUMER] = device + continue - for device in usb_hid.devices: - us = device.usage - up = device.usage_page + if up == HIDUsagePage.KEYBOARD and us == HIDUsage.KEYBOARD: + self.devices[HIDReportTypes.KEYBOARD] = device + continue - if up == HIDUsagePage.CONSUMER and us == HIDUsage.CONSUMER: - self.devices[HIDReportTypes.CONSUMER] = device - continue + if up == HIDUsagePage.MOUSE and us == HIDUsage.MOUSE: + self.devices[HIDReportTypes.MOUSE] = device + continue - if up == HIDUsagePage.KEYBOARD and us == HIDUsage.KEYBOARD: - self.devices[HIDReportTypes.KEYBOARD] = device - continue + if up == HIDUsagePage.SYSCONTROL and us == HIDUsage.SYSCONTROL: + self.devices[HIDReportTypes.SYSCONTROL] = device + continue - if up == HIDUsagePage.MOUSE and us == HIDUsage.MOUSE: - self.devices[HIDReportTypes.MOUSE] = device - continue + def hid_send(self, evt): + # int, can be looked up in HIDReportTypes + reporting_device_const = self.report_device[0] - if up == HIDUsagePage.SYSCONTROL and us == HIDUsage.SYSCONTROL: - self.devices[HIDReportTypes.SYSCONTROL] = device - continue - - def hid_send(self, evt): - # int, can be looked up in HIDReportTypes - reporting_device_const = self.report_device[0] - - return self.devices[reporting_device_const].send_report( - evt[1 : HID_REPORT_SIZES[reporting_device_const] + 1] - ) + return self.devices[reporting_device_const].send_report( + evt[1 : HID_REPORT_SIZES[reporting_device_const] + 1] + ) diff --git a/kmk/matrix.py b/kmk/matrix.py index 480ffec..e35561d 100644 --- a/kmk/matrix.py +++ b/kmk/matrix.py @@ -1,4 +1,5 @@ import digitalio +import gc from kmk.consts import DiodeOrientation @@ -15,28 +16,29 @@ class MatrixScanner: diode_orientation=DiodeOrientation.COLUMNS, rollover_cols_every_rows=None, ): + self.len_cols = len(cols) + self.len_rows = len(rows) + # A pin cannot be both a row and column, detect this by combining the # two tuples into a set and validating that the length did not drop # # repr() hackery is because CircuitPython Pin objects are not hashable unique_pins = {repr(c) for c in cols} | {repr(r) for r in rows} - if len(unique_pins) != len(cols) + len(rows): - raise ValueError('Cannot use a pin as both a column and row') - - self.cols = cols - self.rows = rows - self.len_cols = len(cols) - self.len_rows = len(rows) + assert ( + len(unique_pins) == self.len_cols + self.len_rows + ), 'Cannot use a pin as both a column and row' + del unique_pins + gc.collect() self.diode_orientation = diode_orientation if self.diode_orientation == DiodeOrientation.COLUMNS: - self.outputs = self.cols - self.inputs = self.rows + self.outputs = [digitalio.DigitalInOut(x) for x in cols] + self.inputs = [digitalio.DigitalInOut(x) for x in rows] self.translate_coords = True elif self.diode_orientation == DiodeOrientation.ROWS: - self.outputs = self.rows - self.inputs = self.cols + self.outputs = [digitalio.DigitalInOut(x) for x in rows] + self.inputs = [digitalio.DigitalInOut(x) for x in cols] self.translate_coords = False else: raise ValueError( @@ -68,7 +70,7 @@ class MatrixScanner: any_changed = False for oidx, opin in enumerate(self.outputs): - opin.value(True) + opin.value = True for iidx, ipin in enumerate(self.inputs): # cast to int to avoid @@ -82,7 +84,7 @@ class MatrixScanner: # I haven't dived too far into what causes this, but it's # almost certainly because bool types in Python aren't just # aliases to int values, but are proper pseudo-types - new_val = int(ipin.value()) + new_val = int(ipin.value) old_val = self.state[ba_idx] if old_val != new_val: @@ -108,7 +110,7 @@ class MatrixScanner: ba_idx += 1 - opin.value(False) + opin.value = False if any_changed: break diff --git a/kmk/pins.py b/kmk/pins.py deleted file mode 100644 index 15a9d5b..0000000 --- a/kmk/pins.py +++ /dev/null @@ -1,99 +0,0 @@ -from micropython import const - -from kmk.consts import CIRCUITPYTHON, MICROPYTHON - -PULL_UP = const(1) -PULL_DOWN = const(2) - - -try: - import board - import digitalio - - PLATFORM = CIRCUITPYTHON - PIN_SOURCE = board -except ImportError: - import machine - - PLATFORM = MICROPYTHON - PIN_SOURCE = machine.Pin.board - - -def get_pin(pin): - ''' - Cross-platform method to find a pin by string. - - The pin definitions are platform-dependent, but this provides - a way to say "I'm using pin D20" without rolling a D20 and - having to actually learn MicroPython/CircuitPython and the - differences in how they handle pinouts. - - This also makes the keymap sanity checker actually work for - CircuitPython boards, since it's not possible in CPY to - define a module stub for `board` that uses Passthrough - natively (which is how the MicroPython stub worked originally) - ''' - return getattr(PIN_SOURCE, pin) - - -class AbstractedDigitalPin: - def __init__(self, pin): - self.raw_pin = pin - - if PLATFORM == CIRCUITPYTHON: - self.pin = digitalio.DigitalInOut(pin) - elif PLATFORM == MICROPYTHON: - self.pin = machine.Pin(pin) - else: - self.pin = pin - - self.call_value = callable(self.pin.value) - - def __repr__(self): - return 'AbstractedPin({})'.format(repr(self.raw_pin)) - - def switch_to_input(self, pull=None): - if PLATFORM == CIRCUITPYTHON: - if pull == PULL_UP: - return self.pin.switch_to_input(pull=digitalio.Pull.UP) - elif pull == PULL_DOWN: - return self.pin.switch_to_input(pull=digitalio.Pull.DOWN) - - return self.pin.switch_to_input(pull=pull) - - elif PLATFORM == MICROPYTHON: - if pull == PULL_UP: - return self.pin.init(machine.Pin.IN, machine.Pin.PULL_UP) - elif pull == PULL_DOWN: - return self.pin.init(machine.Pin.IN, machine.Pin.PULL_DOWN) - - raise ValueError('only PULL_UP and PULL_DOWN supported on MicroPython') - - raise NotImplementedError('switch_to_input not supported on platform') - - def switch_to_output(self): - if PLATFORM == CIRCUITPYTHON: - return self.pin.switch_to_output() - elif PLATFORM == MICROPYTHON: - return self.pin.init(machine.Pin.OUT) - - raise NotImplementedError('switch_to_output not supported on platform') - - def value(self, value=None): - if value is None: - if self.call_value: - return self.pin.value() - return self.pin.value - - if self.call_value: - return self.pin.value(value) - self.pin.value = value - return value - - -class PinLookup: - def __getattr__(self, attr): - return AbstractedDigitalPin(get_pin(attr)) - - -Pin = PinLookup() diff --git a/pyproject.toml b/pyproject.toml index a7c1e5c..b705225 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,5 +18,6 @@ exclude = ''' | build | docs | user_keymaps + | mnt )/ ''' diff --git a/setup.cfg b/setup.cfg index e8239ef..a7bc02f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [flake8] -exclude = .git,__pycache__,vendor,.venv,build,dist,.compiled +exclude = .git,__pycache__,vendor,.venv,build,dist,.compiled,mnt # match black expectations max_line_length = 88 @@ -47,6 +47,7 @@ known_standard_library = ubluepy, uio, uos, + usb_hid, # black compat multi_line_output=3 diff --git a/user_keymaps/kdb424/gherkin.py b/user_keymaps/kdb424/gherkin.py index bcb3c08..12c9991 100644 --- a/user_keymaps/kdb424/gherkin.py +++ b/user_keymaps/kdb424/gherkin.py @@ -1,8 +1,9 @@ +import board + from kmk.consts import DiodeOrientation, UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string from kmk.keys import KC from kmk.mcus.circuitpython_usbhid import KeyboardConfig -from kmk.pins import Pin as P from kmk.types import AttrDict keyboard = KeyboardConfig() @@ -29,8 +30,8 @@ PF5: A5 Mosfet on B5 to control backlight ''' -keyboard.col_pins = (P.A4, P.A2, P.A3, P.A1, P.A0, P.SDA) -keyboard.row_pins = (P.D2, P.TX, P.RX, P.MISO, P.MOSI) +keyboard.col_pins = (board.A4, board.A2, board.A3, board.A1, board.A0, board.SDA) +keyboard.row_pins = (board.D2, board.TX, board.RX, board.MISO, board.MOSI) # Kyle is fucking stupid keyboard.col_pins = tuple(reversed(keyboard.col_pins)) diff --git a/user_keymaps/kdb424/klanck.py b/user_keymaps/kdb424/klanck.py index a650206..7c07764 100644 --- a/user_keymaps/kdb424/klanck.py +++ b/user_keymaps/kdb424/klanck.py @@ -1,14 +1,15 @@ +import board + from kmk.consts import DiodeOrientation, UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string from kmk.keys import KC from kmk.mcus.circuitpython_usbhid import KeyboardConfig -from kmk.pins import Pin as P from kmk.types import AttrDict keyboard = KeyboardConfig() -keyboard.col_pins = (P.A0, P.A1, P.A2, P.A3, P.A4, P.A5, P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4) -keyboard.row_pins = (P.D10, P.D11, P.D12, P.D13) +keyboard.col_pins = (board.A0, board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4) +keyboard.row_pins = (board.D10, board.D11, board.D12, board.D13) keyboard.diode_orientation = DiodeOrientation.COLUMNS From eb566b0f71328df6a7b61edbe688db79cfdef452 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:35:08 -0700 Subject: [PATCH 12/16] Remove two classes that havent been used in almost a year --- kmk/types.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/kmk/types.py b/kmk/types.py index d36b882..54a49b3 100644 --- a/kmk/types.py +++ b/kmk/types.py @@ -11,23 +11,6 @@ class AttrDict(dict): return self[key] -class Anything: - ''' - A stub class which will repr as a provided name - ''' - - def __init__(self, name): - self.name = name - - def __repr__(self): - return 'Anything<{}>'.format(self.name) - - -class Passthrough: - def __getattr__(self, attr): - return Anything(attr) - - class LayerKeyMeta: def __init__(self, layer, kc=None): self.layer = layer From 6baaf5e5d430c82f6f01cde41875a943b247550e Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:58:23 -0700 Subject: [PATCH 13/16] Continue to shuffle and burn stuff - Remove the concept of "mcus". With only one target platform (CircuitPython), it no longer makes a bunch of sense and has been kept around for "what if" reasons, complicating our import chains and eating up RAM for pointless subclasses. If you're a `board`, you derive from `KeyboardConfig`. If you're a handwire, the user will derive from `KeyboardConfig`. The end. As part of this, `kmk.hid` was refactored heavily to emphasize that CircuitPython is our only supported HID stack, with stubs for future HID implementations (`USB_HID` becomes `AbstractHID`, probably only usable for testing purposes, `CircuitPython_USB_HID` becomes `USBHID`, and `BLEHID` is added with an immediate `NotImplementedError` on instantiation) - `KeyboardConfig` can now take a HID type at runtime. The NRF52840 boards will happily run in either configuration once CircuitPython support is in place, and a completely separate `mcu` subclass for each mode made no sense. This also potentially allows runtime *swaps* of HID driver down the line, but no code has been added to this effect. The default, and only functional value, for this is `HIDModes.USB` - Most consts have been moved to more logical homes - often, the main or, often only, component that uses them. `DiodeOrientation` moved to `kmk.matrix`, and anything HID-related moved to `kmk.hid` --- docs/config_and_keymap.md | 6 +-- .../converter/fourtypercentclub/gherkin.py | 4 +- .../converter/fourtypercentclub/luddite.py | 4 +- kmk/boards/converter/keebio/bdn9.py | 4 +- kmk/boards/converter/keebio/fourier.py | 4 +- kmk/boards/converter/keebio/iris_r1.py | 4 +- kmk/boards/converter/keebio/iris_r2.py | 4 +- kmk/boards/converter/keebio/lapace.py | 4 +- kmk/boards/converter/keebio/levinson_r1.py | 4 +- kmk/boards/converter/keebio/levinson_r2.py | 4 +- kmk/boards/converter/keebio/nyquist_r1.py | 4 +- kmk/boards/converter/keebio/nyquist_r2.py | 4 +- kmk/boards/converter/keebio/quefrency.py | 4 +- kmk/boards/converter/keebio/rorschach.py | 4 +- kmk/boards/converter/keebio/tragicforce68.py | 4 +- kmk/boards/converter/keebio/viterbi_r1.py | 4 +- kmk/boards/converter/keebio/viterbi_r2.py | 4 +- .../converter/lets-split/lets-split_r1.py | 4 +- .../converter/lets-split/lets-split_r2.py | 4 +- kmk/boards/klarank.py | 4 +- kmk/consts.py | 43 ----------------- kmk/hid.py | 47 +++++++++++++++++-- kmk/keyboard_config.py | 16 +++++-- kmk/matrix.py | 13 ++++- kmk/mcus/__init__.py | 0 kmk/mcus/circuitpython_usbhid.py | 6 --- kmk/preload_imports.py | 2 +- user_keymaps/kdb424/gherkin.py | 5 +- user_keymaps/kdb424/klanck.py | 5 +- 29 files changed, 115 insertions(+), 104 deletions(-) delete mode 100644 kmk/mcus/__init__.py delete mode 100644 kmk/mcus/circuitpython_usbhid.py diff --git a/docs/config_and_keymap.md b/docs/config_and_keymap.md index f0eab0d..5c6d4cf 100644 --- a/docs/config_and_keymap.md +++ b/docs/config_and_keymap.md @@ -18,9 +18,7 @@ interface between end users and the inner workings of KMK. Let's dive in! some day. - Import the `KeyboardConfig` object for your keyboard from `kmk.boards` (or, if - handwiring your keyboard, import `KeyboardConfig` from the appropriate MCU for your - board from `kmk.mcus`. See `hardware.md` for the list of supported boards and - map this to the correct Python module under either of those paths. + handwiring your keyboard, import `KeyboardConfig` from `kmk.keyboard_config`). - Assign a `KeyboardConfig` instance to a variable (ex. `keyboard = KeyboardConfig()` - note the parentheses) @@ -37,6 +35,8 @@ if __name__ == '__main__': for example: ```python +from kmk.matrix import DiodeOrientation + col_pins = (P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4) row_pins = (P.D10, P.D11, P.D12, P.D13, P.D9, P.D6, P.D5, P.SCL) rollover_cols_every_rows = 4 diff --git a/kmk/boards/converter/fourtypercentclub/gherkin.py b/kmk/boards/converter/fourtypercentclub/gherkin.py index 83b3ce7..9837110 100644 --- a/kmk/boards/converter/fourtypercentclub/gherkin.py +++ b/kmk/boards/converter/fourtypercentclub/gherkin.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/fourtypercentclub/luddite.py b/kmk/boards/converter/fourtypercentclub/luddite.py index ed9c826..d64a522 100644 --- a/kmk/boards/converter/fourtypercentclub/luddite.py +++ b/kmk/boards/converter/fourtypercentclub/luddite.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/bdn9.py b/kmk/boards/converter/keebio/bdn9.py index 674ea61..324aef7 100644 --- a/kmk/boards/converter/keebio/bdn9.py +++ b/kmk/boards/converter/keebio/bdn9.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/fourier.py b/kmk/boards/converter/keebio/fourier.py index 56f25af..e7bf4e1 100644 --- a/kmk/boards/converter/keebio/fourier.py +++ b/kmk/boards/converter/keebio/fourier.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/iris_r1.py b/kmk/boards/converter/keebio/iris_r1.py index dc9165c..914e753 100644 --- a/kmk/boards/converter/keebio/iris_r1.py +++ b/kmk/boards/converter/keebio/iris_r1.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/iris_r2.py b/kmk/boards/converter/keebio/iris_r2.py index c7058b4..c9d4273 100644 --- a/kmk/boards/converter/keebio/iris_r2.py +++ b/kmk/boards/converter/keebio/iris_r2.py @@ -1,8 +1,8 @@ import board -from kmk.consts import DiodeOrientation +from kmk.matrix import DiodeOrientation from kmk.matrix import intify_coordinate as ic -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/lapace.py b/kmk/boards/converter/keebio/lapace.py index a59b949..5358a26 100644 --- a/kmk/boards/converter/keebio/lapace.py +++ b/kmk/boards/converter/keebio/lapace.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/levinson_r1.py b/kmk/boards/converter/keebio/levinson_r1.py index 10dcce3..f8f7e12 100644 --- a/kmk/boards/converter/keebio/levinson_r1.py +++ b/kmk/boards/converter/keebio/levinson_r1.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/levinson_r2.py b/kmk/boards/converter/keebio/levinson_r2.py index c835d9e..6422be8 100644 --- a/kmk/boards/converter/keebio/levinson_r2.py +++ b/kmk/boards/converter/keebio/levinson_r2.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/nyquist_r1.py b/kmk/boards/converter/keebio/nyquist_r1.py index 1f70323..d2994d7 100644 --- a/kmk/boards/converter/keebio/nyquist_r1.py +++ b/kmk/boards/converter/keebio/nyquist_r1.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/nyquist_r2.py b/kmk/boards/converter/keebio/nyquist_r2.py index b0a5d90..41567d3 100644 --- a/kmk/boards/converter/keebio/nyquist_r2.py +++ b/kmk/boards/converter/keebio/nyquist_r2.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/quefrency.py b/kmk/boards/converter/keebio/quefrency.py index 1334901..ee54f42 100644 --- a/kmk/boards/converter/keebio/quefrency.py +++ b/kmk/boards/converter/keebio/quefrency.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/rorschach.py b/kmk/boards/converter/keebio/rorschach.py index bec13cd..b4b6345 100644 --- a/kmk/boards/converter/keebio/rorschach.py +++ b/kmk/boards/converter/keebio/rorschach.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/tragicforce68.py b/kmk/boards/converter/keebio/tragicforce68.py index f6158e7..9ba0d3e 100644 --- a/kmk/boards/converter/keebio/tragicforce68.py +++ b/kmk/boards/converter/keebio/tragicforce68.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/viterbi_r1.py b/kmk/boards/converter/keebio/viterbi_r1.py index b6c0b49..7f2ab40 100644 --- a/kmk/boards/converter/keebio/viterbi_r1.py +++ b/kmk/boards/converter/keebio/viterbi_r1.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/viterbi_r2.py b/kmk/boards/converter/keebio/viterbi_r2.py index fb0a3c6..4c39326 100644 --- a/kmk/boards/converter/keebio/viterbi_r2.py +++ b/kmk/boards/converter/keebio/viterbi_r2.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/lets-split/lets-split_r1.py b/kmk/boards/converter/lets-split/lets-split_r1.py index 0c2084d..6802768 100644 --- a/kmk/boards/converter/lets-split/lets-split_r1.py +++ b/kmk/boards/converter/lets-split/lets-split_r1.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/lets-split/lets-split_r2.py b/kmk/boards/converter/lets-split/lets-split_r2.py index 2d96c94..facd1b1 100644 --- a/kmk/boards/converter/lets-split/lets-split_r2.py +++ b/kmk/boards/converter/lets-split/lets-split_r2.py @@ -1,7 +1,7 @@ import board -from kmk.consts import DiodeOrientation -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/klarank.py b/kmk/boards/klarank.py index 00fa2b2..91ffe72 100644 --- a/kmk/boards/klarank.py +++ b/kmk/boards/klarank.py @@ -1,8 +1,8 @@ import board -from kmk.consts import DiodeOrientation +from kmk.matrix import DiodeOrientation from kmk.matrix import intify_coordinate as ic -from kmk.mcus.circuitpython_usbhid import KeyboardConfig as _KeyboardConfig +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig # Implements what used to be handled by KeyboardConfig.swap_indicies for this # board, by flipping various row3 (bottom physical row) keys so their diff --git a/kmk/consts.py b/kmk/consts.py index be4d915..aa8e646 100644 --- a/kmk/consts.py +++ b/kmk/consts.py @@ -3,49 +3,6 @@ try: except Exception: KMK_RELEASE = 'copied-from-git' -CIRCUITPYTHON = 'CircuitPython' - - -class HIDReportTypes: - KEYBOARD = 1 - MOUSE = 2 - CONSUMER = 3 - SYSCONTROL = 4 - - -class HIDUsage: - KEYBOARD = 0x06 - MOUSE = 0x02 - CONSUMER = 0x01 - SYSCONTROL = 0x80 - - -class HIDUsagePage: - CONSUMER = 0x0C - KEYBOARD = MOUSE = SYSCONTROL = 0x01 - - -# Currently only used by the CircuitPython HIDHelper because CircuitPython -# actually enforces these limits with a ValueError. Unused on PyBoard because -# we can happily send full reports there and it magically works. -HID_REPORT_SIZES = { - HIDReportTypes.KEYBOARD: 8, - HIDReportTypes.MOUSE: 4, - HIDReportTypes.CONSUMER: 2, - HIDReportTypes.SYSCONTROL: 8, # TODO find the correct value for this -} - - -class DiodeOrientation: - ''' - Orientation of diodes on handwired boards. You can think of: - COLUMNS = vertical - ROWS = horizontal - ''' - - COLUMNS = 0 - ROWS = 1 - class UnicodeMode: NOOP = 0 diff --git a/kmk/hid.py b/kmk/hid.py index 5b8a7a5..4b08323 100644 --- a/kmk/hid.py +++ b/kmk/hid.py @@ -1,10 +1,44 @@ import usb_hid -from kmk.consts import HID_REPORT_SIZES, HIDReportTypes, HIDUsage, HIDUsagePage from kmk.keys import FIRST_KMK_INTERNAL_KEY, ConsumerKey, ModifierKey -class USB_HID: +class HIDModes: + NOOP = 0 # currently unused; for testing? + USB = 1 + BLE = 2 # currently unused; for bluetooth + + ALL_MODES = (NOOP, USB, BLE) + + +class HIDReportTypes: + KEYBOARD = 1 + MOUSE = 2 + CONSUMER = 3 + SYSCONTROL = 4 + + +class HIDUsage: + KEYBOARD = 0x06 + MOUSE = 0x02 + CONSUMER = 0x01 + SYSCONTROL = 0x80 + + +class HIDUsagePage: + CONSUMER = 0x0C + KEYBOARD = MOUSE = SYSCONTROL = 0x01 + + +HID_REPORT_SIZES = { + HIDReportTypes.KEYBOARD: 8, + HIDReportTypes.MOUSE: 4, + HIDReportTypes.CONSUMER: 2, + HIDReportTypes.SYSCONTROL: 8, # TODO find the correct value for this +} + + +class AbstractHID: REPORT_BYTES = 8 def __init__(self): @@ -154,7 +188,7 @@ class USB_HID: return self -class CircuitPythonUSB_HID(USB_HID): +class USBHID(AbstractHID): REPORT_BYTES = 9 def post_init(self): @@ -187,3 +221,10 @@ class CircuitPythonUSB_HID(USB_HID): return self.devices[reporting_device_const].send_report( evt[1 : HID_REPORT_SIZES[reporting_device_const] + 1] ) + + +class BLEHID(AbstractHID): + def __init__(self, *args, **kwargs): + raise NotImplementedError( + 'BLE HID is not supported by upstream CircuitPython yet' + ) diff --git a/kmk/keyboard_config.py b/kmk/keyboard_config.py index cda1c1e..addfbd4 100644 --- a/kmk/keyboard_config.py +++ b/kmk/keyboard_config.py @@ -8,7 +8,7 @@ import gc from kmk import led, rgb from kmk.consts import KMK_RELEASE, LeaderMode, UnicodeMode -from kmk.hid import USB_HID +from kmk.hid import BLEHID, USBHID, AbstractHID, HIDModes from kmk.internal_state import InternalState from kmk.keys import KC from kmk.kmktime import sleep_ms @@ -34,8 +34,6 @@ class KeyboardConfig: leader_dictionary = {} leader_timeout = 1000 - hid_helper = USB_HID - # Split config extra_data_pin = None split_offsets = () @@ -192,11 +190,14 @@ class KeyboardConfig: else: return busio.UART(tx=pin, rx=None, timeout=timeout) - def go(self): + def go(self, hid_type=HIDModes.USB): assert self.keymap, 'must define a keymap with at least one row' assert self.row_pins, 'no GPIO pins defined for matrix rows' assert self.col_pins, 'no GPIO pins defined for matrix columns' assert self.diode_orientation is not None, 'diode orientation must be defined' + assert ( + hid_type in HIDModes.ALL_MODES + ), 'hid_type must be a value from kmk.consts.HIDModes' # Attempt to sanely guess a coord_mapping if one is not provided @@ -216,6 +217,13 @@ class KeyboardConfig: self._state = InternalState(self) + if hid_type == HIDModes.NOOP: + self.hid_helper = AbstractHID + elif hid_type == HIDModes.USB: + self.hid_helper = USBHID + elif hid_type == HIDModes.BLE: + self.hid_helper = BLEHID + self._hid_helper_inst = self.hid_helper() # Split keyboard Init diff --git a/kmk/matrix.py b/kmk/matrix.py index e35561d..26b83a2 100644 --- a/kmk/matrix.py +++ b/kmk/matrix.py @@ -1,13 +1,22 @@ import digitalio import gc -from kmk.consts import DiodeOrientation - def intify_coordinate(row, col): return row << 8 | col +class DiodeOrientation: + ''' + Orientation of diodes on handwired boards. You can think of: + COLUMNS = vertical + ROWS = horizontal + ''' + + COLUMNS = 0 + ROWS = 1 + + class MatrixScanner: def __init__( self, diff --git a/kmk/mcus/__init__.py b/kmk/mcus/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kmk/mcus/circuitpython_usbhid.py b/kmk/mcus/circuitpython_usbhid.py deleted file mode 100644 index 16d8530..0000000 --- a/kmk/mcus/circuitpython_usbhid.py +++ /dev/null @@ -1,6 +0,0 @@ -from kmk.hid import CircuitPythonUSB_HID -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig - - -class KeyboardConfig(_KeyboardConfig): - hid_helper = CircuitPythonUSB_HID diff --git a/kmk/preload_imports.py b/kmk/preload_imports.py index 4dbdcc8..4e0d63f 100644 --- a/kmk/preload_imports.py +++ b/kmk/preload_imports.py @@ -28,7 +28,7 @@ import kmk.kmktime # isort:skip import kmk.types # isort:skip from kmk.consts import LeaderMode, UnicodeMode, KMK_RELEASE # isort:skip -from kmk.hid import USB_HID # isort:skip +from kmk.hid import USBHID # isort:skip from kmk.internal_state import InternalState # isort:skip from kmk.keys import KC # isort:skip from kmk.matrix import MatrixScanner # isort:skip diff --git a/user_keymaps/kdb424/gherkin.py b/user_keymaps/kdb424/gherkin.py index 12c9991..a9e4f3c 100644 --- a/user_keymaps/kdb424/gherkin.py +++ b/user_keymaps/kdb424/gherkin.py @@ -1,9 +1,10 @@ import board -from kmk.consts import DiodeOrientation, UnicodeMode +from kmk.consts import UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string from kmk.keys import KC -from kmk.mcus.circuitpython_usbhid import KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig from kmk.types import AttrDict keyboard = KeyboardConfig() diff --git a/user_keymaps/kdb424/klanck.py b/user_keymaps/kdb424/klanck.py index 7c07764..e02cfb7 100644 --- a/user_keymaps/kdb424/klanck.py +++ b/user_keymaps/kdb424/klanck.py @@ -1,9 +1,10 @@ import board -from kmk.consts import DiodeOrientation, UnicodeMode +from kmk.consts import UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string from kmk.keys import KC -from kmk.mcus.circuitpython_usbhid import KeyboardConfig +from kmk.matrix import DiodeOrientation +from kmk.keyboard_config import KeyboardConfig from kmk.types import AttrDict keyboard = KeyboardConfig() From 5da455566905a02bb78e83f22280b17c5af26488 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 01:06:09 -0700 Subject: [PATCH 14/16] Fix isort ordering --- kmk/boards/converter/fourtypercentclub/gherkin.py | 2 +- kmk/boards/converter/fourtypercentclub/luddite.py | 2 +- kmk/boards/converter/keebio/bdn9.py | 2 +- kmk/boards/converter/keebio/fourier.py | 2 +- kmk/boards/converter/keebio/iris_r1.py | 2 +- kmk/boards/converter/keebio/iris_r2.py | 2 +- kmk/boards/converter/keebio/lapace.py | 2 +- kmk/boards/converter/keebio/levinson_r1.py | 2 +- kmk/boards/converter/keebio/levinson_r2.py | 2 +- kmk/boards/converter/keebio/nyquist_r1.py | 2 +- kmk/boards/converter/keebio/nyquist_r2.py | 2 +- kmk/boards/converter/keebio/quefrency.py | 2 +- kmk/boards/converter/keebio/rorschach.py | 2 +- kmk/boards/converter/keebio/tragicforce68.py | 2 +- kmk/boards/converter/keebio/viterbi_r1.py | 2 +- kmk/boards/converter/keebio/viterbi_r2.py | 2 +- kmk/boards/converter/lets-split/lets-split_r1.py | 2 +- kmk/boards/converter/lets-split/lets-split_r2.py | 2 +- kmk/boards/klarank.py | 2 +- user_keymaps/kdb424/gherkin.py | 2 +- user_keymaps/kdb424/klanck.py | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/kmk/boards/converter/fourtypercentclub/gherkin.py b/kmk/boards/converter/fourtypercentclub/gherkin.py index 9837110..853717d 100644 --- a/kmk/boards/converter/fourtypercentclub/gherkin.py +++ b/kmk/boards/converter/fourtypercentclub/gherkin.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/fourtypercentclub/luddite.py b/kmk/boards/converter/fourtypercentclub/luddite.py index d64a522..35c1695 100644 --- a/kmk/boards/converter/fourtypercentclub/luddite.py +++ b/kmk/boards/converter/fourtypercentclub/luddite.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/bdn9.py b/kmk/boards/converter/keebio/bdn9.py index 324aef7..7afec64 100644 --- a/kmk/boards/converter/keebio/bdn9.py +++ b/kmk/boards/converter/keebio/bdn9.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/fourier.py b/kmk/boards/converter/keebio/fourier.py index e7bf4e1..9eada4b 100644 --- a/kmk/boards/converter/keebio/fourier.py +++ b/kmk/boards/converter/keebio/fourier.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/iris_r1.py b/kmk/boards/converter/keebio/iris_r1.py index 914e753..0152149 100644 --- a/kmk/boards/converter/keebio/iris_r1.py +++ b/kmk/boards/converter/keebio/iris_r1.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/iris_r2.py b/kmk/boards/converter/keebio/iris_r2.py index c9d4273..5789f8d 100644 --- a/kmk/boards/converter/keebio/iris_r2.py +++ b/kmk/boards/converter/keebio/iris_r2.py @@ -1,8 +1,8 @@ import board +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig from kmk.matrix import DiodeOrientation from kmk.matrix import intify_coordinate as ic -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/lapace.py b/kmk/boards/converter/keebio/lapace.py index 5358a26..a97f575 100644 --- a/kmk/boards/converter/keebio/lapace.py +++ b/kmk/boards/converter/keebio/lapace.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/levinson_r1.py b/kmk/boards/converter/keebio/levinson_r1.py index f8f7e12..f3b7410 100644 --- a/kmk/boards/converter/keebio/levinson_r1.py +++ b/kmk/boards/converter/keebio/levinson_r1.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/levinson_r2.py b/kmk/boards/converter/keebio/levinson_r2.py index 6422be8..7595f76 100644 --- a/kmk/boards/converter/keebio/levinson_r2.py +++ b/kmk/boards/converter/keebio/levinson_r2.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/nyquist_r1.py b/kmk/boards/converter/keebio/nyquist_r1.py index d2994d7..6a899b4 100644 --- a/kmk/boards/converter/keebio/nyquist_r1.py +++ b/kmk/boards/converter/keebio/nyquist_r1.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/nyquist_r2.py b/kmk/boards/converter/keebio/nyquist_r2.py index 41567d3..e99ec2f 100644 --- a/kmk/boards/converter/keebio/nyquist_r2.py +++ b/kmk/boards/converter/keebio/nyquist_r2.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/quefrency.py b/kmk/boards/converter/keebio/quefrency.py index ee54f42..efc997e 100644 --- a/kmk/boards/converter/keebio/quefrency.py +++ b/kmk/boards/converter/keebio/quefrency.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/rorschach.py b/kmk/boards/converter/keebio/rorschach.py index b4b6345..2b996cb 100644 --- a/kmk/boards/converter/keebio/rorschach.py +++ b/kmk/boards/converter/keebio/rorschach.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/tragicforce68.py b/kmk/boards/converter/keebio/tragicforce68.py index 9ba0d3e..273f819 100644 --- a/kmk/boards/converter/keebio/tragicforce68.py +++ b/kmk/boards/converter/keebio/tragicforce68.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/viterbi_r1.py b/kmk/boards/converter/keebio/viterbi_r1.py index 7f2ab40..f2e49d5 100644 --- a/kmk/boards/converter/keebio/viterbi_r1.py +++ b/kmk/boards/converter/keebio/viterbi_r1.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/keebio/viterbi_r2.py b/kmk/boards/converter/keebio/viterbi_r2.py index 4c39326..5eaefe9 100644 --- a/kmk/boards/converter/keebio/viterbi_r2.py +++ b/kmk/boards/converter/keebio/viterbi_r2.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/lets-split/lets-split_r1.py b/kmk/boards/converter/lets-split/lets-split_r1.py index 6802768..f72fdf3 100644 --- a/kmk/boards/converter/lets-split/lets-split_r1.py +++ b/kmk/boards/converter/lets-split/lets-split_r1.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/converter/lets-split/lets-split_r2.py b/kmk/boards/converter/lets-split/lets-split_r2.py index facd1b1..7d392a8 100644 --- a/kmk/boards/converter/lets-split/lets-split_r2.py +++ b/kmk/boards/converter/lets-split/lets-split_r2.py @@ -1,7 +1,7 @@ import board -from kmk.matrix import DiodeOrientation from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.matrix import DiodeOrientation class KeyboardConfig(_KeyboardConfig): diff --git a/kmk/boards/klarank.py b/kmk/boards/klarank.py index 91ffe72..15e583b 100644 --- a/kmk/boards/klarank.py +++ b/kmk/boards/klarank.py @@ -1,8 +1,8 @@ import board +from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig from kmk.matrix import DiodeOrientation from kmk.matrix import intify_coordinate as ic -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig # Implements what used to be handled by KeyboardConfig.swap_indicies for this # board, by flipping various row3 (bottom physical row) keys so their diff --git a/user_keymaps/kdb424/gherkin.py b/user_keymaps/kdb424/gherkin.py index a9e4f3c..4089aa7 100644 --- a/user_keymaps/kdb424/gherkin.py +++ b/user_keymaps/kdb424/gherkin.py @@ -2,9 +2,9 @@ import board from kmk.consts import UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string +from kmk.keyboard_config import KeyboardConfig from kmk.keys import KC from kmk.matrix import DiodeOrientation -from kmk.keyboard_config import KeyboardConfig from kmk.types import AttrDict keyboard = KeyboardConfig() diff --git a/user_keymaps/kdb424/klanck.py b/user_keymaps/kdb424/klanck.py index e02cfb7..ae736ef 100644 --- a/user_keymaps/kdb424/klanck.py +++ b/user_keymaps/kdb424/klanck.py @@ -2,9 +2,9 @@ import board from kmk.consts import UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string +from kmk.keyboard_config import KeyboardConfig from kmk.keys import KC from kmk.matrix import DiodeOrientation -from kmk.keyboard_config import KeyboardConfig from kmk.types import AttrDict keyboard = KeyboardConfig() From b03ae32e7d7f444a21c2d84f0a633b1e0b839068 Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 01:20:14 -0700 Subject: [PATCH 15/16] straggling docs update --- docs/config_and_keymap.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/config_and_keymap.md b/docs/config_and_keymap.md index 5c6d4cf..5b25cf4 100644 --- a/docs/config_and_keymap.md +++ b/docs/config_and_keymap.md @@ -35,10 +35,12 @@ if __name__ == '__main__': for example: ```python +import board + from kmk.matrix import DiodeOrientation -col_pins = (P.SCK, P.MOSI, P.MISO, P.RX, P.TX, P.D4) -row_pins = (P.D10, P.D11, P.D12, P.D13, P.D9, P.D6, P.D5, P.SCL) +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) rollover_cols_every_rows = 4 diode_orientation = DiodeOrientation.COLUMNS ``` From 666c0a4f088d945051e13c923902a4f114927dce Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 01:30:55 -0700 Subject: [PATCH 16/16] Rename KeyboardConfig to KMKKeyboard - prepping for later merge with InternalState --- docs/config_and_keymap.md | 10 +++++----- docs/tapdance.md | 4 ++-- kmk/boards/converter/fourtypercentclub/gherkin.py | 4 ++-- kmk/boards/converter/fourtypercentclub/luddite.py | 4 ++-- kmk/boards/converter/keebio/bdn9.py | 4 ++-- kmk/boards/converter/keebio/fourier.py | 4 ++-- kmk/boards/converter/keebio/iris_r1.py | 4 ++-- kmk/boards/converter/keebio/iris_r2.py | 4 ++-- kmk/boards/converter/keebio/lapace.py | 4 ++-- kmk/boards/converter/keebio/levinson_r1.py | 4 ++-- kmk/boards/converter/keebio/levinson_r2.py | 4 ++-- kmk/boards/converter/keebio/nyquist_r1.py | 4 ++-- kmk/boards/converter/keebio/nyquist_r2.py | 4 ++-- kmk/boards/converter/keebio/quefrency.py | 4 ++-- kmk/boards/converter/keebio/rorschach.py | 4 ++-- kmk/boards/converter/keebio/tragicforce68.py | 4 ++-- kmk/boards/converter/keebio/viterbi_r1.py | 4 ++-- kmk/boards/converter/keebio/viterbi_r2.py | 4 ++-- kmk/boards/converter/lets-split/lets-split_r1.py | 4 ++-- kmk/boards/converter/lets-split/lets-split_r2.py | 4 ++-- kmk/boards/klarank.py | 6 +++--- kmk/{keyboard_config.py => kmk_keyboard.py} | 4 ++-- .../default/converter/fourtypercentclub/luddite.py | 4 ++-- user_keymaps/default/converter/keebio/nyquist_r2.py | 4 ++-- user_keymaps/kdb424/gherkin.py | 4 ++-- user_keymaps/kdb424/klanck.py | 4 ++-- user_keymaps/kdb424/levinson_r2.py | 4 ++-- user_keymaps/kdb424/luddite.py | 4 ++-- user_keymaps/kdb424/nyquist_r2.py | 4 ++-- user_keymaps/klardotsh/iris_r2.py | 4 ++-- user_keymaps/klardotsh/klarank_featherm4.py | 4 ++-- user_keymaps/rk463345/levinson_r2.py | 4 ++-- 32 files changed, 68 insertions(+), 68 deletions(-) rename kmk/{keyboard_config.py => kmk_keyboard.py} (99%) diff --git a/docs/config_and_keymap.md b/docs/config_and_keymap.md index 5b25cf4..0e0e614 100644 --- a/docs/config_and_keymap.md +++ b/docs/config_and_keymap.md @@ -1,7 +1,7 @@ # Configuring KMK KMK is configured through a rather large plain-old-Python class called -`KeyboardConfig`. Subclasses of this configuration exist which pre-fill defaults +`KMKKeyboard`. Subclasses of this configuration exist which pre-fill defaults for various known keyboards (for example, many Keebio keyboards are supported through our ItsyBitsy to ProMicro pinout adapter). This class is the main interface between end users and the inner workings of KMK. Let's dive in! @@ -17,13 +17,13 @@ interface between end users and the inner workings of KMK. Let's dive in! corruption bugs, or you might just have bad luck and delete the wrong file some day. -- Import the `KeyboardConfig` object for your keyboard from `kmk.boards` (or, if - handwiring your keyboard, import `KeyboardConfig` from `kmk.keyboard_config`). +- Import the `KMKKeyboard` object for your keyboard from `kmk.boards` (or, if + handwiring your keyboard, import `KMKKeyboard` from `kmk.kmk_keyboard`). -- Assign a `KeyboardConfig` instance to a variable (ex. `keyboard = KeyboardConfig()` - note +- Assign a `KMKKeyboard` instance to a variable (ex. `keyboard = KMKKeyboard()` - note the parentheses) -- Make sure this `KeyboardConfig` instance is actually run at the end of the file with +- Make sure this `KMKKeyboard` instance is actually run at the end of the file with a block such as the following: ```python diff --git a/docs/tapdance.md b/docs/tapdance.md index a974734..02b82fc 100644 --- a/docs/tapdance.md +++ b/docs/tapdance.md @@ -40,11 +40,11 @@ Here's an example of all this in action: ```python # user_keymaps/some_silly_example.py -from kmk.boards.klarank import KeyboardConfig +from kmk.boards.klarank import KMKKeyboard from kmk.keycodes import KC from kmk.macros.simple import send_string -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() keyboard.tap_time = 750 diff --git a/kmk/boards/converter/fourtypercentclub/gherkin.py b/kmk/boards/converter/fourtypercentclub/gherkin.py index 853717d..85f0dc3 100644 --- a/kmk/boards/converter/fourtypercentclub/gherkin.py +++ b/kmk/boards/converter/fourtypercentclub/gherkin.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.D9, board.D10, board.D11, board.D12, board.D13, board.SCL) row_pins = (board.A3, board.A4, board.A5, board.SCK, board.MOSI) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/fourtypercentclub/luddite.py b/kmk/boards/converter/fourtypercentclub/luddite.py index 35c1695..4be875f 100644 --- a/kmk/boards/converter/fourtypercentclub/luddite.py +++ b/kmk/boards/converter/fourtypercentclub/luddite.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = ( board.A0, board.A1, diff --git a/kmk/boards/converter/keebio/bdn9.py b/kmk/boards/converter/keebio/bdn9.py index 7afec64..de7789c 100644 --- a/kmk/boards/converter/keebio/bdn9.py +++ b/kmk/boards/converter/keebio/bdn9.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = ( board.RX, board.D13, diff --git a/kmk/boards/converter/keebio/fourier.py b/kmk/boards/converter/keebio/fourier.py index 9eada4b..b32847b 100644 --- a/kmk/boards/converter/keebio/fourier.py +++ b/kmk/boards/converter/keebio/fourier.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) row_pins = (board.A0, board.D11, board.D10, board.D9) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/iris_r1.py b/kmk/boards/converter/keebio/iris_r1.py index 0152149..4e47e2f 100644 --- a/kmk/boards/converter/keebio/iris_r1.py +++ b/kmk/boards/converter/keebio/iris_r1.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) row_pins = (board.D11, board.D10, board.D9, board.D7, board.D13) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/iris_r2.py b/kmk/boards/converter/keebio/iris_r2.py index 5789f8d..651b407 100644 --- a/kmk/boards/converter/keebio/iris_r2.py +++ b/kmk/boards/converter/keebio/iris_r2.py @@ -1,11 +1,11 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation from kmk.matrix import intify_coordinate as ic -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): # Pin mappings for converter board found at hardware/README.md # QMK: MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 } # QMK: MATRIX_ROW_PINS { D7, E6, B4, D2, D4 } diff --git a/kmk/boards/converter/keebio/lapace.py b/kmk/boards/converter/keebio/lapace.py index a97f575..6ff410c 100644 --- a/kmk/boards/converter/keebio/lapace.py +++ b/kmk/boards/converter/keebio/lapace.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = ( board.SDA, board.A2, diff --git a/kmk/boards/converter/keebio/levinson_r1.py b/kmk/boards/converter/keebio/levinson_r1.py index f3b7410..a074d29 100644 --- a/kmk/boards/converter/keebio/levinson_r1.py +++ b/kmk/boards/converter/keebio/levinson_r1.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.A0) row_pins = (board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/levinson_r2.py b/kmk/boards/converter/keebio/levinson_r2.py index 7595f76..1626821 100644 --- a/kmk/boards/converter/keebio/levinson_r2.py +++ b/kmk/boards/converter/keebio/levinson_r2.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) row_pins = (board.D13, board.D11, board.D10, board.D9) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/nyquist_r1.py b/kmk/boards/converter/keebio/nyquist_r1.py index 6a899b4..ded8feb 100644 --- a/kmk/boards/converter/keebio/nyquist_r1.py +++ b/kmk/boards/converter/keebio/nyquist_r1.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/nyquist_r2.py b/kmk/boards/converter/keebio/nyquist_r2.py index e99ec2f..708e09b 100644 --- a/kmk/boards/converter/keebio/nyquist_r2.py +++ b/kmk/boards/converter/keebio/nyquist_r2.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.RX, board.A1, board.A2, board.A3, board.A4, board.A5) row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/quefrency.py b/kmk/boards/converter/keebio/quefrency.py index efc997e..93e101a 100644 --- a/kmk/boards/converter/keebio/quefrency.py +++ b/kmk/boards/converter/keebio/quefrency.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): # Will need additional work and testing col_pins = ( board.A1, diff --git a/kmk/boards/converter/keebio/rorschach.py b/kmk/boards/converter/keebio/rorschach.py index 2b996cb..fd45d16 100644 --- a/kmk/boards/converter/keebio/rorschach.py +++ b/kmk/boards/converter/keebio/rorschach.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) row_pins = (board.D11, board.D10, board.D9, board.RX, board.D13) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/tragicforce68.py b/kmk/boards/converter/keebio/tragicforce68.py index 273f819..716b780 100644 --- a/kmk/boards/converter/keebio/tragicforce68.py +++ b/kmk/boards/converter/keebio/tragicforce68.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = ( board.A0, board.A1, diff --git a/kmk/boards/converter/keebio/viterbi_r1.py b/kmk/boards/converter/keebio/viterbi_r1.py index f2e49d5..43ffaa3 100644 --- a/kmk/boards/converter/keebio/viterbi_r1.py +++ b/kmk/boards/converter/keebio/viterbi_r1.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI) row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/keebio/viterbi_r2.py b/kmk/boards/converter/keebio/viterbi_r2.py index 5eaefe9..a17344d 100644 --- a/kmk/boards/converter/keebio/viterbi_r2.py +++ b/kmk/boards/converter/keebio/viterbi_r2.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A0, board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK) row_pins = (board.D13, board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/lets-split/lets-split_r1.py b/kmk/boards/converter/lets-split/lets-split_r1.py index f72fdf3..8ddc827 100644 --- a/kmk/boards/converter/lets-split/lets-split_r1.py +++ b/kmk/boards/converter/lets-split/lets-split_r1.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.A5, board.A4, board.A3, board.A2, board.A1, board.A0) row_pins = (board.D7, board.D9, board.D10, board.D11) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/converter/lets-split/lets-split_r2.py b/kmk/boards/converter/lets-split/lets-split_r2.py index 7d392a8..f13ec94 100644 --- a/kmk/boards/converter/lets-split/lets-split_r2.py +++ b/kmk/boards/converter/lets-split/lets-split_r2.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): col_pins = (board.MOSI, board.SCK, board.A5, board.A4, board.A3, board.A2) row_pins = (board.D11, board.D10, board.D9, board.D7) diode_orientation = DiodeOrientation.COLUMNS diff --git a/kmk/boards/klarank.py b/kmk/boards/klarank.py index 15e583b..7827f86 100644 --- a/kmk/boards/klarank.py +++ b/kmk/boards/klarank.py @@ -1,10 +1,10 @@ import board -from kmk.keyboard_config import KeyboardConfig as _KeyboardConfig +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard from kmk.matrix import DiodeOrientation from kmk.matrix import intify_coordinate as ic -# Implements what used to be handled by KeyboardConfig.swap_indicies for this +# Implements what used to be handled by KMKKeyboard.swap_indicies for this # board, by flipping various row3 (bottom physical row) keys so their # coord_mapping matches what the user pressed (even if the wiring # underneath is sending different coordinates) @@ -18,7 +18,7 @@ def r3_swap(col): return col -class KeyboardConfig(_KeyboardConfig): +class KMKKeyboard(_KMKKeyboard): # physical, visible cols (SCK, MO, MI, RX, TX, D4) # physical, visible rows (10, 11, 12, 13) (9, 6, 5, SCL) col_pins = (board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4) diff --git a/kmk/keyboard_config.py b/kmk/kmk_keyboard.py similarity index 99% rename from kmk/keyboard_config.py rename to kmk/kmk_keyboard.py index addfbd4..7b1a5cd 100644 --- a/kmk/keyboard_config.py +++ b/kmk/kmk_keyboard.py @@ -16,7 +16,7 @@ from kmk.matrix import MatrixScanner from kmk.matrix import intify_coordinate as ic -class KeyboardConfig: +class KMKKeyboard: debug_enabled = False keymap = None @@ -56,7 +56,7 @@ class KeyboardConfig: def __repr__(self): return ( - 'KeyboardConfig(' + 'KMKKeyboard(' 'debug_enabled={} ' 'keymap=truncated ' 'coord_mapping=truncated ' diff --git a/user_keymaps/default/converter/fourtypercentclub/luddite.py b/user_keymaps/default/converter/fourtypercentclub/luddite.py index 265af3b..ec9ffff 100644 --- a/user_keymaps/default/converter/fourtypercentclub/luddite.py +++ b/user_keymaps/default/converter/fourtypercentclub/luddite.py @@ -1,7 +1,7 @@ -from kmk.boards.converter.fourtypercentclub.luddite import KeyboardConfig +from kmk.boards.converter.fourtypercentclub.luddite import KMKKeyboard from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() _______ = KC.TRNS XXXXXXX = KC.NO diff --git a/user_keymaps/default/converter/keebio/nyquist_r2.py b/user_keymaps/default/converter/keebio/nyquist_r2.py index d5dbc3b..860ff0c 100644 --- a/user_keymaps/default/converter/keebio/nyquist_r2.py +++ b/user_keymaps/default/converter/keebio/nyquist_r2.py @@ -1,7 +1,7 @@ -from kmk.boards.converter.keebio.nyquist_r2 import KeyboardConfig +from kmk.boards.converter.keebio.nyquist_r2 import KMKKeyboard from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() _______ = KC.TRNS XXXXXXX = KC.NO diff --git a/user_keymaps/kdb424/gherkin.py b/user_keymaps/kdb424/gherkin.py index 4089aa7..6df6978 100644 --- a/user_keymaps/kdb424/gherkin.py +++ b/user_keymaps/kdb424/gherkin.py @@ -2,12 +2,12 @@ import board from kmk.consts import UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string -from kmk.keyboard_config import KeyboardConfig from kmk.keys import KC +from kmk.kmk_keyboard import KMKKeyboard from kmk.matrix import DiodeOrientation from kmk.types import AttrDict -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() ''' Converter/handwire: diff --git a/user_keymaps/kdb424/klanck.py b/user_keymaps/kdb424/klanck.py index ae736ef..555d3c9 100644 --- a/user_keymaps/kdb424/klanck.py +++ b/user_keymaps/kdb424/klanck.py @@ -2,12 +2,12 @@ import board from kmk.consts import UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences, send_string -from kmk.keyboard_config import KeyboardConfig from kmk.keys import KC +from kmk.kmk_keyboard import KMKKeyboard from kmk.matrix import DiodeOrientation from kmk.types import AttrDict -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() keyboard.col_pins = (board.A0, board.A1, board.A2, board.A3, board.A4, board.A5, board.SCK, board.MOSI, board.MISO, board.RX, board.TX, board.D4) keyboard.row_pins = (board.D10, board.D11, board.D12, board.D13) diff --git a/user_keymaps/kdb424/levinson_r2.py b/user_keymaps/kdb424/levinson_r2.py index 9fd2b70..5ae7352 100644 --- a/user_keymaps/kdb424/levinson_r2.py +++ b/user_keymaps/kdb424/levinson_r2.py @@ -1,9 +1,9 @@ -from kmk.boards.converter.keebio.levinson_r2 import KeyboardConfig +from kmk.boards.converter.keebio.levinson_r2 import KMKKeyboard from kmk.consts import LeaderMode, UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() # ------------------User level config variables --------------------------------------- keyboard.leader_mode = LeaderMode.TIMEOUT diff --git a/user_keymaps/kdb424/luddite.py b/user_keymaps/kdb424/luddite.py index 7dd27ce..0b1dc68 100644 --- a/user_keymaps/kdb424/luddite.py +++ b/user_keymaps/kdb424/luddite.py @@ -1,7 +1,7 @@ -from kmk.boards.converter.fourtypercentclub.luddite import KeyboardConfig +from kmk.boards.converter.fourtypercentclub.luddite import KMKKeyboard from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() # ---------------------------------- Config -------------------------------------------- diff --git a/user_keymaps/kdb424/nyquist_r2.py b/user_keymaps/kdb424/nyquist_r2.py index 1ca9a13..c2bc1a0 100644 --- a/user_keymaps/kdb424/nyquist_r2.py +++ b/user_keymaps/kdb424/nyquist_r2.py @@ -1,7 +1,7 @@ -from kmk.boards.converter.keebio.nyquist_r2 import KeyboardConfig +from kmk.boards.converter.keebio.nyquist_r2 import KMKKeyboard from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() # ------------------User level config variables --------------------------------------- keyboard.tap_time = 150 diff --git a/user_keymaps/klardotsh/iris_r2.py b/user_keymaps/klardotsh/iris_r2.py index e686a47..dab29a1 100644 --- a/user_keymaps/klardotsh/iris_r2.py +++ b/user_keymaps/klardotsh/iris_r2.py @@ -1,10 +1,10 @@ -from kmk.boards.converter.keebio.iris_r2 import KeyboardConfig +from kmk.boards.converter.keebio.iris_r2 import KMKKeyboard from kmk.consts import LeaderMode, UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences as cuss from kmk.handlers.sequences import send_string from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() keyboard.debug_enabled = False keyboard.unicode_mode = UnicodeMode.LINUX diff --git a/user_keymaps/klardotsh/klarank_featherm4.py b/user_keymaps/klardotsh/klarank_featherm4.py index c1e5897..bc099a0 100644 --- a/user_keymaps/klardotsh/klarank_featherm4.py +++ b/user_keymaps/klardotsh/klarank_featherm4.py @@ -1,10 +1,10 @@ -from kmk.boards.klarank import KeyboardConfig +from kmk.boards.klarank import KMKKeyboard from kmk.consts import LeaderMode, UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences as cuss from kmk.handlers.sequences import send_string from kmk.keys import KC, make_key -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() keyboard.debug_enabled = True keyboard.unicode_mode = UnicodeMode.LINUX diff --git a/user_keymaps/rk463345/levinson_r2.py b/user_keymaps/rk463345/levinson_r2.py index ced0733..aa8dadc 100755 --- a/user_keymaps/rk463345/levinson_r2.py +++ b/user_keymaps/rk463345/levinson_r2.py @@ -1,9 +1,9 @@ -from kmk.boards.converter.keebio.levinson_r2 import KeyboardConfig +from kmk.boards.converter.keebio.levinson_r2 import KMKKeyboard from kmk.consts import LeaderMode, UnicodeMode from kmk.handlers.sequences import compile_unicode_string_sequences from kmk.keys import KC -keyboard = KeyboardConfig() +keyboard = KMKKeyboard() # ------------------User level config variables --------------------------------------- keyboard.leader_mode = LeaderMode.TIMEOUT