78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
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)
|