libftdi-git Archives

Subject: A library to talk to FTDI chips branch, master, updated. v1.2-24-g1b1bf7e

From: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
To: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
Date: Sat, 26 Mar 2016 13:07:02 +0100 (CET)
The branch, master has been updated
       via  1b1bf7e481bc29ffac3b4c6a6da9eeff36beb1d0 (commit)
      from  c4c9f0ae4960a862b486aaf45872c25d288958a5 (commit)


- Log -----------------------------------------------------------------
commit 1b1bf7e481bc29ffac3b4c6a6da9eeff36beb1d0
Author: Eugene Hutorny <eugene@xxxxxxxxxxxxx>
Date:   Sat Jan 23 06:41:30 2016 +0200

    Added ftdi_transfer_data_cancel for cancelation of a submitted transfer, 
avoided resubmittion of a cancelled transfer in the callbacks, replaced calls 
to libusb_handle_events with libusb_handle_events_timeout_completed (Eugene 
Hutorny, eugene@xxxxxxxxxxxxx)

-----------------------------------------------------------------------

Summary of changes:
 AUTHORS    |    1 +
 ChangeLog  |    9 ++++++++
 src/ftdi.c |   65 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 src/ftdi.h |    1 +
 4 files changed, 67 insertions(+), 9 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index ac74557..0200e22 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -22,6 +22,7 @@ see Changelog for full details:
   Davide Michelizza <dmichelizza@xxxxxxxxx>
   Denis Sirotkin <reg.libftdi@xxxxxxxxxx>
   Emil <emil@xxxxxxxxxxx>
+  Eugene Hutorny <eugene@xxxxxxxxxxxxx>
   Evan Nemerson <evan@xxxxxxxxxxxxxxx>
   Evgeny Sinelnikov <sin@xxxxxxxx>
   Flynn Marquardt <ftdi@xxxxxxxxxx>
diff --git a/ChangeLog b/ChangeLog
index aaae78b..82c5a9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+New in 1.3 - 2016-04-xx
+-----------------------
+* Added ftdi_transfer_data_cancel for cancelation of a submitted transfer,
+  avoided resubmittion of a cancelled transfer in the callbacks, replaced calls
+  to libusb_handle_events with libusb_handle_events_timeout_completed
+  (Eugene Hutorny, eugene@xxxxxxxxxxxxx)
+
+Note: All other changes are not listed yet
+
 New in 1.2 - 2014-11-21
 -----------------------
 * Support for FT230X devices (Uwe Bonnes)
diff --git a/src/ftdi.c b/src/ftdi.c
index aa4b4ec..573080a 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -1470,9 +1470,15 @@ static void LIBUSB_CALL ftdi_read_data_cb(struct 
libusb_transfer *transfer)
             }
         }
     }
-    ret = libusb_submit_transfer (transfer);
-    if (ret < 0)
-        tc->completed = 1;
+
+    if (transfer->status == LIBUSB_TRANSFER_CANCELLED)
+        tc->completed = LIBUSB_TRANSFER_CANCELLED;
+    else
+    {
+        ret = libusb_submit_transfer (transfer);
+        if (ret < 0)
+            tc->completed = 1;
+    }
 }
 
 
@@ -1497,9 +1503,15 @@ static void LIBUSB_CALL ftdi_write_data_cb(struct 
libusb_transfer *transfer)
 
         transfer->length = write_size;
         transfer->buffer = tc->buf + tc->offset;
-        ret = libusb_submit_transfer (transfer);
-        if (ret < 0)
-            tc->completed = 1;
+
+        if (transfer->status == LIBUSB_TRANSFER_CANCELLED)
+            tc->completed = LIBUSB_TRANSFER_CANCELLED;
+        else
+        {
+            ret = libusb_submit_transfer (transfer);
+            if (ret < 0)
+                tc->completed = 1;
+        }
     }
 }
 
@@ -1662,17 +1674,19 @@ struct ftdi_transfer_control 
*ftdi_read_data_submit(struct ftdi_context *ftdi, u
 int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
 {
     int ret;
-
+    struct timeval to = { 0, 0 };
     while (!tc->completed)
     {
-        ret = libusb_handle_events(tc->ftdi->usb_ctx);
+        ret = libusb_handle_events_timeout_completed(tc->ftdi->usb_ctx,
+                &to, &tc->completed);
         if (ret < 0)
         {
             if (ret == LIBUSB_ERROR_INTERRUPTED)
                 continue;
             libusb_cancel_transfer(tc->transfer);
             while (!tc->completed)
-                if (libusb_handle_events(tc->ftdi->usb_ctx) < 0)
+                if (libusb_handle_events_timeout_completed(tc->ftdi->usb_ctx,
+                        &to, &tc->completed) < 0)
                     break;
             libusb_free_transfer(tc->transfer);
             free (tc);
@@ -1696,6 +1710,39 @@ int ftdi_transfer_data_done(struct ftdi_transfer_control 
*tc)
 }
 
 /**
+    Cancel transfer and wait for completion.
+
+    Use libusb 1.0 asynchronous API.
+
+    \param tc pointer to ftdi_transfer_control
+    \param to pointer to timeout value or NULL for infinite
+*/
+
+void ftdi_transfer_data_cancel(struct ftdi_transfer_control *tc,
+                               struct timeval * to)
+{
+    struct timeval tv = { 0, 0 };
+
+    if (!tc->completed && tc->transfer != NULL)
+    {
+        if (to == NULL)
+            to = &tv;
+
+        libusb_cancel_transfer(tc->transfer);
+        while (!tc->completed)
+        {
+            if (libusb_handle_events_timeout_completed(tc->ftdi->usb_ctx, to, 
&tc->completed) < 0)
+                break;
+        }
+    }
+
+    if (tc->transfer)
+        libusb_free_transfer(tc->transfer);
+
+    free (tc);
+}
+
+/**
     Configure write buffer chunk size.
     Default is 4096.
 
diff --git a/src/ftdi.h b/src/ftdi.h
index 9a6ec79..fa53b29 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -521,6 +521,7 @@ extern "C"
 
     struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context 
*ftdi, unsigned char *buf, int size);
     int ftdi_transfer_data_done(struct ftdi_transfer_control *tc);
+    void ftdi_transfer_data_cancel(struct ftdi_transfer_control *tc, struct 
timeval * to);
 
     int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, 
unsigned char mode);
     int ftdi_disable_bitbang(struct ftdi_context *ftdi);


hooks/post-receive
-- 
A library to talk to FTDI chips

--
libftdi-git - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi-git+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   

Current Thread
  • A library to talk to FTDI chips branch, master, updated. v1.2-24-g1b1bf7e, libftdi-git <=