26
26
27
27
#include "keymap.h"
28
28
#include "supervisor/board.h"
29
- #include "supervisor/serial.h"
29
+ #include "supervisor/shared/ serial.h"
30
30
#include "mpconfigboard.h"
31
31
#include "shared-bindings/busio/SPI.h"
32
32
#include "shared-bindings/fourwire/FourWire.h"
39
39
#include "shared-bindings/keypad/Event.h"
40
40
#include "supervisor/shared/reload.h"
41
41
#include "py/runtime.h"
42
+ #include "py/ringbuf.h"
43
+ #include "shared/runtime/interrupt_char.h"
42
44
43
45
fourwire_fourwire_obj_t board_display_obj ;
44
46
keypad_demux_demuxkeymatrix_obj_t board_keyboard ;
45
47
46
- void update_keyboard (void );
47
- void queue_key (char c );
48
- void queue_seq (const char * seq );
48
+ void update_keyboard (keypad_eventqueue_obj_t * queue );
49
+ void keyboard_seq (const char * seq );
49
50
50
51
const mcu_pin_obj_t * row_addr_pins [] = {
51
52
& pin_GPIO8 ,
@@ -66,9 +67,8 @@ const mcu_pin_obj_t *column_pins[] = {
66
67
keypad_event_obj_t event ;
67
68
68
69
char keystate [56 ];
69
- char keyqueue [16 ];
70
- int keyqueue_head = 0 ;
71
- int keyqueue_tail = 0 ;
70
+ ringbuf_t keyqueue ;
71
+ char keybuf [32 ];
72
72
73
73
#define DELAY 0x80
74
74
@@ -144,6 +144,7 @@ void board_init(void) {
144
144
}
145
145
146
146
void board_serial_init () {
147
+ ringbuf_init (& keyqueue , (uint8_t * )keybuf , sizeof (keybuf ));
147
148
common_hal_keypad_demux_demuxkeymatrix_construct (
148
149
& board_keyboard , // self
149
150
3 , // num_row_addr_pins
@@ -155,42 +156,32 @@ void board_serial_init() {
155
156
2 // debounce_threshold
156
157
);
157
158
demuxkeymatrix_never_reset (& board_keyboard );
159
+ common_hal_keypad_eventqueue_set_event_handler (board_keyboard .events , update_keyboard );
160
+
158
161
}
159
162
160
163
bool board_serial_connected () {
161
164
return true;
162
165
}
163
166
164
- bool board_serial_bytes_available () {
165
- update_keyboard ();
166
- if (keyqueue_head != keyqueue_tail ) {
167
- return true;
168
- } else {
169
- return false;
170
- }
171
- }
172
-
173
- void queue_key (char c ) {
174
- if ((keyqueue_head + 1 ) % 16 != keyqueue_tail ) {
175
- keyqueue [keyqueue_head ] = c ;
176
- keyqueue_head = (keyqueue_head + 1 ) % 16 ;
177
- }
167
+ uint32_t board_serial_bytes_available () {
168
+ return ringbuf_num_filled (& keyqueue );
178
169
}
179
170
180
- void queue_seq (const char * seq ) {
171
+ void keyboard_seq (const char * seq ) {
181
172
while (* seq ) {
182
- queue_key ( * seq ++ );
173
+ ringbuf_put ( & keyqueue , * seq ++ );
183
174
}
184
175
}
185
176
186
- void update_keyboard () {
187
- char ascii = 0 ;
177
+ void update_keyboard (keypad_eventqueue_obj_t * queue ) {
178
+ uint8_t ascii = 0 ;
188
179
189
- if (common_hal_keypad_eventqueue_get_length (board_keyboard . events ) == 0 ) {
180
+ if (common_hal_keypad_eventqueue_get_length (queue ) == 0 ) {
190
181
return ;
191
182
}
192
183
193
- while (common_hal_keypad_eventqueue_get_into (board_keyboard . events , & event )) {
184
+ while (common_hal_keypad_eventqueue_get_into (queue , & event )) {
194
185
if (event .pressed ) {
195
186
keystate [event .key_number ] = 1 ;
196
187
@@ -202,27 +193,31 @@ void update_keyboard() {
202
193
if (ascii >= 'a' && ascii <= 'z' ) {
203
194
ascii -= 'a' - 1 ;
204
195
}
196
+
197
+ if (ascii == mp_interrupt_char ) {
198
+ mp_sched_keyboard_interrupt ();
199
+ }
205
200
} else if (keystate [KEY_SHIFT ]) {
206
201
ascii = keymap_shifted [event .key_number ];
207
202
} else if (keystate [KEY_FN ] && event .key_number != KEY_FN ) {
208
203
switch (event .key_number | FN_MOD ) {
209
204
case KEY_DOWN :
210
- queue_seq ("\e[B" );
205
+ keyboard_seq ("\e[B" );
211
206
break ;
212
207
case KEY_UP :
213
- queue_seq ("\e[A" );
208
+ keyboard_seq ("\e[A" );
214
209
break ;
215
210
case KEY_DELETE :
216
- queue_seq ("\e[3~" );
211
+ keyboard_seq ("\e[3~" );
217
212
break ;
218
213
case KEY_LEFT :
219
- queue_seq ("\e[D" );
214
+ keyboard_seq ("\e[D" );
220
215
break ;
221
216
case KEY_RIGHT :
222
- queue_seq ("\e[C" );
217
+ keyboard_seq ("\e[C" );
223
218
break ;
224
219
case KEY_ESC :
225
- queue_key ( '\e' );
220
+ ringbuf_put ( & keyqueue , '\e' );
226
221
break ;
227
222
}
228
223
} else {
@@ -231,9 +226,9 @@ void update_keyboard() {
231
226
232
227
if (ascii > 0 ) {
233
228
if (keystate [KEY_ALT ]) {
234
- queue_key ( '\e' );
229
+ ringbuf_put ( & keyqueue , '\e' );
235
230
}
236
- queue_key ( ascii );
231
+ ringbuf_put ( & keyqueue , ascii );
237
232
}
238
233
239
234
} else {
@@ -243,14 +238,7 @@ void update_keyboard() {
243
238
}
244
239
245
240
char board_serial_read () {
246
- update_keyboard ();
247
- if (keyqueue_head != keyqueue_tail ) {
248
- char c = keyqueue [keyqueue_tail ];
249
- keyqueue_tail = (keyqueue_tail + 1 ) % 16 ;
250
- return c ;
251
- } else {
252
- return -1 ;
253
- }
241
+ return ringbuf_get (& keyqueue );
254
242
}
255
243
256
244
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
0 commit comments