From 52cbd2f1a1557002f46355e0095400a09c267ff9 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Mon, 19 Jul 2010 00:24:31 -0400 Subject: working serialUSB with timeout as a temporary workaround for the fact that SerialUSB is often blocking, this crude implementation makes the low-level C usbSendBytes function non-blocking (with a return code of bytes sent) and implements a 2ms timeout in the wirish write() function. also adds begin(), end(), getDTR(), getRTS(), pending(). device is still initialized the old fashioned way during init() so that, eg, autoreset will work. includes a simple multi-test program. --- wirish/usb_serial.cpp | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'wirish/usb_serial.cpp') diff --git a/wirish/usb_serial.cpp b/wirish/usb_serial.cpp index f186dea..2effa3d 100644 --- a/wirish/usb_serial.cpp +++ b/wirish/usb_serial.cpp @@ -32,24 +32,53 @@ #include "wirish.h" #include "usb.h" +#define USB_TIMEOUT 2 + USBSerial :: USBSerial(void) { } +void USBSerial::begin(void) { + setupUSB(); +} + +void USBSerial::end(void) { + disableUSB(); +} + void USBSerial::write(uint8 ch) { - usbSendBytes(&ch, 1); + uint16 status = 0; + uint32 start = millis(); + while(status == 0 && (millis() - start <= USB_TIMEOUT)) { + status = usbSendBytes(&ch, 1); + } } void USBSerial::write(const char *str) { - uint32 len = strlen(str); - - usbSendBytes((uint8*)str, len); + uint32 len = strlen(str); + uint16 status = 0; + uint16 oldstatus = 0; + uint32 start = millis(); + while(status < len && (millis() - start < USB_TIMEOUT)) { + status += usbSendBytes((uint8*)str+status, len-status); + if(oldstatus != status) + start = millis(); + oldstatus = status; + } } void USBSerial::write(void *buf, uint32 size) { if (!buf) { return; } - usbSendBytes((uint8*)buf, size); + uint16 status = 0; + uint16 oldstatus = 0; + uint32 start = millis(); + while(status < size && (millis() - start < USB_TIMEOUT)) { + status += usbSendBytes((uint8*)buf+status, size-status); + if(oldstatus != status) + start = millis(); + oldstatus = status; + } } uint32 USBSerial::available(void) { @@ -70,5 +99,9 @@ uint8 USBSerial::read(void) { return ch; } +uint8 USBSerial::pending(void) { + return usbGetPending(); +} + USBSerial SerialUSB; -- cgit v1.2.3