From 1b67de0db970c3855980f8a6cea58e7352c9d228 Mon Sep 17 00:00:00 2001 From: Zackarias Montell Date: Fri, 14 Jan 2022 11:26:42 +0100 Subject: [PATCH] restructured --- boot.py | 39 ++------------ code.py | 10 ++-- config.py | 49 ------------------ .../macropad_rev1/default/keymap.py | 6 +-- .../macropad_rev1/default/pinouts.py | 5 +- lib/adafruit_mcp230xx/__init__.mpy | Bin lib/adafruit_mcp230xx/digital_inout.mpy | Bin lib/adafruit_mcp230xx/mcp23008.mpy | Bin lib/adafruit_mcp230xx/mcp23016.mpy | Bin lib/adafruit_mcp230xx/mcp23017.mpy | Bin lib/adafruit_mcp230xx/mcp230xx.mpy | Bin lib/adafruit_mcp230xx/mcp23s08.mpy | Bin lib/adafruit_mcp230xx/mcp23s17.mpy | Bin lib/adafruit_mcp230xx/mcp23sxx.mpy | Bin lib/adafruit_mcp230xx/mcp23xxx.mpy | Bin lib/simpleio.mpy | Bin nmlkpy/__init__.py | 0 nmlkpy/boot.py | 39 ++++++++++++++ keyboard.py => nmlkpy/keyboard.py | 5 +- keycodes.py => nmlkpy/keycodes.py | 0 keytypes.py => nmlkpy/keytypes.py | 15 ++++-- layer_manager.py => nmlkpy/layer_manager.py | 2 +- pin.py => nmlkpy/pin.py | 0 tests.py => nmlkpy/tests.py | 3 -- 24 files changed, 69 insertions(+), 104 deletions(-) delete mode 100755 config.py rename keymap.py => keyboards/macropad_rev1/default/keymap.py (92%) mode change 100644 => 100755 rename hardware.py => keyboards/macropad_rev1/default/pinouts.py (68%) mode change 100644 => 100755 mode change 100755 => 100644 lib/adafruit_mcp230xx/__init__.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/digital_inout.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23008.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23016.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23017.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp230xx.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23s08.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23s17.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23sxx.mpy mode change 100755 => 100644 lib/adafruit_mcp230xx/mcp23xxx.mpy mode change 100755 => 100644 lib/simpleio.mpy create mode 100755 nmlkpy/__init__.py create mode 100755 nmlkpy/boot.py rename keyboard.py => nmlkpy/keyboard.py (98%) rename keycodes.py => nmlkpy/keycodes.py (100%) rename keytypes.py => nmlkpy/keytypes.py (98%) mode change 100755 => 100644 rename layer_manager.py => nmlkpy/layer_manager.py (91%) mode change 100644 => 100755 rename pin.py => nmlkpy/pin.py (100%) mode change 100644 => 100755 rename tests.py => nmlkpy/tests.py (89%) diff --git a/boot.py b/boot.py index acc2cbf..29946c9 100644 --- a/boot.py +++ b/boot.py @@ -1,36 +1,5 @@ -import busio -import digitalio -import usb_hid -from hardware import io_extenders_pinout, pinout -from adafruit_mcp230xx.mcp23017 import MCP23017 -import storage -import usb_cdc +from nmlkpy.boot import enable_nkro_device, disable_dev_mode_unless_first_key_is_held +from keyboards.macropad_rev1.default.pinouts import io_extenders_pinout, pinout -io_extender_index, pin_number = pinout[0] -address, scl, sda = io_extenders_pinout[io_extender_index] -io_extender = MCP23017(busio.I2C(scl, sda), address) -pin = io_extender.get_pin(pin_number) -pin.direction = digitalio.Direction.INPUT -pin.pull = digitalio.Pull.UP - -if pin.value: - storage.disable_usb_drive() - usb_cdc.disable() - -bitmap_keyboard = usb_hid.Device( - report_descriptor=( - b'\x05\x01\t\x06\xa1\x01\x85\x04u\x01\x95\x08\x05\x07\x19\xe0)\xe7\x15\x00%\x01\x81\x02\x95\x05u\x01\x05\x08\x19\x01)\x05\x91\x02\x95\x01u\x03\x91\x03\x95xu\x01\x15\x00%\x01\x05\x07\x19\x00)w\x81\x02\xc0'), - report_ids=(4,), - in_report_lengths=(16,), - out_report_lengths=(1,), - usage_page=0x1, - usage=0x6, -) -print(bitmap_keyboard) -devices = [ - bitmap_keyboard, - usb_hid.Device.CONSUMER_CONTROL, - usb_hid.Device.MOUSE, -] -usb_hid.enable(devices) -print("enabled HID with custom keyboard device") +disable_dev_mode_unless_first_key_is_held(pinout, io_extenders_pinout) +enable_nkro_device() diff --git a/code.py b/code.py index efea881..e02dd8c 100644 --- a/code.py +++ b/code.py @@ -1,8 +1,8 @@ -from keyboard import Keyboard -from keymap import keymap, layer_colors -from hardware import debug_repl, io_extenders_pinout, pinout, rgb_pins +from nmlkpy.keyboard import Keyboard +from keyboards.macropad_rev1.default.keymap import keymap, layer_colors +from keyboards.macropad_rev1.default.pinouts import debug_repl, io_extenders_pinout, pinout, rgb_pins -keyboard_state_manager = Keyboard( +kb = Keyboard( io_extenders_pinout, pinout, keymap, rgb_pins, layer_colors, debug_repl) -keyboard_state_manager.start() +kb.start() diff --git a/config.py b/config.py deleted file mode 100755 index fd590e5..0000000 --- a/config.py +++ /dev/null @@ -1,49 +0,0 @@ - -# pimodori tiny 2040 8MB -import board -from keyboard import Hold, Toggle -from keycodes import SE -from keytypes import Keycode, Modifier - -io_extenders_pinout = [(0x20, board.GP1, board.GP0)] - -pinout: tuple[int, int] = [ - (0, 7), (0, 11), (0, 15), (0, 0), - (0, 8), (0, 4), (0, 14), (0, 1), - (0, 6), (0, 10), (0, 13), (0, 2), - (0, 9), (0, 5), (0, 12), (0, 3) -] - -keymap = [[ - Hold(1), Toggle(2), Toggle(3), Toggle(4), - Toggle(0), Keycode(SE.B), Keycode(SE.C), Keycode(SE.D), - Keycode(SE.E), Keycode(SE.F), Keycode(SE.G), Keycode(SE.H), - Keycode(SE.I), Keycode(SE.J), Keycode(SE.K), Keycode(SE.L) -], [ - Hold(1), Toggle(2), Toggle(3), Toggle(4), - Keycode(SE.ONE), Hold(1), Keycode(SE.C), Keycode(SE.D), - Keycode(SE.E), Keycode(SE.F), Keycode(SE.G), Keycode(SE.H), - Keycode(SE.BACKSPACE), Keycode(SE.J), Keycode(SE.K), Keycode(SE.L) -], [ - Hold(1), Toggle(2), Toggle(3), Toggle(4), - Keycode(SE.A), Hold(1), Hold(2), Keycode(SE.D), - Keycode(SE.E), Keycode(SE.F), Keycode(SE.G), Keycode(SE.H), - Keycode(SE.I), Keycode(SE.J), Keycode(SE.K), Keycode(SE.L) -], [ - Hold(1), Toggle(2), Toggle(3), Toggle(4), - Keycode(SE.A), Keycode(SE.B), Hold(2), Hold(3), - Keycode(SE.E), Keycode(SE.F), Keycode(SE.G), Keycode(SE.H), - Keycode(SE.I), Keycode(SE.J), Keycode(SE.K), Keycode(SE.L) -], [ - Hold(1), Toggle(2), Toggle(3), Toggle(4), - Keycode(SE.A), Keycode(SE.B), Keycode(SE.C), Hold(3), - Keycode(SE.E), Keycode(SE.F), Keycode(SE.G), Keycode(SE.H), - Keycode(SE.I), Keycode(SE.J), Keycode(SE.K), Modifier(SE.LEFT_ALT) -]] - -layer_colors = [(255, 255, 255), (0, 255, 0), (0, 0, 255), - (255, 0, 255), (255, 255, 0)] - -rgb_pins: tuple[int, int, int] = (board.LED_R, board.LED_G, board.LED_B) - -debug_repl = True diff --git a/keymap.py b/keyboards/macropad_rev1/default/keymap.py old mode 100644 new mode 100755 similarity index 92% rename from keymap.py rename to keyboards/macropad_rev1/default/keymap.py index 8318f87..3478186 --- a/keymap.py +++ b/keyboards/macropad_rev1/default/keymap.py @@ -1,6 +1,6 @@ -from keycodes import SE -from keytypes import Hold, Keycode, Modifier, Toggle -from layer_manager import LayerManager +from nmlkpy.keycodes import SE +from nmlkpy.keytypes import Keycode, Modifier +from nmlkpy.layer_manager import LayerManager lm = LayerManager(5) diff --git a/hardware.py b/keyboards/macropad_rev1/default/pinouts.py old mode 100644 new mode 100755 similarity index 68% rename from hardware.py rename to keyboards/macropad_rev1/default/pinouts.py index 5538d6e..635e67e --- a/hardware.py +++ b/keyboards/macropad_rev1/default/pinouts.py @@ -1,8 +1,9 @@ import board -io_extenders_pinout = [(0x20, board.GP1, board.GP0)] +io_extenders_pinout: list[tuple[int, int, int]] = [ + (0x20, board.GP1, board.GP0)] -pinout: tuple[int, int] = [ +pinout: list[tuple[int, int]] = [ (0, 7), (0, 11), (0, 15), (0, 0), (0, 8), (0, 4), (0, 14), (0, 1), (0, 6), (0, 10), (0, 13), (0, 2), diff --git a/lib/adafruit_mcp230xx/__init__.mpy b/lib/adafruit_mcp230xx/__init__.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/digital_inout.mpy b/lib/adafruit_mcp230xx/digital_inout.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23008.mpy b/lib/adafruit_mcp230xx/mcp23008.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23016.mpy b/lib/adafruit_mcp230xx/mcp23016.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23017.mpy b/lib/adafruit_mcp230xx/mcp23017.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp230xx.mpy b/lib/adafruit_mcp230xx/mcp230xx.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23s08.mpy b/lib/adafruit_mcp230xx/mcp23s08.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23s17.mpy b/lib/adafruit_mcp230xx/mcp23s17.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23sxx.mpy b/lib/adafruit_mcp230xx/mcp23sxx.mpy old mode 100755 new mode 100644 diff --git a/lib/adafruit_mcp230xx/mcp23xxx.mpy b/lib/adafruit_mcp230xx/mcp23xxx.mpy old mode 100755 new mode 100644 diff --git a/lib/simpleio.mpy b/lib/simpleio.mpy old mode 100755 new mode 100644 diff --git a/nmlkpy/__init__.py b/nmlkpy/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/nmlkpy/boot.py b/nmlkpy/boot.py new file mode 100755 index 0000000..01884f4 --- /dev/null +++ b/nmlkpy/boot.py @@ -0,0 +1,39 @@ +import usb_hid +import busio +import digitalio +import storage +import usb_cdc +from adafruit_mcp230xx.mcp23017 import MCP23017 + + +def enable_nkro_device(): + bitmap_keyboard = usb_hid.Device( + report_descriptor=( + b'\x05\x01\t\x06\xa1\x01\x85\x04u\x01\x95\x08\x05\x07\x19\xe0)\xe7\x15\x00%\x01\x81\x02\x95\x05u\x01\x05\x08\x19\x01)\x05\x91\x02\x95\x01u\x03\x91\x03\x95xu\x01\x15\x00%\x01\x05\x07\x19\x00)w\x81\x02\xc0'), + report_ids=(4,), + in_report_lengths=(16,), + out_report_lengths=(1,), + usage_page=0x1, + usage=0x6, + ) + print(bitmap_keyboard) + devices = [ + bitmap_keyboard, + usb_hid.Device.CONSUMER_CONTROL, + usb_hid.Device.MOUSE, + ] + usb_hid.enable(devices) + print("enabled HID with custom keyboard device") + + +def disable_dev_mode_unless_first_key_is_held(pinout: list[tuple[int, int]], io_extenders_pinout: list[tuple[int, int, int]]) -> None: + io_extender_index, pin_number = pinout[0] + address, scl, sda = io_extenders_pinout[io_extender_index] + io_extender = MCP23017(busio.I2C(scl, sda), address) + pin = io_extender.get_pin(pin_number) + pin.direction = digitalio.Direction.INPUT + pin.pull = digitalio.Pull.UP + + if pin.value: + storage.disable_usb_drive() + usb_cdc.disable() diff --git a/keyboard.py b/nmlkpy/keyboard.py similarity index 98% rename from keyboard.py rename to nmlkpy/keyboard.py index a937423..ae42f70 100755 --- a/keyboard.py +++ b/nmlkpy/keyboard.py @@ -2,12 +2,13 @@ from adafruit_mcp230xx.digital_inout import DigitalInOut from adafruit_mcp230xx.mcp23017 import MCP23017 import digitalio import busio -from tests import test_keymap +from .tests import test_keymap import usb_hid import pwmio import time from micropython import const -from keytypes import KeyBase, LayerKeyBase, Pin, Toggle, Hold +from .keytypes import KeyBase +from .pin import Pin __RED = (255, 0, 0) diff --git a/keycodes.py b/nmlkpy/keycodes.py similarity index 100% rename from keycodes.py rename to nmlkpy/keycodes.py diff --git a/keytypes.py b/nmlkpy/keytypes.py old mode 100755 new mode 100644 similarity index 98% rename from keytypes.py rename to nmlkpy/keytypes.py index c153256..9219808 --- a/keytypes.py +++ b/nmlkpy/keytypes.py @@ -1,5 +1,5 @@ from micropython import const -from pin import Pin, PinEvent +from .pin import Pin, PinEvent _VALID_KEYCODES = range(0, 255) _VALID_MODIFIERS = [0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000] @@ -125,12 +125,16 @@ class KeycodeBase(KeyBase): if current_key_event == KeyEvent.SOFT_RELEASED: if previous_key_event == KeyEvent.RELEASED: + print(1) return self._set_event(KeyEvent.RELEASED) if next_pin_event == PinEvent.RELEASED: + print(2) return self._set_event(KeyEvent.RELEASED) if previous_key_event == KeyEvent.PRESSED_ or next_pin_event == PinEvent.PRESSED: + print(3) return self._set_event(KeyEvent.SOFT_RELEASED) - return self._set_event(KeyEvent.NO_EVENT) + print(4) + return self._set_event(KeyEvent.SOFT_RELEASED) if current_key_event == KeyEvent.NO_EVENT: if next_pin_event == PinEvent.NO_EVENT: @@ -158,14 +162,17 @@ class KeycodeBase(KeyBase): def _handle_event(self, keyboard) -> None: current = self.events.current - if current == KeyEvent.NO_EVENT: - return if current == KeyEvent.PRESSED_: keyboard.add_keycode_to_report(self.keycode) + return if current == KeyEvent.RELEASED: keyboard.remove_keycode_from_report(self.keycode) + return if current == KeyEvent.SOFT_RELEASED: keyboard.remove_keycode_from_report(self.keycode) + return + + raise NotImplementedError() def handle(self, keyboard, pin): if not self._consume_next_event(pin): diff --git a/layer_manager.py b/nmlkpy/layer_manager.py old mode 100644 new mode 100755 similarity index 91% rename from layer_manager.py rename to nmlkpy/layer_manager.py index c0e5adf..5531a49 --- a/layer_manager.py +++ b/nmlkpy/layer_manager.py @@ -1,4 +1,4 @@ -from keytypes import Hold, Toggle +from .keytypes import Hold, Toggle class LayerManager: diff --git a/pin.py b/nmlkpy/pin.py old mode 100644 new mode 100755 similarity index 100% rename from pin.py rename to nmlkpy/pin.py diff --git a/tests.py b/nmlkpy/tests.py similarity index 89% rename from tests.py rename to nmlkpy/tests.py index 224cf85..6ac068d 100755 --- a/tests.py +++ b/nmlkpy/tests.py @@ -1,6 +1,3 @@ -from keytypes import Keycode, Modifier, Toggle - - def test_keymap(keymap: list[list], output: bool = False) -> None: if output: print("Testing keymap for errors")