summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/usb_cdc/Serial.c30
-rw-r--r--shared-module/usb_cdc/Serial.h4
-rw-r--r--shared-module/usb_cdc/__init__.c4
3 files changed, 35 insertions, 3 deletions
diff --git a/shared-module/usb_cdc/Serial.c b/shared-module/usb_cdc/Serial.c
index bd3972c8d..f569a1913 100644
--- a/shared-module/usb_cdc/Serial.c
+++ b/shared-module/usb_cdc/Serial.c
@@ -24,10 +24,32 @@
* THE SOFTWARE.
*/
+#include "lib/utils/interrupt_char.h"
#include "shared-module/usb_cdc/Serial.h"
+#include "supervisor/shared/tick.h"
+
#include "tusb.h"
size_t common_hal_usb_cdc_serial_read(usb_cdc_serial_obj_t *self, uint8_t *data, size_t len, int *errcode) {
+ if (self->timeout < 0.0f) {
+ while (tud_cdc_n_available(self->idx) < len) {
+ RUN_BACKGROUND_TASKS;
+ if (mp_hal_is_interrupted()) {
+ return 0;
+ }
+ }
+ } else if (self->timeout > 0.0f) {
+ uint64_t timeout_ms = self->timeout * 1000;
+ uint64_t start_ticks = supervisor_ticks_ms64();
+ while (tud_cdc_n_available(self->idx) < len &&
+ supervisor_ticks_ms64() - start_ticks <= timeout_ms) {
+ RUN_BACKGROUND_TASKS;
+ if (mp_hal_is_interrupted()) {
+ return 0;
+ }
+ }
+ }
+ // Timeout of 0.0f falls through to here with no waiting or unnecessary calculation.
return tud_cdc_n_read(self->idx, data, len);
}
@@ -61,3 +83,11 @@ uint32_t common_hal_usb_cdc_serial_flush(usb_cdc_serial_obj_t *self) {
bool common_hal_usb_cdc_serial_get_connected(usb_cdc_serial_obj_t *self) {
return tud_cdc_n_connected(self->idx);
}
+
+mp_float_t common_hal_usb_cdc_serial_get_timeout(usb_cdc_serial_obj_t *self) {
+ return self->timeout;
+}
+
+void common_hal_usb_cdc_serial_set_timeout(usb_cdc_serial_obj_t *self, mp_float_t timeout) {
+ self->timeout = timeout;
+}
diff --git a/shared-module/usb_cdc/Serial.h b/shared-module/usb_cdc/Serial.h
index 60a1d1922..ad4bed1a3 100644
--- a/shared-module/usb_cdc/Serial.h
+++ b/shared-module/usb_cdc/Serial.h
@@ -31,8 +31,8 @@
typedef struct {
mp_obj_base_t base;
- // Which CDC device?
- uint8_t idx;
+ mp_float_t timeout; // if negative, wait forever.
+ uint8_t idx; // which CDC device?
} usb_cdc_serial_obj_t;
#endif // SHARED_MODULE_USB_CDC_SERIAL_H
diff --git a/shared-module/usb_cdc/__init__.c b/shared-module/usb_cdc/__init__.c
index ecb5777b2..9eae18811 100644
--- a/shared-module/usb_cdc/__init__.c
+++ b/shared-module/usb_cdc/__init__.c
@@ -38,11 +38,13 @@
#error CFG_TUD_CDC must be exactly 2
#endif
-static const usb_cdc_serial_obj_t serial_objs[CFG_TUD_CDC] = {
+static usb_cdc_serial_obj_t serial_objs[CFG_TUD_CDC] = {
{ .base.type = &usb_cdc_serial_type,
+ .timeout = -1.0f,
.idx = 0,
}, {
.base.type = &usb_cdc_serial_type,
+ .timeout = -1.0f,
.idx = 1,
}
};