Skip to content

Commit c0bbe26

Browse files
authored
Merge pull request #9145 from joshua-beck-0908/main
Added support for Cardputer keyboard input.
2 parents c6d42af + 8632701 commit c0bbe26

File tree

11 files changed

+428
-5
lines changed

11 files changed

+428
-5
lines changed

ports/espressif/boards/m5stack_cardputer/board.c

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,51 @@
2424
* THE SOFTWARE.
2525
*/
2626

27+
#include "keymap.h"
2728
#include "supervisor/board.h"
29+
#include "supervisor/shared/serial.h"
2830
#include "mpconfigboard.h"
2931
#include "shared-bindings/busio/SPI.h"
3032
#include "shared-bindings/fourwire/FourWire.h"
3133
#include "shared-bindings/microcontroller/Pin.h"
3234
#include "shared-module/displayio/__init__.h"
3335
#include "shared-module/displayio/mipi_constants.h"
3436
#include "shared-bindings/board/__init__.h"
37+
#include "shared-bindings/keypad_demux/DemuxKeyMatrix.h"
38+
#include "shared-bindings/keypad/EventQueue.h"
39+
#include "shared-bindings/keypad/Event.h"
40+
#include "supervisor/shared/reload.h"
41+
#include "py/runtime.h"
42+
#include "py/ringbuf.h"
43+
#include "shared/runtime/interrupt_char.h"
3544

3645
fourwire_fourwire_obj_t board_display_obj;
46+
keypad_demux_demuxkeymatrix_obj_t board_keyboard;
47+
48+
void update_keyboard(keypad_eventqueue_obj_t *queue);
49+
void keyboard_seq(const char *seq);
50+
51+
const mcu_pin_obj_t *row_addr_pins[] = {
52+
&pin_GPIO8,
53+
&pin_GPIO9,
54+
&pin_GPIO11,
55+
};
56+
57+
const mcu_pin_obj_t *column_pins[] = {
58+
&pin_GPIO13,
59+
&pin_GPIO15,
60+
&pin_GPIO3,
61+
&pin_GPIO4,
62+
&pin_GPIO5,
63+
&pin_GPIO6,
64+
&pin_GPIO7
65+
};
66+
67+
keypad_event_obj_t event;
68+
69+
char keystate[56];
70+
ringbuf_t keyqueue;
71+
char keybuf[32];
3772

3873
#define DELAY 0x80
3974

@@ -108,6 +143,105 @@ void board_init(void) {
108143
);
109144
}
110145

146+
void board_serial_init() {
147+
ringbuf_init(&keyqueue, (uint8_t *)keybuf, sizeof(keybuf));
148+
common_hal_keypad_demux_demuxkeymatrix_construct(
149+
&board_keyboard, // self
150+
3, // num_row_addr_pins
151+
row_addr_pins, // row_addr_pins
152+
7, // num_column_pins
153+
column_pins, // column_pins
154+
0.01f, // interval
155+
20, // max_events
156+
2 // debounce_threshold
157+
);
158+
demuxkeymatrix_never_reset(&board_keyboard);
159+
common_hal_keypad_eventqueue_set_event_handler(board_keyboard.events, update_keyboard);
160+
161+
}
162+
163+
bool board_serial_connected() {
164+
return true;
165+
}
166+
167+
uint32_t board_serial_bytes_available() {
168+
return ringbuf_num_filled(&keyqueue);
169+
}
170+
171+
void keyboard_seq(const char *seq) {
172+
while (*seq) {
173+
ringbuf_put(&keyqueue, *seq++);
174+
}
175+
}
176+
177+
void update_keyboard(keypad_eventqueue_obj_t *queue) {
178+
uint8_t ascii = 0;
179+
180+
if (common_hal_keypad_eventqueue_get_length(queue) == 0) {
181+
return;
182+
}
183+
184+
while (common_hal_keypad_eventqueue_get_into(queue, &event)) {
185+
if (event.pressed) {
186+
keystate[event.key_number] = 1;
187+
188+
if (keystate[KEY_CTRL]) {
189+
if (keystate[KEY_ALT] && keystate[KEY_BACKSPACE]) {
190+
reload_initiate(RUN_REASON_REPL_RELOAD);
191+
}
192+
ascii = keymap[event.key_number];
193+
if (ascii >= 'a' && ascii <= 'z') {
194+
ascii -= 'a' - 1;
195+
}
196+
197+
if (ascii == mp_interrupt_char) {
198+
mp_sched_keyboard_interrupt();
199+
}
200+
} else if (keystate[KEY_SHIFT]) {
201+
ascii = keymap_shifted[event.key_number];
202+
} else if (keystate[KEY_FN] && event.key_number != KEY_FN) {
203+
switch (event.key_number | FN_MOD) {
204+
case KEY_DOWN:
205+
keyboard_seq("\e[B");
206+
break;
207+
case KEY_UP:
208+
keyboard_seq("\e[A");
209+
break;
210+
case KEY_DELETE:
211+
keyboard_seq("\e[3~");
212+
break;
213+
case KEY_LEFT:
214+
keyboard_seq("\e[D");
215+
break;
216+
case KEY_RIGHT:
217+
keyboard_seq("\e[C");
218+
break;
219+
case KEY_ESC:
220+
ringbuf_put(&keyqueue, '\e');
221+
break;
222+
}
223+
} else {
224+
ascii = keymap[event.key_number];
225+
}
226+
227+
if (ascii > 0) {
228+
if (keystate[KEY_ALT]) {
229+
ringbuf_put(&keyqueue, '\e');
230+
} else if (keystate[KEY_OPT]) {
231+
ringbuf_put(&keyqueue, '\x10');
232+
}
233+
ringbuf_put(&keyqueue, ascii);
234+
}
235+
236+
} else {
237+
keystate[event.key_number] = 0;
238+
}
239+
}
240+
}
241+
242+
char board_serial_read() {
243+
return ringbuf_get(&keyqueue);
244+
}
111245

