Skip to content

Commit 8b0d00a

Browse files
committed
first commit code and keymap config file
1 parent b0430b2 commit 8b0d00a

File tree

2 files changed

+308
-0
lines changed

2 files changed

+308
-0
lines changed

Split_Ortho_Keyboard/code.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2022 John Park & Tod Kurt for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
# Ortho split keyboard
5+
import time
6+
import board
7+
from adafruit_tca8418 import TCA8418
8+
import usb_hid
9+
from adafruit_hid.keyboard import Keyboard
10+
from adafruit_hid.keycode import Keycode
11+
from keymaps import layer_keymaps # keymaps are saved in keymaps.py file
12+
13+
kbd = Keyboard(usb_hid.devices)
14+
num_layers = len(layer_keymaps)
15+
current_layer = 1
16+
17+
i2c_left = board.STEMMA_I2C() # uses QT Py RP2040 STEMMA QT port
18+
i2c_right = board.I2C() # I2C channel on the QT Py RP2040 pads broken out on board
19+
tca_left = TCA8418(i2c_left)
20+
tca_right = TCA8418(i2c_right)
21+
22+
tcas = (tca_left, tca_right) # put the TCA objects in a list for easy iteration later
23+
24+
# set up a R0-R7 pins and C0-C4 pins as keypads
25+
KEYPADPINS = (
26+
TCA8418.R0, TCA8418.R1, TCA8418.R2, TCA8418.R3, TCA8418.R4,
27+
TCA8418.C0, TCA8418.C1, TCA8418.C2, TCA8418.C3, TCA8418.C4, TCA8418.C5
28+
)
29+
30+
for tca in tcas:
31+
for pin in KEYPADPINS:
32+
tca.keypad_mode[pin] = True
33+
tca.enable_int[pin] = True
34+
tca.event_mode_fifo[pin] = True
35+
tca.key_intenable = True
36+
37+
print("Ortho Split Keyboard")
38+
39+
40+
while True:
41+
for i in range(len(tcas)):
42+
tca = tcas[i] # get the TCA we're working with
43+
keymap = layer_keymaps[current_layer][i] # get the corresponding keymap for it
44+
if tca.key_int:
45+
events = tca.events_count
46+
for _ in range(events):
47+
keyevent = tca.next_event
48+
keymap_number = (keyevent & 0x7F)
49+
(modifier, keycode) = keymap[keymap_number] # get keycode & modifer from keymap
50+
# print("\tKey event: 0x%02X - key #%d " % (keyevent, keyevent & 0x7F))
51+
if keycode is None:
52+
pass
53+
54+
else:
55+
if keyevent & 0x80: # if key is pressed
56+
if modifier == 0: # normal keypress
57+
kbd.press(keycode)
58+
elif modifier == 1: # lower
59+
current_layer = min(max((current_layer-1), 0), num_layers-1)
60+
elif modifier == 2: # raise
61+
current_layer = min(max((current_layer+1), 0), num_layers-1)
62+
elif modifier == 7: # cap mod
63+
kbd.press(Keycode.SHIFT, keycode)
64+
65+
else: # key released
66+
if modifier == 7: # capped shifted key requires special handling
67+
kbd.release(Keycode.SHIFT, keycode)
68+
else:
69+
kbd.release(keycode)
70+
71+
tca.key_int = True # clear the IRQ by writing 1 to it
72+
time.sleep(0.01)

