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
7444void 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