112246
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
113247

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
#define SHIFT_MOD 0x40
2+
#define FN_MOD 0x80
3+
4+
#define KEY_OPT 0
5+
#define KEY_Z 1
6+
#define KEY_C 2
7+
#define KEY_B 3
8+
#define KEY_M 4
9+
#define KEY_DOT 5
10+
#define KEY_SPACE 6
11+
#define KEY_SHIFT 7
12+
#define KEY_S 8
13+
#define KEY_F 9
14+
#define KEY_H 10
15+
#define KEY_K 11
16+
#define KEY_SEMICOLON 12
17+
#define KEY_ENTER 13
18+
#define KEY_Q 14
19+
#define KEY_E 15
20+
#define KEY_T 16
21+
#define KEY_U 17
22+
#define KEY_O 18
23+
#define KEY_LEFT_BRACKET 19
24+
#define KEY_BACKSLASH 20
25+
#define KEY_1 21
26+
#define KEY_3 22
27+
#define KEY_5 23
28+
#define KEY_7 24
29+
#define KEY_9 25
30+
#define KEY_UNDERSCORE 26
31+
#define KEY_BACKSPACE 27
32+
#define KEY_CTRL 28
33+
#define KEY_ALT 29
34+
#define KEY_X 30
35+
#define KEY_V 31
36+
#define KEY_N 32
37+
#define KEY_COMMA 33
38+
#define KEY_SLASH 34
39+
#define KEY_FN 35
40+
#define KEY_A 36
41+
#define KEY_D 37
42+
#define KEY_G 38
43+
#define KEY_J 39
44+
#define KEY_L 40
45+
#define KEY_APOSTROPHE 41
46+
#define KEY_TAB 42
47+
#define KEY_W 43
48+
#define KEY_R 44
49+
#define KEY_Y 45
50+
#define KEY_I 46
51+
#define KEY_P 47
52+
#define KEY_RIGHT_BRACKET 48
53+
#define KEY_GRAVE 49
54+
#define KEY_2 50
55+
#define KEY_4 51
56+
#define KEY_6 52
57+
#define KEY_8 53
58+
#define KEY_0 54
59+
#define KEY_EQUALS 55
60+
61+
#define KEY_GREATER (5 | SHIFT_MOD)
62+
#define KEY_COLON (12 | SHIFT_MOD)
63+
#define KEY_LEFT_CURLY_BRACKET (19 | SHIFT_MOD)
64+
#define KEY_PIPE (20 | SHIFT_MOD)
65+
#define KEY_EXCLAMATION (21 | SHIFT_MOD)
66+
#define KEY_HASH (22 | SHIFT_MOD)
67+
#define KEY_PERCENT (23 | SHIFT_MOD)
68+
#define KEY_AMPERSAND (24 | SHIFT_MOD)
69+
#define KEY_OPEN_PARENTHESIS (25 | SHIFT_MOD)
70+
#define KEY_MINUS (26 | SHIFT_MOD)
71+
#define KEY_LESS (33 | SHIFT_MOD)
72+
#define KEY_QUESTION (34 | SHIFT_MOD)
73+
#define KEY_DOUBLE_QUOTE (41 | SHIFT_MOD)
74+
#define KEY_RIGHT_CURLY_BRACKET (48 | SHIFT_MOD)
75+
#define KEY_TILDE (49 | SHIFT_MOD)
76+
#define KEY_AT (50 | SHIFT_MOD)
77+
#define KEY_DOLLAR (51 | SHIFT_MOD)
78+
#define KEY_CARET (52 | SHIFT_MOD)
79+
#define KEY_ASTERISK (53 | SHIFT_MOD)
80+
#define KEY_CLOSE_PARENTHESIS (54 | SHIFT_MOD)
81+
#define KEY_PLUS (55 | SHIFT_MOD)
82+
83+
#define KEY_DOWN (5 | FN_MOD)
84+
#define KEY_UP (12 | FN_MOD)
85+
#define KEY_DELETE (27 | FN_MOD)
86+
#define KEY_LEFT (33 | FN_MOD)
87+
#define KEY_RIGHT (34 | FN_MOD)
88+
#define KEY_ESC (49 | FN_MOD)
89+
90+
int keymap[56] = {
91+
0, // KEY_OPT
92+
'z', // KEY_Z
93+
'c', // KEY_C
94+
'b', // KEY_B
95+
'm', // KEY_M
96+
'.', // KEY_DOT
97+
' ', // KEY_SPACE
98+
0, // KEY_SHIFT
99+
's', // KEY_S
100+
'f', // KEY_F
101+
'h', // KEY_H
102+
'k', // KEY_K
103+
';', // KEY_SEMICOLON
104+
'\r',// KEY_ENTER
105+
'q', // KEY_Q
106+
'e', // KEY_E
107+
't', // KEY_T
108+
'u', // KEY_U
109+
'o', // KEY_O
110+
'[', // KEY_LEFT_BRACKET
111+
'\\',// KEY_BACKSLASH
112+
'1', // KEY_1
113+
'3', // KEY_3
114+
'5', // KEY_5
115+
'7', // KEY_7
116+
'9', // KEY_9
117+
'_', // KEY_UNDERSCORE
118+
'\b',// KEY_BACKSPACE
119+
0, // KEY_CTRL
120+
0, // KEY_ALT
121+
'x', // KEY_X
122+
'v', // KEY_V
123+
'n', // KEY_N
124+
',', // KEY_COMMA
125+
'/', // KEY_SLASH
126+
0, // KEY_FN
127+
'a', // KEY_A
128+
'd', // KEY_D
129+
'g', // KEY_G
130+
'j', // KEY_J
131+
'l', // KEY_L
132+
'\'',// KEY_APOSTROPHE
133+
'\t',// KEY_TAB
134+
'w', // KEY_W
135+
'r', // KEY_R
136+
'y', // KEY_Y
137+
'i', // KEY_I
138+
'p', // KEY_P
139+
']', // KEY_RIGHT_BRACKET
140+
'`', // KEY_GRAVE
141+
'2', // KEY_2
142+
'4', // KEY_4
143+
'6', // KEY_6
144+
'8', // KEY_8
145+
'0', // KEY_0
146+
'=' // KEY_EQUALS
147+
};
148+
149+
int keymap_shifted[56] = {
150+
0, // KEY_OPT
151+
'Z', // KEY_Z
152+
'C', // KEY_C
153+
'B', // KEY_B
154+
'M', // KEY_M
155+
'>', // KEY_DOT -> '>'
156+
' ', // KEY_SPACE
157+
0, // KEY_SHIFT
158+
'S', // KEY_S
159+
'F', // KEY_F
160+
'H', // KEY_H
161+
'K', // KEY_K
162+
':', // KEY_SEMICOLON -> ':'
163+
'\r',// KEY_ENTER
164+
'Q', // KEY_Q
165+
'E', // KEY_E
166+
'T', // KEY_T
167+
'U', // KEY_U
168+
'O', // KEY_O
169+
'{', // KEY_LEFT_BRACKET -> '{'
170+
'|', // KEY_BACKSLASH -> '|'
171+
'!', // KEY_1 -> '!'
172+
'#', // KEY_3 -> '#'
173+
'%', // KEY_5 -> '%'
174+
'&', // KEY_7 -> '&'
175+
'(', // KEY_9 -> '('
176+
'-', // KEY_UNDERSCORE -> '-'
177+
'\b',// KEY_BACKSPACE
178+
0, // KEY_CTRL
179+
0, // KEY_ALT
180+
'X', // KEY_X
181+
'V', // KEY_V
182+
'N', // KEY_N
183+
'<', // KEY_COMMA -> '<'
184+
'?', // KEY_SLASH -> '?'
185+
0, // KEY_FN
186+
'A', // KEY_A
187+
'D', // KEY_D
188+
'G', // KEY_G
189+
'J', // KEY_J
190+
'L', // KEY_L
191+
'"', // KEY_APOSTROPHE -> '"'
192+
'\t',// KEY_TAB
193+
'W', // KEY_W
194+
'R', // KEY_R
195+
'Y', // KEY_Y
196+
'I', // KEY_I
197+
'P', // KEY_P
198+
'}', // KEY_RIGHT_BRACKET -> '}'
199+
'~', // KEY_GRAVE -> '~'
200+
'@', // KEY_2 -> '@'
201+
'$', // KEY_4 -> '$'
202+
'^', // KEY_6 -> '^'
203+
'*', // KEY_8 -> '*'
204+
')', // KEY_0 -> ')'
205+
'+' // KEY_EQUALS -> '+'
206+
};

shared-bindings/keypad/EventQueue.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,6 @@ bool common_hal_keypad_eventqueue_get_into(keypad_eventqueue_obj_t *self, keypad
4242
bool common_hal_keypad_eventqueue_get_overflowed(keypad_eventqueue_obj_t *self);
4343
void common_hal_keypad_eventqueue_set_overflowed(keypad_eventqueue_obj_t *self, bool overflowed);
4444

45+
void common_hal_keypad_eventqueue_set_event_handler(keypad_eventqueue_obj_t *self, void (*event_handler)(keypad_eventqueue_obj_t *));
46+
4547
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_KEYPAD_EVENTQUEUE_H

0 commit comments

Comments
 (0)