From 6baaf5e5d430c82f6f01cde41875a943b247550e Mon Sep 17 00:00:00 2001 From: Josh Klar Date: Thu, 25 Jul 2019 00:58:23 -0700 Subject: [PATCH] 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()