diff --git a/kmk/common/pins.py b/kmk/common/pins.py new file mode 100644 index 0000000..b469a5a --- /dev/null +++ b/kmk/common/pins.py @@ -0,0 +1,40 @@ +try: + import board + + PLATFORM = 'CircuitPython' + PIN_SOURCE = board +except ImportError: + import machine + + PLATFORM = 'MicroPython' + PIN_SOURCE = machine.Pin.board +except ImportError: + from kmk.common.types import Passthrough + + PLATFORM = 'Unit Testing' + PIN_SOURCE = Passthrough() + + +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 PinLookup: + def __getattr__(self, attr): + return get_pin(attr) + + +Pin = PinLookup() diff --git a/kmk/common/types.py b/kmk/common/types.py index 5befe08..aeacb85 100644 --- a/kmk/common/types.py +++ b/kmk/common/types.py @@ -8,3 +8,19 @@ class AttrDict(dict): ''' def __getattr__(self, key): 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) diff --git a/user_keymaps/kdb424/handwire_planck_pyboard.py b/user_keymaps/kdb424/handwire_planck_pyboard.py index c01b9a6..3671270 100644 --- a/user_keymaps/kdb424/handwire_planck_pyboard.py +++ b/user_keymaps/kdb424/handwire_planck_pyboard.py @@ -1,14 +1,11 @@ -import machine - from kmk.common.consts import DiodeOrientation, UnicodeModes from kmk.common.keycodes import KC from kmk.common.macros.unicode import unicode_sequence +from kmk.common.pins import Pin as P from kmk.entrypoints.handwire.pyboard import main -p = machine.Pin.board - -cols = (p.Y12, p.Y11, p.Y10, p.Y9, p.X8, p.X7, p.X6, p.X5, p.X4, p.X3, p.X2, p.X1) -rows = (p.Y1, p.Y2, p.Y3, p.Y4) +cols = (P.Y12, P.Y11, P.Y10, P.Y9, P.X8, P.X7, P.X6, P.X5, P.X4, P.X3, P.X2, P.X1) +rows = (P.Y1, P.Y2, P.Y3, P.Y4) diode_orientation = DiodeOrientation.COLUMNS diff --git a/user_keymaps/klardotsh/feather_m4_express/fourfour.py b/user_keymaps/klardotsh/feather_m4_express/fourfour.py index 54a2fb7..11d084e 100644 --- a/user_keymaps/klardotsh/feather_m4_express/fourfour.py +++ b/user_keymaps/klardotsh/feather_m4_express/fourfour.py @@ -1,14 +1,13 @@ -import board - from kmk.common.consts import DiodeOrientation, UnicodeModes from kmk.common.keycodes import KC from kmk.common.macros.simple import send_string, simple_key_sequence from kmk.common.macros.unicode import unicode_sequence +from kmk.common.pins import Pin as P from kmk.entrypoints.handwire.feather_m4_express import main from kmk.firmware import Firmware -cols = (board.D11, board.D10, board.D9) -rows = (board.A2, board.A3, board.A4, board.A5) +cols = (P.D11, P.D10, P.D9) +rows = (P.A2, P.A3, P.A4, P.A5) diode_orientation = DiodeOrientation.COLUMNS unicode_mode = UnicodeModes.LINUX diff --git a/user_keymaps/klardotsh/itsybitsy_m4_express/threethree.py b/user_keymaps/klardotsh/itsybitsy_m4_express/threethree.py index 711c5b1..5c0267b 100644 --- a/user_keymaps/klardotsh/itsybitsy_m4_express/threethree.py +++ b/user_keymaps/klardotsh/itsybitsy_m4_express/threethree.py @@ -1,14 +1,13 @@ -import board - from kmk.common.consts import DiodeOrientation, UnicodeModes from kmk.common.keycodes import KC from kmk.common.macros.simple import send_string, simple_key_sequence from kmk.common.macros.unicode import unicode_sequence +from kmk.common.pins import Pin as P from kmk.entrypoints.handwire.itsybitsy_m4_express import main from kmk.firmware import Firmware -cols = (board.A4, board.A5, board.D13) -rows = (board.D12, board.D11, board.D10) +cols = (P.A4, P.A5, P.D13) +rows = (P.D12, P.D11, P.D10) diode_orientation = DiodeOrientation.COLUMNS unicode_mode = UnicodeModes.LINUX diff --git a/user_keymaps/klardotsh/threethree_matrix_pyboard.py b/user_keymaps/klardotsh/threethree_matrix_pyboard.py index 12260e5..b334317 100644 --- a/user_keymaps/klardotsh/threethree_matrix_pyboard.py +++ b/user_keymaps/klardotsh/threethree_matrix_pyboard.py @@ -1,14 +1,12 @@ -import machine - from kmk.common.consts import DiodeOrientation, UnicodeModes from kmk.common.keycodes import KC from kmk.common.macros.simple import send_string, simple_key_sequence from kmk.common.macros.unicode import unicode_sequence +from kmk.common.pins import Pin as P from kmk.entrypoints.handwire.pyboard import main -p = machine.Pin.board -cols = (p.X10, p.X11, p.X12) -rows = (p.X1, p.X2, p.X3) +cols = (P.X10, P.X11, P.X12) +rows = (P.X1, P.X2, P.X3) diode_orientation = DiodeOrientation.COLUMNS unicode_mode = UnicodeModes.LINUX