From 3b92d479565a413c7b9f830c34c93886ba366347 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 25 Jun 2010 17:41:28 +0200 Subject: [PATCH] Let ftdi_read_data() honor usb_read_timeout --- src/ftdi.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/ftdi.c b/src/ftdi.c index 2db8d32..5138e09 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -51,6 +51,35 @@ } while(0); +#if defined( __WIN32__) && !defined(__MINGW32__) +#include +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 +struct timeval { + long tv_sec; + long tv_usec; +}; +int gettimeofday( struct timeval *tv, void null) +{ + FILETIME ft; + unsigned __int64 tmpres = 0; + if(tv) + { + GetSystemTimeAsFileTime(&ft); + tmpres |= ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + + /*converting file time to unix epoch*/ + tmpres /= 10; /*convert into microseconds*/ + tmpres -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (LONG)(tmpres / 1000000UL); + tv->tv_usec = (LONG)(tmpres % 1000000UL); + } + /* Warning: Timezone not handled (and not needed here) */ + return 0; +} +#endif + /** Internal function to close usb device pointer. Sets ftdi->usb_dev to NULL. @@ -1528,6 +1557,7 @@ int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) { int offset = 0, ret = 1, i, num_of_chunks, chunk_remains; int packet_size; + struct timeval tv_start, tv_current; if (ftdi == NULL || ftdi->usb_dev == NULL) ftdi_error_return(-666, "USB device unavailable"); @@ -1559,6 +1589,7 @@ int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) offset += ftdi->readbuffer_remaining; } // do the actual USB read + gettimeofday(&tv_start,NULL); while (offset < size && ret > 0) { ftdi->readbuffer_remaining = 0; @@ -1595,14 +1626,6 @@ int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) else ret -= 2*(num_of_chunks-1)+chunk_remains; } - } - else if (ret <= 2) - { - // no more data to read? - return offset; - } - if (ret > 0) - { // data still fits in buf? if (offset+ret <= size) { @@ -1629,9 +1652,12 @@ int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) /* printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n", part_size, size, offset, ret, ftdi->readbuffer_remaining); */ - return offset; } } + gettimeofday(&tv_current,NULL); + if(((tv_current.tv_sec - tv_start.tv_sec)*1000000+(tv_current.tv_usec - tv_start.tv_usec)) + > ftdi->usb_read_timeout) + return offset; } // never reached return -127; -- 1.7.1