Skip to content

Commit a75cadf

Browse files
committed
copy from device
1 parent dc0a0ca commit a75cadf

File tree

1 file changed

+143
-0
lines changed
  • CircuitPython_Tandy1000Keyboard_QTPy_RP2040

1 file changed

+143
-0
lines changed
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import time
2+
import digitalio
3+
import array
4+
import board
5+
import rp2pio
6+
import adafruit_pioasm
7+
from adafruit_hid.keyboard import Keyboard
8+
import usb_hid
9+
from adafruit_hid.keycode import Keycode as K
10+
11+
tandy1000_keycodes = [
12+
None, K.ESCAPE, K.ONE, K.TWO, K.THREE, K.FOUR, K.FIVE, K.SIX, K.SEVEN, K.EIGHT, K.NINE, K.ZERO, K.MINUS, K.EQUALS, K.BACKSPACE, K.TAB, K.Q, K.W, K.E, K.R, K.T, K.Y, K.U, K.I, K.O, K.P, K.LEFT_BRACKET, K.RIGHT_BRACKET, K.ENTER, K.LEFT_CONTROL, K.A, K.S, K.D, K.F, K.G, K.H, K.J, K.K, K.L, K.SEMICOLON, K.QUOTE, K.UP_ARROW, K.LEFT_SHIFT, K.LEFT_ARROW, K.Z, K.X, K.C, K.V, K.B, K.N, K.M, K.COMMA, K.PERIOD, K.FORWARD_SLASH, K.RIGHT_SHIFT, K.PRINT_SCREEN, K.LEFT_ALT, K.SPACE, K.CAPS_LOCK, K.F1, K.F2, K.F3, K.F4, K.F5, K.F6, K.F7, K.F8, K.F9, K.F10, K.KEYPAD_NUMLOCK, K.PAUSE, K.KEYPAD_SEVEN, K.KEYPAD_EIGHT, K.KEYPAD_NINE, K.DOWN_ARROW, K.KEYPAD_FOUR, K.KEYPAD_FIVE, K.KEYPAD_SIX, K.RIGHT_ARROW, K.KEYPAD_ONE, K.KEYPAD_TWO, K.KEYPAD_THREE, K.KEYPAD_ZERO, K.KEYPAD_MINUS, (K.LEFT_CONTROL, K.PAUSE), K.KEYPAD_PLUS, K.KEYPAD_PERIOD, K.KEYPAD_ENTER, K.HOME, K.F11, K.F12
13+
]
14+
15+
LOCK_KEYS = (K.CAPS_LOCK, K.KEYPAD_NUMLOCK)
16+
LOCK_STATE = {
17+
K.CAPS_LOCK: False,
18+
K.KEYPAD_NUMLOCK: False,
19+
}
20+
KEYPAD_NUMLOCK_LOOKUP = [
21+
{
22+
K.KEYPAD_PLUS: K.INSERT,
23+
K.KEYPAD_MINUS: K.DELETE,
24+
25+
K.KEYPAD_SEVEN: K.BACKSLASH,
26+
K.KEYPAD_EIGHT: (K.LEFT_SHIFT, K.GRAVE_ACCENT),
27+
K.KEYPAD_NINE: K.PAGE_UP,
28+
29+
K.KEYPAD_FOUR: (K.LEFT_SHIFT, K.BACKSLASH),
30+
#K.KEYPAD_FIVE:
31+
#K.KEYPAD_SIX:
32+
33+
K.KEYPAD_ONE: K.END,
34+
K.KEYPAD_TWO: K.GRAVE_ACCENT,
35+
K.KEYPAD_THREE: K.PAGE_DOWN,
36+
37+
K.KEYPAD_ZERO: K.ZERO,
38+
K.KEYPAD_PERIOD: K.PERIOD,
39+
},
40+
{
41+
K.KEYPAD_PLUS: (K.LEFT_SHIFT, K.EQUALS),
42+
K.KEYPAD_MINUS: K.MINUS,
43+
44+
K.KEYPAD_SEVEN: K.SEVEN,
45+
K.KEYPAD_EIGHT: K.EIGHT,
46+
K.KEYPAD_NINE: K.NINE,
47+
48+
K.KEYPAD_FOUR: K.FOUR,
49+
K.KEYPAD_FIVE: K.FIVE,
50+
K.KEYPAD_SIX: K.SIX,
51+
52+
K.KEYPAD_ONE: K.ONE,
53+
K.KEYPAD_TWO: K.TWO,
54+
K.KEYPAD_THREE: K.THREE,
55+
56+
K.KEYPAD_ZERO: K.ZERO,
57+
K.KEYPAD_PERIOD: K.PERIOD,
58+
}
59+
]
60+
61+
# D10 = blue = CN2 = RESET
62+
# D11 = white = CN1 = DATA
63+
# D12 = green = CN3 = CLOCK
64+
# D13 = yellow = CN4 = /BUSY
65+
66+
KBD_NRESET = board.D10
67+
KBD_DATA = board.D11
68+
KBD_CLOCK = board.D12
69+
KBD_NBUSY = board.D13
70+
71+
# Assert busy
72+
busy_out = digitalio.DigitalInOut(KBD_NBUSY)
73+
busy_out.switch_to_output(False, digitalio.DriveMode.OPEN_DRAIN)
74+
75+
# Reset the keyboard
76+
reset_out = digitalio.DigitalInOut(KBD_NRESET)
77+
reset_out.switch_to_output(False, digitalio.DriveMode.OPEN_DRAIN)
78+
time.sleep(.1)
79+
reset_out.value = True
80+
81+
program = adafruit_pioasm.Program("""
82+
wait 1 pin 1
83+
in pins, 1
84+
wait 0 pin 1
85+
""")
86+
87+
sm = rp2pio.StateMachine(program.assembled,
88+
first_in_pin = KBD_DATA,
89+
in_pin_count = 2,
90+
pull_in_pin_up = 0b11,
91+
auto_push=True,
92+
push_threshold=8,
93+
in_shift_right=True,
94+
frequency=8_000_000,
95+
**program.pio_kwargs)
96+
97+
buf = array.array('B', [0])
98+
99+
MASK_LEFT_SHIFT = K.modifier_bit(K.LEFT_SHIFT)
100+
MASK_RIGHT_SHIFT = K.modifier_bit(K.RIGHT_SHIFT)
101+
MASK_ANY_SHIFT = (MASK_LEFT_SHIFT | MASK_RIGHT_SHIFT)
102+
103+
# Now ready to get keystrokes
104+
kbd = Keyboard(usb_hid.devices)
105+
busy_out.value = True
106+
while True:
107+
sm.readinto(buf, swap=False)
108+
val = buf[0]
109+
pressed = not (val & 0x80)
110+
key_number = val & 0x7f
111+
112+
keycode = tandy1000_keycodes[key_number]
113+
if keycode is None:
114+
continue
115+
keycode = KEYPAD_NUMLOCK_LOOKUP[LOCK_STATE[K.KEYPAD_NUMLOCK]].get(keycode, keycode)
116+
if pressed:
117+
if keycode in LOCK_KEYS:
118+
LOCK_STATE[keycode] = True
119+
elif LOCK_STATE[K.CAPS_LOCK] and K.A <= keycode <= K.Z:
120+
old_report_modifier = kbd.report_modifier[0]
121+
kbd.report_modifier[0] = (old_report_modifier & ~MASK_RIGHT_SHIFT) ^ MASK_LEFT_SHIFT
122+
kbd.press(keycode)
123+
kbd.release_all()
124+
kbd.report_modifier[0] = old_report_modifier
125+
continue
126+
elif isinstance(keycode, tuple):
127+
old_report_modifier = kbd.report_modifier[0]
128+
kbd.report_modifier[0] = 0
129+
kbd.press(*keycode)
130+
kbd.release_all()
131+
kbd.report_modifier[0] = old_report_modifier
132+
else:
133+
kbd.press(keycode)
134+
135+
else:
136+
if keycode in LOCK_KEYS:
137+
LOCK_STATE[keycode] = False
138+
elif isinstance(keycode, tuple):
139+
pass
140+
else:
141+
kbd.release(keycode)
142+
143+
print(kbd.report)

0 commit comments

Comments
 (0)