From 2f6b4bb6a67d7b3a0d4b0ba216637c8bdaac728f Mon Sep 17 00:00:00 2001 From: Marek Vavrusa Date: Mon, 4 May 2009 11:54:52 +0200 Subject: [PATCH] Fixed Context::open as get_strings() closes the device before. Thanks to Chris M. Leahy for pointing this out. Tested on our good old example (added open test). Intra2net: Reverted return code behavior of Context::open() calls --- examples/find_all_pp.cpp | 13 +++++++++++-- ftdipp/ftdi.cpp | 28 +++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/examples/find_all_pp.cpp b/examples/find_all_pp.cpp index 4e8e824..98e5133 100644 --- a/examples/find_all_pp.cpp +++ b/examples/find_all_pp.cpp @@ -51,8 +51,17 @@ int main(int argc, char **argv) std::cout << "FTDI (" << &*it << "): " << it->vendor() << ", " << it->description() << ", " - << it->serial() - << std::endl; + << it->serial(); + + // Open test + if(it->open()) + std::cout << " (Open OK)"; + else + std::cout << " (Open FAILED)"; + + it->close(); + + std::cout << std::endl; } diff --git a/ftdipp/ftdi.cpp b/ftdipp/ftdi.cpp index 584a04a..e5a8966 100644 --- a/ftdipp/ftdi.cpp +++ b/ftdipp/ftdi.cpp @@ -81,37 +81,39 @@ int Context::open(int vendor, int product, const std::string& description, const { int ret = 0; + // Open device if (description.empty() && serial.empty()) ret = ftdi_usb_open(d->ftdi, vendor, product); else ret = ftdi_usb_open_desc(d->ftdi, vendor, product, description.c_str(), serial.c_str()); - d->dev = usb_device(d->ftdi->usb_dev); + if (ret < 0) + return ret; - if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0) - { - d->open = true; - get_strings(); - } + // Get device strings (closes device) + get_strings(); + + // Reattach device + ret = ftdi_usb_open_dev(d->ftdi, d->dev); + d->open = (ret >= 0); return ret; } int Context::open(struct usb_device *dev) { - int ret = 0; - if (dev != 0) d->dev = dev; if (d->dev == 0) return -1; - if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0) - { - d->open = true; - get_strings(); - } + // Get device strings (closes device) + get_strings(); + + // Reattach device + int ret = ftdi_usb_open_dev(d->ftdi, d->dev); + d->open = (ret >= 0); return ret; } -- 1.7.1