Adafruit_Learning_System_Gu.../CircuitPython_MacroPad_NKRO/code.py

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)