/ CircuitPython_IBM_XT_Keyboard_QTPy_RP2040 / code.py
code.py
1 # SPDX-FileCopyrightText: 2022 Jeff Epler for Adafruit Industries 2 # 3 # SPDX-License-Identifier: MIT 4 # IBM Keyboard to USB Adapter 5 import array 6 import board 7 import rp2pio 8 import usb_hid 9 from adafruit_hid.keyboard import Keyboard 10 from adafruit_hid.keycode import Keycode as K 11 import adafruit_pioasm 12 13 # from https://www.scs.stanford.edu/10wi-cs140/pintos/specs/kbd/scancodes-9.html 14 # translating from "Set 1" to USB using the adafruit_hid keycode names 15 # fmt: off 16 xt_keycodes = [ 17 None, K.ESCAPE, K.ONE, K.TWO, K.THREE, K.FOUR, K.FIVE, K.SIX, 18 K.SEVEN, K.EIGHT, K.NINE, K.ZERO, K.MINUS, K.EQUALS, K.BACKSPACE, K.TAB, K.Q, 19 K.W, K.E, K.R, K.T, K.Y, K.U, K.I, K.O, K.P, K.LEFT_BRACKET, K.RIGHT_BRACKET, 20 K.RETURN, K.LEFT_CONTROL, K.A, K.S, K.D, K.F, K.G, K.H, K.J, K.K, K.L, 21 K.SEMICOLON, K.QUOTE, K.GRAVE_ACCENT, K.SHIFT, K.BACKSLASH, K.Z, K.X, K.C, K.V, 22 K.B, K.N, K.M, K.COMMA, K.PERIOD, K.FORWARD_SLASH, K.RIGHT_SHIFT, 23 K.KEYPAD_ASTERISK, K.OPTION, K.SPACEBAR, K.CAPS_LOCK, K.F1, K.F2, K.F3, K.F4, 24 K.F5, K.F6, K.F7, K.F8, K.F9, K.F10, K.KEYPAD_NUMLOCK, K.SCROLL_LOCK, 25 K.KEYPAD_SEVEN, K.KEYPAD_EIGHT, K.KEYPAD_NINE, K.KEYPAD_MINUS, K.KEYPAD_FOUR, 26 K.KEYPAD_FIVE, K.KEYPAD_SIX, K.KEYPAD_PLUS, K.KEYPAD_ONE, K.KEYPAD_TWO, 27 K.KEYPAD_THREE, K.KEYPAD_ZERO, K.KEYPAD_PERIOD, None, None, None, K.F11, K.F12 28 ] 29 # fmt: on 30 31 program = adafruit_pioasm.Program(""" 32 wait 0 pin 2 33 in pins, 1 34 wait 1 pin 2 35 """, 36 build_debuginfo=True) 37 38 sm = rp2pio.StateMachine(program.assembled, 39 first_in_pin = board.MISO, 40 in_pin_count = 3, 41 pull_in_pin_up = 0b111, 42 auto_push=True, 43 push_threshold=10, 44 in_shift_right=True, 45 frequency=8_000_000, 46 **program.pio_kwargs) 47 48 buf = array.array('H', [0]) 49 50 print("Ready to type") 51 kbd = Keyboard(usb_hid.devices) 52 while True: 53 sm.readinto(buf, swap=False) 54 val = buf[0] 55 pressed = not val & 0x8000 56 key_number = (val >> 8) & 0x7f 57 if key_number > len(xt_keycodes): 58 print(f"invalid key number {key_number} pressed") 59 continue 60 keycode = xt_keycodes[key_number] 61 print(f"{keycode} {'PRESSED' if pressed else 'released'}") 62 if keycode is None: 63 continue 64 if pressed: 65 kbd.press(keycode) 66 else: 67 kbd.release(keycode)