/ CircuitPython_MacroPad_NKRO / code.py
code.py
1 # SPDX-FileCopyrightText: 2021 Jeff Epler for Adafruit Industries 2 # 3 # SPDX-License-Identifier: MIT 4 5 import keypad 6 import board 7 import usb_hid 8 from adafruit_hid.keyboard import Keyboard, find_device 9 from adafruit_hid.keycode import Keycode 10 11 key_pins = ( 12 board.KEY1, 13 board.KEY2, 14 board.KEY3, 15 board.KEY4, 16 board.KEY5, 17 board.KEY6, 18 board.KEY7, 19 board.KEY8, 20 board.KEY9, 21 board.KEY10, 22 board.KEY11, 23 board.KEY12, 24 ) 25 26 keys = keypad.Keys(key_pins, value_when_pressed=False, pull=True) 27 28 class BitmapKeyboard(Keyboard): 29 def __init__(self, devices): 30 device = find_device(devices, usage_page=0x1, usage=0x6) 31 32 try: 33 device.send_report(b'\0' * 16) 34 except ValueError: 35 print("found keyboard, but it did not accept a 16-byte report. check that boot.py is installed properly") 36 37 self._keyboard_device = device 38 39 # report[0] modifiers 40 # report[1:16] regular key presses bitmask 41 self.report = bytearray(16) 42 43 self.report_modifier = memoryview(self.report)[0:1] 44 self.report_bitmap = memoryview(self.report)[1:] 45 46 def _add_keycode_to_report(self, keycode): 47 modifier = Keycode.modifier_bit(keycode) 48 if modifier: 49 # Set bit for this modifier. 50 self.report_modifier[0] |= modifier 51 else: 52 self.report_bitmap[keycode >> 3] |= 1 << (keycode & 0x7) 53 54 def _remove_keycode_from_report(self, keycode): 55 modifier = Keycode.modifier_bit(keycode) 56 if modifier: 57 # Set bit for this modifier. 58 self.report_modifier[0] &= ~modifier 59 else: 60 self.report_bitmap[keycode >> 3] &= ~(1 << (keycode & 0x7)) 61 62 def release_all(self): 63 for i in range(len(self.report)): 64 self.report[i] = 0 65 self._keyboard_device.send_report(self.report) 66 67 kbd = BitmapKeyboard(usb_hid.devices) 68 69 keymap = [ 70 Keycode.ONE, Keycode.TWO, Keycode.THREE, 71 Keycode.Q, Keycode.W, Keycode.E, 72 Keycode.A, Keycode.S, Keycode.D, 73 Keycode.Z, Keycode.X, Keycode.C] 74 75 while True: 76 ev = keys.events.get() 77 if ev is not None: 78 key = keymap[ev.key_number] 79 if ev.pressed: 80 kbd.press(key) 81 else: 82 kbd.release(key)