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()