Skip to content

Commit 090f330

Browse files
Added support for Cardputer keyboard input.
1 parent 5836f11 commit 090f330

File tree

8 files changed

+438
-3
lines changed

8 files changed

+438
-3
lines changed

ports/espressif/boards/m5stack_cardputer/board.c

Lines changed: 159 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/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"
3542

3643
fourwire_fourwire_obj_t board_display_obj;
44+
keypad_demux_demuxkeymatrix_obj_t board_keyboard;
45+
46+
void update_keyboard(void);
47+
void queue_key(char c);
48+
void queue_seq(const char *seq);
49+
50+
const mcu_pin_obj_t *row_addr_pins[] = {
51+
&pin_GPIO8,
52+
&pin_GPIO9,
53+
&pin_GPIO11,
54+
};
55+
56+
const mcu_pin_obj_t *column_pins[] = {
57+
&pin_GPIO13,
58+
&pin_GPIO15,
59+
&pin_GPIO3,
60+
&pin_GPIO4,
61+
&pin_GPIO5,
62+
&pin_GPIO6,
63+
&pin_GPIO7
64+
};
65+
66+
keypad_event_obj_t event;
67+
68+
char keystate[56];
69+
char keyqueue[16];
70+
int keyqueue_head = 0;
71+
int keyqueue_tail = 0;
3772

3873
#define DELAY 0x80
3974

@@ -106,8 +141,132 @@ void board_init(void) {
106141
false, // SH1107_addressing
107142
350 // backlight pwm frequency
108143
);
144+
//void common_hal_keypad_demux_demuxkeymatrix_construct(
145+
// keypad_demux_demuxkeymatrix_obj_t *self,
146+
// mp_uint_t num_row_addr_pins,
147+
// const mcu_pin_obj_t *row_addr_pins[],
148+
// mp_uint_t num_column_pins,
149+
// const mcu_pin_obj_t *column_pins[],
150+
// mp_float_t interval,
151+
// size_t max_events,
152+
// uint8_t debounce_threshold) {
153+
}
154+
155+
void board_serial_init() {
156+
common_hal_keypad_demux_demuxkeymatrix_construct(
157+
&board_keyboard, // self
158+
3, // num_row_addr_pins
159+
row_addr_pins, // row_addr_pins
160+
7, // num_column_pins
161+
column_pins, // column_pins
162+
0.01f, // interval
163+
20, // max_events
164+
2 // debounce_threshold
165+
);
166+
demuxkeymatrix_never_reset(&board_keyboard);
167+
}
168+
169+
bool board_serial_connected() {
170+
return true;
171+
}
172+
173+
bool board_serial_bytes_available() {
174+
update_keyboard();
175+
if (keyqueue_head != keyqueue_tail) {
176+
return true;
177+
} else {
178+
return false;
179+
}
109180
}
110181

182+
void queue_key(char c) {
183+
if ((keyqueue_head + 1) % 16 != keyqueue_tail) {
184+
keyqueue[keyqueue_head] = c;
185+
keyqueue_head = (keyqueue_head + 1) % 16;
186+
}
187+
}
188+
189+
void queue_seq(const char *seq) {
190+
while (*seq) {
191+
queue_key(*seq++);
192+
}
193+
}
194+
195+
void update_keyboard() {
196+
char ascii = 0;
197+
198+
if (common_hal_keypad_eventqueue_get_length(board_keyboard.events) == 0) {
199+
return;
200+
}
201+
202+
//mp_printf(&mp_plat_print, "NextScan:%d\n", board_keyboard.next_scan_ticks);
203+
while (common_hal_keypad_eventqueue_get_into(board_keyboard.events, &event)) {
204+
//mp_printf(&mp_plat_print, "Got Event: %d %d\n", event.key_number, event.pressed);
205+
if (event.pressed) {
206+
keystate[event.key_number] = 1;
207+
208+
if (keystate[KEY_CTRL]) {
209+
if (keystate[KEY_ALT] && keystate[KEY_BACKSPACE]) {
210+
reload_initiate(RUN_REASON_REPL_RELOAD);
211+
}
212+
ascii = keymap[event.key_number];
213+
if (ascii >= 'a' && ascii <= 'z') {
214+
ascii -= 'a' - 1;
215+
}
216+
//if (ascii == 3) {
217+
// // Ctrl-C
218+
// mp_sched_keyboard_interrupt();
219+
//}
220+
} else if (keystate[KEY_SHIFT]) {
221+
ascii = keymap_shifted[event.key_number];
222+
} else if (keystate[KEY_FN] && event.key_number != KEY_FN) {
223+
switch (event.key_number | FN_MOD) {
224+
case KEY_DOWN:
225+
queue_seq("\e[B");
226+
break;
227+
case KEY_UP:
228+
queue_seq("\e[A");
229+
break;
230+
case KEY_DELETE:
231+
queue_seq("\e[3~");
232+
break;
233+
case KEY_LEFT:
234+
queue_seq("\e[D");
235+
break;
236+
case KEY_RIGHT:
237+
queue_seq("\e[C");
238+
break;
239+
case KEY_ESC:
240+
queue_key('\e');
241+
break;
242+
}
243+
} else {
244+
ascii = keymap[event.key_number];
245+
}
246+
247+
if (ascii > 0) {
248+
if (keystate[KEY_ALT]) {
249+
queue_key('\e');
250+
}
251+
queue_key(ascii);
252+
}
253+
254+
} else {
255+
keystate[event.key_number] = 0;
256+
}
257+
}
258+
}
259+
260+
char board_serial_read() {
261+
update_keyboard();
262+
if (keyqueue_head != keyqueue_tail) {
263+
char c = keyqueue[keyqueue_tail];
264+
keyqueue_tail = (keyqueue_tail + 1) % 16;
265+
return c;
266+
} else {
267+
return -1;
268+
}
269+
}
111270

112271
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
113272

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+
'\x7F',// 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+
};

0 commit comments

Comments
 (0)