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)