summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2017-10-26 22:53:28 -0400
committerDan Halbert <halbert@halwitz.org>2017-10-27 17:32:13 -0400
commit8e45dc041f8d98c62a580b7d6a34768664a972b8 (patch)
treeaba5c2a7cc5168882d9263971f6606761855cea9
parent10b3a901899c4725bf263ad4cda13c58751deccf (diff)
Read serial input as a background task so we can check for the interrupt character.
-rw-r--r--main.c1
-rw-r--r--ports/atmel-samd/background.c2
-rw-r--r--ports/atmel-samd/usb.c27
-rw-r--r--ports/atmel-samd/usb.h1
4 files changed, 23 insertions, 8 deletions
diff --git a/main.c b/main.c
index ba1e0e401..a2e4b9f72 100644
--- a/main.c
+++ b/main.c
@@ -127,6 +127,7 @@ bool start_mp(safe_mode_t safe_mode) {
pyexec_result_t result;
bool found_main = false;
+
if (safe_mode != NO_SAFE_MODE) {
serial_write(MSG_SAFE_MODE_NO_MAIN);
} else {
diff --git a/ports/atmel-samd/background.c b/ports/atmel-samd/background.c
index 6515e448b..2fdf05982 100644
--- a/ports/atmel-samd/background.c
+++ b/ports/atmel-samd/background.c
@@ -26,9 +26,11 @@
#include "background.h"
// #include "common-hal/audioio/AudioOut.h"
+#include "usb.h"
#include "usb_mass_storage.h"
void run_background_tasks(void) {
// audioout_background();
usb_msc_background();
+ usb_cdc_background();
}
diff --git a/ports/atmel-samd/usb.c b/ports/atmel-samd/usb.c
index e0b9ddc41..bd712a5d2 100644
--- a/ports/atmel-samd/usb.c
+++ b/ports/atmel-samd/usb.c
@@ -56,13 +56,13 @@
static uint8_t usb_rx_buf[USB_RX_BUF_SIZE];
// Receive buffer head
-static volatile uint8_t usb_rx_buf_head;
+static volatile uint8_t usb_rx_buf_head = 0;
// 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
-volatile uint8_t usb_rx_count;
+volatile uint8_t usb_rx_count = 0;
volatile bool mp_cdc_enabled = 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];
if (c == mp_interrupt_char) {
mp_keyboard_interrupt();
- // Don't put the interrupt into the buffer, just continue.
- continue;
+ // If interrupted, flush all the input.
+ usb_rx_count = 0;
+ usb_rx_buf_head = 0;
+ usb_rx_buf_tail = 0;
+ break;
} else {
// The count of characters present in receive buffer is
// 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) {
// Reached the end of buffer, revert back to beginning of
// 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_XFER_BLOCKS_DONE, (FUNC_PTR)usb_msc_xfer_done);
- int32_t result = usbdc_start(&multi_desc);
- while (result != ERR_NONE) {}
+ usbdc_start(&multi_desc);
usbdc_attach();
}
@@ -315,3 +317,12 @@ void usb_write(const char* buffer, uint32_t len) {
bool usb_connected(void) {
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();
+ }
+}
diff --git a/ports/atmel-samd/usb.h b/ports/atmel-samd/usb.h
index 754331211..45c05df9c 100644
--- a/ports/atmel-samd/usb.h
+++ b/ports/atmel-samd/usb.h
@@ -37,5 +37,6 @@ int usb_read(void);
void usb_write(const char* buffer, uint32_t len);
bool usb_bytes_available(void);
bool usb_connected(void);
+void usb_cdc_background(void);
#endif // __MICROPY_INCLUDED_ATMEL_SAMD_USB_H__