4
4
//
5
5
// SPDX-License-Identifier: MIT
6
6
7
- #include "keymap .h"
7
+ #include "mpconfigboard .h"
8
8
#include "supervisor/board.h"
9
9
#include "supervisor/shared/serial.h"
10
- #include "mpconfigboard.h"
11
10
#include "shared-bindings/busio/SPI.h"
12
11
#include "shared-bindings/fourwire/FourWire.h"
13
12
#include "shared-bindings/microcontroller/Pin.h"
14
13
#include "shared-module/displayio/__init__.h"
15
14
#include "shared-module/displayio/mipi_constants.h"
16
15
#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"
21
16
#include "py/runtime.h"
22
17
#include "py/ringbuf.h"
23
18
#include "shared/runtime/interrupt_char.h"
24
19
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 ];
51
20
52
21
#define DELAY 0x80
53
22
@@ -71,6 +40,7 @@ uint8_t display_init_sequence[] = {
71
40
};
72
41
73
42
43
+ // Overrides the weakly linked function from supervisor/shared/board.c
74
44
void board_init (void ) {
75
45
busio_spi_obj_t * spi = common_hal_board_create_spi (0 );
76
46
fourwire_fourwire_obj_t * bus = & allocate_display_bus ()-> fourwire_bus ;
@@ -122,106 +92,4 @@ void board_init(void) {
122
92
);
123
93
}
124
94
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
-
227
95
// TODO: Should we turn off the display when asleep, in board_deinit() ?
0 commit comments