Read serial input as a background task so we can check for the interrupt character.

This commit is contained in:
Dan Halbert 2017-10-26 22:53:28 -04:00
parent 10b3a90189
commit 8e45dc041f
4 changed files with 23 additions and 8 deletions

1
main.c
View File

@ -127,6 +127,7 @@ bool start_mp(safe_mode_t safe_mode) {
pyexec_result_t result; pyexec_result_t result;
bool found_main = false; bool found_main = false;
if (safe_mode != NO_SAFE_MODE) { if (safe_mode != NO_SAFE_MODE) {
serial_write(MSG_SAFE_MODE_NO_MAIN); serial_write(MSG_SAFE_MODE_NO_MAIN);
} else { } else {

View File

@ -26,9 +26,11 @@
#include "background.h" #include "background.h"
// #include "common-hal/audioio/AudioOut.h" // #include "common-hal/audioio/AudioOut.h"
#include "usb.h"
#include "usb_mass_storage.h" #include "usb_mass_storage.h"
void run_background_tasks(void) { void run_background_tasks(void) {
// audioout_background(); // audioout_background();
usb_msc_background(); usb_msc_background();
usb_cdc_background();
} }

View File

@ -56,13 +56,13 @@
static uint8_t usb_rx_buf[USB_RX_BUF_SIZE]; static uint8_t usb_rx_buf[USB_RX_BUF_SIZE];
// Receive buffer head // Receive buffer head
static volatile uint8_t usb_rx_buf_head; static volatile uint8_t usb_rx_buf_head = 0;
// Receive buffer tail // Receive buffer tail
static volatile uint8_t usb_rx_buf_tail; static volatile uint8_t usb_rx_buf_tail = 0;
// Number of bytes in receive buffer // Number of bytes in receive buffer
volatile uint8_t usb_rx_count; volatile uint8_t usb_rx_count = 0;
volatile bool mp_cdc_enabled = false; volatile bool mp_cdc_enabled = false;
volatile bool usb_transmitting = false; volatile bool usb_transmitting = false;
@ -133,8 +133,11 @@ static bool read_complete(const uint8_t ep, const enum usb_xfer_code rc, const u
uint8_t c = cdc_packet_buffer[i]; uint8_t c = cdc_packet_buffer[i];
if (c == mp_interrupt_char) { if (c == mp_interrupt_char) {
mp_keyboard_interrupt(); mp_keyboard_interrupt();
// Don't put the interrupt into the buffer, just continue. // If interrupted, flush all the input.
continue; usb_rx_count = 0;
usb_rx_buf_head = 0;
usb_rx_buf_tail = 0;
break;
} else { } else {
// The count of characters present in receive buffer is // The count of characters present in receive buffer is
// incremented. // incremented.
@ -144,7 +147,7 @@ static bool read_complete(const uint8_t ep, const enum usb_xfer_code rc, const u
if (usb_rx_buf_tail == USB_RX_BUF_SIZE) { if (usb_rx_buf_tail == USB_RX_BUF_SIZE) {
// Reached the end of buffer, revert back to beginning of // Reached the end of buffer, revert back to beginning of
// buffer. // buffer.
usb_rx_buf_tail = 0x00; usb_rx_buf_tail = 0;
} }
} }
} }
@ -219,8 +222,7 @@ void init_usb(void) {
mscdf_register_callback(MSCDF_CB_TEST_DISK_READY, (FUNC_PTR)usb_msc_disk_is_ready); mscdf_register_callback(MSCDF_CB_TEST_DISK_READY, (FUNC_PTR)usb_msc_disk_is_ready);
mscdf_register_callback(MSCDF_CB_XFER_BLOCKS_DONE, (FUNC_PTR)usb_msc_xfer_done); mscdf_register_callback(MSCDF_CB_XFER_BLOCKS_DONE, (FUNC_PTR)usb_msc_xfer_done);
int32_t result = usbdc_start(&multi_desc); usbdc_start(&multi_desc);
while (result != ERR_NONE) {}
usbdc_attach(); usbdc_attach();
} }
@ -315,3 +317,12 @@ void usb_write(const char* buffer, uint32_t len) {
bool usb_connected(void) { bool usb_connected(void) {
return cdc_enabled(); return cdc_enabled();
} }
// Poll for input if keyboard interrupts are enabled,
// so that we can check for the interrupt char. read_complete() does the checking.
void usb_cdc_background() {
//
if (mp_interrupt_char != -1 && cdc_enabled() && !pending_read) {
start_read();
}
}

View File

@ -37,5 +37,6 @@ int usb_read(void);
void usb_write(const char* buffer, uint32_t len); void usb_write(const char* buffer, uint32_t len);
bool usb_bytes_available(void); bool usb_bytes_available(void);
bool usb_connected(void); bool usb_connected(void);
void usb_cdc_background(void);
#endif // __MICROPY_INCLUDED_ATMEL_SAMD_USB_H__ #endif // __MICROPY_INCLUDED_ATMEL_SAMD_USB_H__