Skip to content

Commit eb2054b

Browse files
authored
Merge pull request #9529 from konstantint/m5stack-cardputer-keyboard-fix
M5Stack Cardputer keyboard handling improvements.
2 parents 3d93006 + 4fb31c4 commit eb2054b

File tree

5 files changed

+244
-137
lines changed

5 files changed

+244
-137
lines changed

ports/espressif/boards/m5stack_cardputer/board.c

Lines changed: 2 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,19 @@
44
//
55
// SPDX-License-Identifier: MIT
66

7-
#include "keymap.h"
7+
#include "mpconfigboard.h"
88
#include "supervisor/board.h"
99
#include "supervisor/shared/serial.h"
10-
#include "mpconfigboard.h"
1110
#include "shared-bindings/busio/SPI.h"
1211
#include "shared-bindings/fourwire/FourWire.h"
1312
#include "shared-bindings/microcontroller/Pin.h"
1413
#include "shared-module/displayio/__init__.h"
1514
#include "shared-module/displayio/mipi_constants.h"
1615
#include "shared-bindings/board/__init__.h"
17-
#include "shared-bindings/keypad_demux/DemuxKeyMatrix.h"
18-
#include "shared-bindings/keypad/EventQueue.h"
19-
#include "shared-bindings/keypad/Event.h"
20-
#include "supervisor/shared/reload.h"
2116
#include "py/runtime.h"
2217
#include "py/ringbuf.h"
2318
#include "shared/runtime/interrupt_char.h"
2419

25-
keypad_demux_demuxkeymatrix_obj_t board_keyboard;
26-
27-
void update_keyboard(keypad_eventqueue_obj_t *queue);
28-
void keyboard_seq(const char *seq);
29-
30-
const mcu_pin_obj_t *row_addr_pins[] = {
31-
&pin_GPIO8,
32-
&pin_GPIO9,
33-
&pin_GPIO11,
34-
};
35-
36-
const mcu_pin_obj_t *column_pins[] = {
37-
&pin_GPIO13,
38-
&pin_GPIO15,
39-
&pin_GPIO3,
40-
&pin_GPIO4,
41-
&pin_GPIO5,
42-
&pin_GPIO6,
43-
&pin_GPIO7
44-
};
45-
46-
keypad_event_obj_t event;
47-
48-
char keystate[56];
49-
ringbuf_t keyqueue;
50-
char keybuf[32];
5120

5221
#define DELAY 0x80
5322

@@ -71,6 +40,7 @@ uint8_t display_init_sequence[] = {
7140
};
7241

7342

43+
// Overrides the weakly linked function from supervisor/shared/board.c
7444
void board_init(void) {
7545
busio_spi_obj_t *spi = common_hal_board_create_spi(0);
7646
fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus;
@@ -122,106 +92,4 @@ void board_init(void) {
12292
);
12393
}
12494

125-
void board_serial_init() {
126-
ringbuf_init(&keyqueue, (uint8_t *)keybuf, sizeof(keybuf));
127-
common_hal_keypad_demux_demuxkeymatrix_construct(
128-
&board_keyboard, // self
129-
3, // num_row_addr_pins
130-
row_addr_pins, // row_addr_pins
131-
7, // num_column_pins
132-
column_pins, // column_pins
133-
0.01f, // interval
134-
20, // max_events
135-
2 // debounce_threshold
136-
);
137-
demuxkeymatrix_never_reset(&board_keyboard);
138-
common_hal_keypad_eventqueue_set_event_handler(board_keyboard.events, update_keyboard);
139-
140-
}
141-
142-
bool board_serial_connected() {
143-
return true;
144-
}
145-
146-
uint32_t board_serial_bytes_available() {
147-
return ringbuf_num_filled(&keyqueue);
148-
}
149-
150-
void keyboard_seq(const char *seq) {
151-
while (*seq) {
152-
ringbuf_put(&keyqueue, *seq++);
153-
}
154-
}
155-
156-
void update_keyboard(keypad_eventqueue_obj_t *queue) {
157-
uint8_t ascii = 0;
158-
159-
if (common_hal_keypad_eventqueue_get_length(queue) == 0) {
160-
return;
161-
}
162-
163-
while (common_hal_keypad_eventqueue_get_into(queue, &event)) {
164-
if (event.pressed) {
165-
keystate[event.key_number] = 1;
166-
167-
if (keystate[KEY_CTRL]) {
168-
if (keystate[KEY_ALT] && keystate[KEY_BACKSPACE]) {
169-
reload_initiate(RUN_REASON_REPL_RELOAD);
170-
}
171-
ascii = keymap[event.key_number];
172-
if (ascii >= 'a' && ascii <= 'z') {
173-
ascii -= 'a' - 1;
174-
}
175-
176-
if (ascii == mp_interrupt_char) {
177-
mp_sched_keyboard_interrupt();
178-
}
179-
} else if (keystate[KEY_SHIFT]) {
180-
ascii = keymap_shifted[event.key_number];
181-
} else if (keystate[KEY_FN] && event.key_number != KEY_FN) {
182-
switch (event.key_number | FN_MOD) {
183-
case KEY_DOWN:
184-
keyboard_seq("\e[B");
185-
break;
186-
case KEY_UP:
187-
keyboard_seq("\e[A");
188-
break;
189-
case KEY_DELETE:
190-
keyboard_seq("\e[3~");
191-
break;
192-
case KEY_LEFT:
193-
keyboard_seq("\e[D");
194-
break;
195-
case KEY_RIGHT:
196-
keyboard_seq("\e[C");
197-
break;
198-
case KEY_ESC:
199-
ringbuf_put(&keyqueue, '\e');
200-
break;
201-
}
202-
} else {
203-
ascii = keymap[event.key_number];
204-
}
205-
206-
if (ascii > 0) {
207-
if (keystate[KEY_ALT]) {
208-
ringbuf_put(&keyqueue, '\e');
209-
} else if (keystate[KEY_OPT]) {
210-
ringbuf_put(&keyqueue, '\x10');
211-
}
212-
ringbuf_put(&keyqueue, ascii);
213-
}
214-
215-
} else {
216-
keystate[event.key_number] = 0;
217-
}
218-
}
219-
}
220-
221-
char board_serial_read() {
222-
return ringbuf_get(&keyqueue);
223-
}
224-
225-
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
226-
22795
// TODO: Should we turn off the display when asleep, in board_deinit() ?

0 commit comments

Comments
 (0)