# SPDX-FileCopyrightText: 2021 Jeff Epler for Adafruit Industries # # SPDX-License-Identifier: MIT import keypad import board import usb_hid from adafruit_hid.keyboard import Keyboard, find_device from adafruit_hid.keycode import Keycode key_pins = ( board.KEY1, board.KEY2, board.KEY3, board.KEY4, board.KEY5, board.KEY6, board.KEY7, board.KEY8, board.KEY9, board.KEY10, board.KEY11, board.KEY12, ) keys = keypad.Keys(key_pins, value_when_pressed=False, pull=True) class BitmapKeyboard(Keyboard): def __init__(self, devices): device = find_device(devices, usage_page=0x1, usage=0x6) try: device.send_report(b'\0' * 16) except ValueError: print("found keyboard, but it did not accept a 16-byte report. check that boot.py is installed properly") self._keyboard_device = device # report[0] modifiers # report[1:16] regular key presses bitmask self.report = bytearray(16) self.report_modifier = memoryview(self.report)[0:1] self.report_bitmap = memoryview(self.report)[1:] def _add_keycode_to_report(self, keycode): modifier = Keycode.modifier_bit(keycode) if modifier: # Set bit for this modifier. self.report_modifier[0] |= modifier else: self.report_bitmap[keycode >> 3] |= 1 << (keycode & 0x7) def _remove_keycode_from_report(self, keycode): modifier = Keycode.modifier_bit(keycode) if modifier: # Set bit for this modifier. self.report_modifier[0] &= ~modifier else: self.report_bitmap[keycode >> 3] &= ~(1 << (keycode & 0x7)) def release_all(self): for i in range(len(self.report)): self.report[i] = 0 self._keyboard_device.send_report(self.report) kbd = BitmapKeyboard(usb_hid.devices) keymap = [ Keycode.ONE, Keycode.TWO, Keycode.THREE, Keycode.Q, Keycode.W, Keycode.E, Keycode.A, Keycode.S, Keycode.D, Keycode.Z, Keycode.X, Keycode.C] while True: ev = keys.events.get() if ev is not None: key = keymap[ev.key_number] if ev.pressed: kbd.press(key) else: kbd.release(key)