libftdi-git Archives

Subject: A library to talk to FTDI chips branch, master, updated. v1.4rc1-7-g5a7f320

From: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
To: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
Date: Thu, 20 Jul 2017 17:51:30 +0200 (CEST)
The branch, master has been updated
       via  5a7f320ddb926d0919ebfac20a9fc4a327dfc762 (commit)
      from  7c2a6851e1a7544504c58db0e9a21cd87c0bf117 (commit)


- Log -----------------------------------------------------------------
commit 5a7f320ddb926d0919ebfac20a9fc4a327dfc762
Author: Matthias Janke <janke@xxxxxxxxxxxxxxxxxxxxxxx>
Date:   Thu Jul 13 18:10:44 2017 +0200

    C++ API: Add support to open devices with missing product / serial strings
    
    The C++ API and C API differ in how they open a device. The C API only
    considers the user supplied strings iVendor, iProduct and iSerial to open a 
device.
    
    The C++ API behaves differently. After opening the device with specific 
supplied strings,
    it tries to read all strings via get_strings_and_reopen().
    This fails if one string like iSerial is not defined
    in the descriptor. As such the whole open() operation fails
    and the C++ API would only open devices with complete descriptors.
    
    This commit fixes this behaviour, by extending the get_strings_and_reopen()
    and get_strings() argument lists, to configure the strings to read.

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

Summary of changes:
 ftdipp/ftdi.cpp |   57 ++++++++++++++++++++++++++++++++----------------------
 ftdipp/ftdi.hpp |    4 +-
 2 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/ftdipp/ftdi.cpp b/ftdipp/ftdi.cpp
index 3d59d9d..aca686a 100644
--- a/ftdipp/ftdi.cpp
+++ b/ftdipp/ftdi.cpp
@@ -87,7 +87,7 @@ int Context::open(int vendor, int product)
     if (ret < 0)
        return ret;
 
-    return get_strings_and_reopen();
+    return get_strings_and_reopen(false,false,false);
 }
 
 int Context::open(int vendor, int product, const std::string& description, 
const std::string& serial, unsigned int index)
@@ -106,7 +106,7 @@ int Context::open(int vendor, int product, const 
std::string& description, const
     if (ret < 0)
        return ret;
 
-    return get_strings_and_reopen();
+    return get_strings_and_reopen(false,description.empty(),serial.empty());
 }
 
 int Context::open(const std::string& description)
@@ -116,7 +116,7 @@ int Context::open(const std::string& description)
     if (ret < 0)
        return ret;
 
-    return get_strings_and_reopen();
+    return get_strings_and_reopen(false,true,false);
 }
 
 int Context::open(struct libusb_device *dev)
@@ -319,41 +319,46 @@ const char* Context::error_string()
     return ftdi_get_error_string(d->ftdi);
 }
 
-int Context::get_strings()
+int Context::get_strings(bool vendor, bool description, bool serial)
 {
     // Prepare buffers
-    char vendor[512], desc[512], serial[512];
+    char ivendor[512], idesc[512], iserial[512];
 
-    int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor, 512, desc, 512, 
serial, 512);
+    int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor?ivendor:NULL, 512, 
description?idesc:NULL, 512, serial?iserial:NULL, 512);
 
     if (ret < 0)
         return -1;
 
-    d->vendor = vendor;
-    d->description = desc;
-    d->serial = serial;
+    d->vendor = ivendor;
+    d->description = idesc;
+    d->serial = iserial;
 
     return 1;
 }
 
-int Context::get_strings_and_reopen()
+int Context::get_strings_and_reopen(bool vendor, bool description, bool serial)
 {
-    if ( d->dev == 0 )
-    {
-        d->dev = libusb_get_device(d->ftdi->usb_dev);
-    }
+    int ret = 0;
 
-    // Get device strings (closes device)
-    int ret=get_strings();
-    if (ret < 0)
+    if(vendor || description || serial)
     {
-        d->open = 0;
-        return ret;
-    }
+        if (d->dev == 0)
+        {
+            d->dev = libusb_get_device(d->ftdi->usb_dev);
+        }
+
+        // Get device strings (closes device)
+        ret=get_strings(vendor, description, serial);
+        if (ret < 0)
+        {
+            d->open = 0;
+            return ret;
+        }
 
-    // Reattach device
-    ret = ftdi_usb_open_dev(d->ftdi, d->dev);
-    d->open = (ret >= 0);
+        // Reattach device
+        ret = ftdi_usb_open_dev(d->ftdi, d->dev);
+        d->open = (ret >= 0);
+    }
 
     return ret;
 }
@@ -362,6 +367,8 @@ int Context::get_strings_and_reopen()
  */
 const std::string& Context::vendor()
 {
+    if(d->vendor.empty())
+        get_strings_and_reopen(true,false,false);
     return d->vendor;
 }
 
@@ -369,6 +376,8 @@ const std::string& Context::vendor()
  */
 const std::string& Context::description()
 {
+    if(d->description.empty())
+        get_strings_and_reopen(false,true,false);
     return d->description;
 }
 
@@ -376,6 +385,8 @@ const std::string& Context::description()
  */
 const std::string& Context::serial()
 {
+    if(d->serial.empty())
+        get_strings_and_reopen(false,false,true);
     return d->serial;
 }
 
diff --git a/ftdipp/ftdi.hpp b/ftdipp/ftdi.hpp
index 6a7f893..dc035cc 100644
--- a/ftdipp/ftdi.hpp
+++ b/ftdipp/ftdi.hpp
@@ -134,8 +134,8 @@ public:
     const char* error_string();
 
 protected:
-    int get_strings();
-    int get_strings_and_reopen();
+    int get_strings(bool vendor=true, bool description=true, bool serial=true);
+    int get_strings_and_reopen(bool vendor=true, bool description=true, bool 
serial=true);
 
     /* Properties */
     struct ftdi_context* context();


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.4rc1-7-g5a7f320, libftdi-git <=