From e7b4bfd268ba85e7bb23e0c2f4bf981cbd1f3a78 Mon Sep 17 00:00:00 2001 From: Maciej Grela Date: Sat, 1 Oct 2022 15:57:24 +0200 Subject: [PATCH] Check sernum before assuming devindex to handle numeric USB serial numbers --- pyftdi/usbtools.py | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/pyftdi/usbtools.py b/pyftdi/usbtools.py index b1508927..be4cbe79 100644 --- a/pyftdi/usbtools.py +++ b/pyftdi/usbtools.py @@ -384,6 +384,15 @@ def enumerate_candidates(cls, urlparts: SplitResult, except (IndexError, ValueError) as exc: raise UsbToolsError('Invalid device URL: %s' % urlunsplit(urlparts)) from exc + + vendors = [vendor] if vendor else set(vdict.values()) + vps = set() + for vid in vendors: + products = pdict.get(vid, []) + for pid in products: + vps.add((vid, products[pid])) + devices = cls.find_all(vps) + sernum = None idx = None bus = None @@ -398,23 +407,19 @@ def enumerate_candidates(cls, urlparts: SplitResult, ':'.join(locators)) from exc else: if locators and locators[0]: - try: - devidx = to_int(locators[0]) - if devidx > 255: - raise ValueError() - idx = devidx - if idx: - idx = devidx-1 - except ValueError: + if locators[0] in [dev.sn for dev, _ in devices]: sernum = locators[0] + else: + try: + devidx = to_int(locators[0]) + if devidx > 255: + raise ValueError() + idx = devidx + if idx: + idx = devidx-1 + except ValueError: + raise UsbToolsError('Invalid index: %s' % ':'.join(locators)) candidates = [] - vendors = [vendor] if vendor else set(vdict.values()) - vps = set() - for vid in vendors: - products = pdict.get(vid, []) - for pid in products: - vps.add((vid, products[pid])) - devices = cls.find_all(vps) if sernum: if sernum not in [dev.sn for dev, _ in devices]: raise UsbToolsError("No USB device with S/N %s" % sernum)