Skip to content

Instantly share code, notes, and snippets.

@dismas666
Forked from wulfboy-95/code.py
Created September 10, 2022 02:38
Show Gist options
  • Save dismas666/668d56d0f8a245f691ff32936aca8619 to your computer and use it in GitHub Desktop.
Save dismas666/668d56d0f8a245f691ff32936aca8619 to your computer and use it in GitHub Desktop.
CircuitPython (7.x.x and above) code for a TADA-68 style keyboard with a Raspberry Pi Pico controller.
# Copyright wulfboy_95 2022, All Rights Reserved.
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
import board
import keypad
import struct
import usb_hid
from adafruit_hid.keyboard import Keycode
# Create and init keyboard USB HID device.
keeb = None
for dev in list(usb_hid.devices):
if ((dev.usage == 0x06) and
(dev.usage_page == 0x01) and
hasattr(dev, "send_report")):
keeb = dev
if keeb == None:
raise Exception("Device cannot be found")
matrix = keypad.KeyMatrix(
row_pins = (
board.GP6, board.GP7, board.GP8, board.GP9, board.GP10
),
column_pins = (
board.GP11, board.GP12, board.GP13, board.GP14, board.GP15,
board.GP16, board.GP17, board.GP18, board.GP19, board.GP20,
board.GP21, board.GP22, board.GP26, board.GP27, board.GP28
),
columns_to_anodes=True
)
# Key list to convert key_number from KeyMatrix events to the corresponding keycode.
keys_list = [
Keycode.ESCAPE, Keycode.ONE, Keycode.TWO, Keycode.THREE, Keycode.FOUR, Keycode.FIVE, Keycode.SIX, Keycode.SEVEN,
Keycode.EIGHT, Keycode.NINE, Keycode.ZERO, Keycode.MINUS, Keycode.EQUALS, Keycode.BACKSPACE, Keycode.GRAVE_ACCENT,
Keycode.TAB, Keycode.Q, Keycode.W, Keycode.E, Keycode.R, Keycode.T, Keycode.Y, Keycode.U, Keycode.I, Keycode.O,
Keycode.P, Keycode.LEFT_BRACKET, Keycode.RIGHT_BRACKET, Keycode.BACKSLASH, Keycode.DELETE, Keycode.CAPS_LOCK,
Keycode.A, Keycode.S, Keycode.D, Keycode.F, Keycode.G, Keycode.H, Keycode.J, Keycode.K, Keycode.L, Keycode.SEMICOLON,
Keycode.QUOTE, Keycode.RETURN, Keycode.ENTER, Keycode.HOME, Keycode.LEFT_SHIFT, Keycode.SHIFT, Keycode.Z, Keycode.X,
Keycode.C, Keycode.V, Keycode.B, Keycode.N, Keycode.M, Keycode.COMMA, Keycode.PERIOD, Keycode.FORWARD_SLASH,
Keycode.RIGHT_SHIFT, Keycode.UP_ARROW, Keycode.END, Keycode.LEFT_CONTROL, Keycode.LEFT_GUI, Keycode.LEFT_ALT,
Keycode.SPACE, Keycode.SPACE, Keycode.SPACE, Keycode.SPACEBAR, Keycode.SPACE, Keycode.SPACE, Keycode.RIGHT_ALT,
Keycode.RIGHT_GUI, Keycode.RIGHT_CONTROL, Keycode.LEFT_ARROW, Keycode.DOWN_ARROW, Keycode.RIGHT_ARROW
] # TODO: use a dictionary instead of a list so that unused buttons do not need placeholders.
keys_pressed = []
modifiers_pressed = []
report_array = [0x00] * 8
while True:
while matrix.events: # Run when there are events queued.
event = matrix.events.get()
key = keys_list[event.key_number]
if event.pressed:
if key >= 0xE0: # Check if modifier is pressed.
modifiers_pressed.append(key) # Add to modifiers_pressed list.
else: # Check if a key is pressed.
keys_pressed.append(key)
if event.released:
if key in keys_pressed:
keys_pressed.remove(key)
if key in modifiers_pressed:
modifiers_pressed.remove(key)
if len(keys_pressed) > 6: # Check for Rollover Error.
for i in range(2,8):
report_array[i] = 0x01 # Add Rollover Error keycode*6 to report.
else:
for i in modifiers_pressed:
report_array[0] |= Keycode.modifier_bit(i) # Add modifiers to report.
for i in range(6):
report_array[i+2] = keys_pressed[i] if i < len(keys_pressed) else 0 # Add keycode to report.
keeb.send_report(struct.pack("8B",*report_array))
report_array = [0x00] * 8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment