From 19fb1b4dd7173ad2cf4b2bb1b0f0c06498499bd2 Mon Sep 17 00:00:00 2001 From: Damien George 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 7330640728..4d87be4a36 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 309ef58e74..a94e7363d2 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 ce09404d3f..3b89dc9f1a 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 0499aaa8d6..82f23c26f2 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 c09c970f67..5814da6469 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