From 19fb1b4dd7173ad2cf4b2bb1b0f0c06498499bd2 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Sat, 29 Nov 2014 15:23:21 +0000
Subject: [PATCH] stmhal: Add USB_VCP.setinterrupt method, to disable CTRL-C.

---
 docs/library/pyb.USB_VCP.rst   | 9 +++++++++
 docs/tutorial/pass_through.rst | 1 +
 stmhal/qstrdefsport.h          | 1 +
 stmhal/usb.c                   | 7 +++++++
 stmhal/usbd_cdc_interface.c    | 2 +-
 5 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/docs/library/pyb.USB_VCP.rst b/docs/library/pyb.USB_VCP.rst
index 733064072..4d87be4a3 100644
--- a/docs/library/pyb.USB_VCP.rst
+++ b/docs/library/pyb.USB_VCP.rst
@@ -17,6 +17,15 @@ Constructors
 Methods
 -------
 
+.. method:: usb_vcp.setinterrupt(chr)
+
+   Set the character which interrupts running Python code.  This is set
+   to 3 (CTRL-C) by default, and when a CTRL-C character is received over
+   the USB VCP port, a KeyboardInterrupt exception is raised.
+
+   Set to -1 to disable this interrupt feature.  This is useful when you
+   want to send raw bytes over the USB VCP port.
+
 .. method:: usb_vcp.any()
 
    Return ``True`` if any characters waiting, else ``False``.
diff --git a/docs/tutorial/pass_through.rst b/docs/tutorial/pass_through.rst
index 309ef58e7..a94e7363d 100644
--- a/docs/tutorial/pass_through.rst
+++ b/docs/tutorial/pass_through.rst
@@ -7,6 +7,7 @@ It's as simple as::
     import select
 
     def pass_through(usb, uart):
+        usb.setinterrupt(-1)
         while True:
             select.select([usb, uart], [], [])
             if usb.any():
diff --git a/stmhal/qstrdefsport.h b/stmhal/qstrdefsport.h
index ce09404d3..3b89dc9f1 100644
--- a/stmhal/qstrdefsport.h
+++ b/stmhal/qstrdefsport.h
@@ -85,6 +85,7 @@ Q(tell)
 
 // for USB VCP class
 Q(USB_VCP)
+Q(setinterrupt)
 Q(send)
 Q(recv)
 Q(timeout)
diff --git a/stmhal/usb.c b/stmhal/usb.c
index 0499aaa8d..82f23c26f 100644
--- a/stmhal/usb.c
+++ b/stmhal/usb.c
@@ -174,6 +174,12 @@ STATIC mp_obj_t pyb_usb_vcp_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint
     return (mp_obj_t)&pyb_usb_vcp_obj;
 }
 
+STATIC mp_obj_t pyb_usb_vcp_setinterrupt(mp_obj_t self_in, mp_obj_t int_chr_in) {
+    usb_vcp_set_interrupt_char(mp_obj_get_int(int_chr_in));
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(pyb_usb_vcp_setinterrupt_obj, pyb_usb_vcp_setinterrupt);
+
 /// \method any()
 /// Return `True` if any characters waiting, else `False`.
 STATIC mp_obj_t pyb_usb_vcp_any(mp_obj_t self_in) {
@@ -252,6 +258,7 @@ mp_obj_t pyb_usb_vcp___exit__(mp_uint_t n_args, const mp_obj_t *args) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_usb_vcp___exit___obj, 4, 4, pyb_usb_vcp___exit__);
 
 STATIC const mp_map_elem_t pyb_usb_vcp_locals_dict_table[] = {
+    { MP_OBJ_NEW_QSTR(MP_QSTR_setinterrupt), (mp_obj_t)&pyb_usb_vcp_setinterrupt_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_any), (mp_obj_t)&pyb_usb_vcp_any_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&pyb_usb_vcp_send_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&pyb_usb_vcp_recv_obj },
diff --git a/stmhal/usbd_cdc_interface.c b/stmhal/usbd_cdc_interface.c
index c09c970f6..5814da646 100644
--- a/stmhal/usbd_cdc_interface.c
+++ b/stmhal/usbd_cdc_interface.c
@@ -482,7 +482,7 @@ int USBD_CDC_Rx(uint8_t *buf, uint32_t len, uint32_t timeout) {
     for (uint32_t i = 0; i < len; i++) {
         // Wait until we have at least 1 byte to read
         uint32_t start = HAL_GetTick();
-        while (!dev_is_connected || UserRxBufLen == UserRxBufCur) {
+        while (UserRxBufLen == UserRxBufCur) {
             // Wraparound of tick is taken care of by 2's complement arithmetic.
             if (HAL_GetTick() - start >= timeout) {
                 // timeout
-- 
GitLab