Split_Ortho_Keyboard/keymaps.py

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2022 John Park & Tod Kurt for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
from adafruit_hid.keycode import Keycode
5+
# https://docs.circuitpython.org/projects/hid/en/latest/api.html#adafruit-hid-keycode-keycode
6+
# keymap is keynumber, (modifier, keycode)
7+
# lower keymap layer
8+
km_lf_0 = {
9+
(1) : (0, Keycode.F11),
10+
(2) : (0, Keycode.F1),
11+
(3) : (0, Keycode.F2),
12+
(4) : (0, Keycode.F3),
13+
(5) : (0, Keycode.F4),
14+
(6) : (0, Keycode.F5),
15+
16+
(11) : (0, None),
17+
(12) : (0, None),
18+
(13) : (0, None),
19+
(14) : (0, None),
20+
(15) : (0, None),
21+
(16) : (0, None),
22+
23+
(21) : (0, None),
24+
(22) : (0, None),
25+
(23) : (0, None),
26+
(24) : (0, None),
27+
(25) : (0, None),
28+
(26) : (0, None),
29+
30+
(31) : (0, None),
31+
(32) : (0, None),
32+
(33) : (0, None),
33+
(34) : (0, None),
34+
(35) : (0, None),
35+
(36) : (0, None),
36+
37+
(41) : (0, Keycode.CONTROL),
38+
(42) : (0, Keycode.GUI),
39+
(43) : (0, Keycode.ALT),
40+
(44) : (0, Keycode.GUI),
41+
(45) : (1, Keycode.L), # lower (the keycode doesn't matter here, it's never typed)
42+
(46) : (0, Keycode.SPACE)
43+
}
44+
45+
km_rt_0 = {
46+
(1) : (0, Keycode.F6),
47+
(2) : (0, Keycode.F7),
48+
(3) : (0, Keycode.F8),
49+
(4) : (0, Keycode.F9),
50+
(5) : (0, Keycode.F10),
51+
(6) : (0, Keycode.F12),
52+
53+
(11) : (0, Keycode.HOME),
54+
(12) : (0, Keycode.PAGE_DOWN),
55+
(13) : (0, Keycode.PAGE_UP),
56+
(14) : (0, Keycode.END),
57+
(15) : (0, Keycode.INSERT),
58+
(16) : (0, Keycode.DELETE),
59+
60+
(21) : (0, None),
61+
(22) : (0, None),
62+
(23) : (0, None),
63+
(24) : (0, None),
64+
(25) : (0, None),
65+
(26) : (0, None),
66+
67+
(31) : (0, None),
68+
(32) : (0, None),
69+
(33) : (0, None),
70+
(34) : (0, None),
71+
(35) : (0, None),
72+
(36) : (0, None),
73+
74+
(41) : (0, Keycode.SPACE),
75+
(42) : (2, Keycode.R), # raise
76+
(43) : (0, Keycode.LEFT_ARROW),
77+
(44) : (0, Keycode.DOWN_ARROW),
78+
(45) : (0, Keycode.UP_ARROW),
79+
(46) : (0, Keycode.RIGHT_ARROW)
80+
}
81+
82+
# main keymap layer
83+
km_lf_1 = {
84+
(1) : (0, Keycode.GRAVE_ACCENT),
85+
(2) : (0, Keycode.ONE),
86+
(3) : (0, Keycode.TWO),
87+
(4) : (0, Keycode.THREE),
88+
(5) : (0, Keycode.FOUR),
89+
(6) : (0, Keycode.FIVE),
90+
91+
(11) : (0, Keycode.ESCAPE),
92+
(12) : (0, Keycode.Q),
93+
(13) : (0, Keycode.W),
94+
(14) : (0, Keycode.E),
95+
(15) : (0, Keycode.R),
96+
(16) : (0, Keycode.T),
97+
98+
(21) : (0, Keycode.TAB),
99+
(22) : (0, Keycode.A),
100+
(23) : (0, Keycode.S),
101+
(24) : (0, Keycode.D),
102+
(25) : (0, Keycode.F),
103+
(26) : (0, Keycode.G),
104+
105+
(31) : (0, Keycode.SHIFT),
106+
(32) : (0, Keycode.Z),
107+
(33) : (0, Keycode.X),
108+
(34) : (0, Keycode.C),
109+
(35) : (0, Keycode.V),
110+
(36) : (0, Keycode.B),
111+
112+
(41) : (0, Keycode.CONTROL),
113+
(42) : (0, Keycode.GUI),
114+
(43) : (0, Keycode.ALT),
115+
(44) : (0, Keycode.GUI),
116+
(45) : (1, Keycode.L), # lower
117+
(46) : (0, Keycode.SPACE)
118+
}
119+
120+
km_rt_1 = {
121+
(1) : (0, Keycode.SIX),
122+
(2) : (0, Keycode.SEVEN),
123+
(3) : (0, Keycode.EIGHT),
124+
(4) : (0, Keycode.NINE),
125+
(5) : (0, Keycode.ZERO),
126+
(6) : (0, Keycode.BACKSPACE),
127+
128+
(11) : (0, Keycode.Y),
129+
(12) : (0, Keycode.U),
130+
(13) : (0, Keycode.I),
131+
(14) : (0, Keycode.O),
132+
(15) : (0, Keycode.P),
133+
(16) : (0, Keycode.BACKSLASH),
134+
135+
(21) : (0, Keycode.H),
136+
(22) : (0, Keycode.J),
137+
(23) : (0, Keycode.K),
138+
(24) : (0, Keycode.L),
139+
(25) : (0, Keycode.SEMICOLON),
140+
(26) : (0, Keycode.QUOTE),
141+
142+
(31) : (0, Keycode.N),
143+
(32) : (0, Keycode.M),
144+
(33) : (0, Keycode.COMMA),
145+
(34) : (0, Keycode.PERIOD),
146+
(35) : (0, Keycode.FORWARD_SLASH),
147+
(36) : (0, Keycode.ENTER),
148+
149+
(41) : (0, Keycode.SPACE),
150+
(42) : (2, Keycode.R), # raise
151+
(43) : (0, Keycode.LEFT_ARROW),
152+
(44) : (0, Keycode.DOWN_ARROW),
153+
(45) : (0, Keycode.UP_ARROW),
154+
(46) : (0, Keycode.RIGHT_ARROW)
155+
}
156+
157+
# upper keymap layer
158+
km_lf_2 = {
159+
(1) : (0, None),
160+
(2) : (0, None),
161+
(3) : (0, None),
162+
(4) : (0, None),
163+
(5) : (0, None),
164+
(6) : (0, None),
165+
166+
(11) : (0, Keycode.ESCAPE),
167+
(12) : (0, None),
168+
(13) : (0, None),
169+
(14) : (0, None),
170+
(15) : (0, None),
171+
(16) : (0, None),
172+
173+
(21) : (0, Keycode.TAB),
174+
(22) : (0, None),
175+
(23) : (0, None),
176+
(24) : (0, Keycode.MINUS),
177+
(25) : (0, Keycode.EQUALS),
178+
(26) : (7, Keycode.BACKSLASH), # PIPE '|'
179+
180+
(31) : (0, Keycode.SHIFT),
181+
(32) : (0, None),
182+
(33) : (0, None),
183+
(34) : (7, Keycode.MINUS), # UNDERSCORE
184+
(35) : (0, Keycode.KEYPAD_PLUS),
185+
(36) : (0, Keycode.BACKSLASH),
186+
187+
(41) : (0, Keycode.CONTROL),
188+
(42) : (0, Keycode.GUI),
189+
(43) : (0, Keycode.ALT),
190+
(44) : (0, Keycode.GUI),
191+
(45) : (1, Keycode.L), # lower
192+
(46) : (0, Keycode.SPACE)
193+
}
194+
195+
km_rt_2 = {
196+
(1) : (0, None),
197+
(2) : (0, None),
198+
(3) : (0, None),
199+
(4) : (0, None),
200+
(5) : (0, None),
201+
(6) : (0, Keycode.BACKSPACE),
202+
203+
(11) : (0, None),
204+
(12) : (0, None),
205+
(13) : (0, None),
206+
(14) : (0, None),
207+
(15) : (0, None),
208+
(16) : (0, Keycode.BACKSLASH),
209+
210+
(21) : (0, None),
211+
(22) : (0, Keycode.LEFT_BRACKET),
212+
(23) : (0, Keycode.RIGHT_BRACKET),
213+
(24) : (0, None),
214+
(25) : (0, None),
215+
(26) : (0, Keycode.QUOTE),
216+
217+
(31) : (0, None),
218+
(32) : (7, Keycode.LEFT_BRACKET),
219+
(33) : (7, Keycode.RIGHT_BRACKET),
220+
(34) : (0, None),
221+
(35) : (0, None),
222+
(36) : (0, Keycode.ENTER),
223+
224+
(41) : (0, Keycode.SPACE),
225+
(42) : (2, Keycode.R), # raise
226+
(43) : (0, Keycode.LEFT_ARROW),
227+
(44) : (0, Keycode.DOWN_ARROW),
228+
(45) : (0, Keycode.UP_ARROW),
229+
(46) : (0, Keycode.RIGHT_ARROW)
230+
}
231+
232+
# put the keymaps in layer lists for easy iteration later
233+
keymaps_1 = (km_lf_0, km_rt_0)
234+
keymaps_2 = (km_lf_1, km_rt_1)
235+
keymaps_3 = (km_lf_2, km_rt_2)
236+
layer_keymaps = (keymaps_1, keymaps_2, keymaps_3)

0 commit comments

Comments
 (0)