From 13e11418aa91a22af77dac257c5f7c54575366b7 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Fri, 02 Aug 2019 20:51:55 +0000
Subject: [PATCH] Use SUPPORTED_DEVICES to match proper device
---
bcm20795.py | 30 +++++++++++++++++++++++-------
README.md | 2 +-
2 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index bf483dc..730417b 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
1. Clone the repository.
1. Install python3 and python3-usb.
-1. Run: `./bcm20795.py on`
+1. Run: `./bcm20795.py on` (use `sudo` if necessary).
1. Run `pcsc_scan` or whatever you prefer.
1. Enjoy!
diff --git a/bcm20795.py b/bcm20795.py
index 8ae81be..15bf244 100755
--- a/bcm20795.py
+++ b/bcm20795.py
@@ -14,8 +14,9 @@
import usb.core
import usb.util
-VENDOR_ID = 0x0A5C
-DEVICE_ID = 0x5834
+SUPPORTED_DEVICES = [
+ {'idVendor': 0x0A5C, 'idProduct': 0x5834},
+]
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
@@ -72,14 +73,29 @@
if data[1] == 0x61:
packet = self.recv_packet()
+ @staticmethod
+ def _dev_match(template, candidate):
+ for prop, value in template.items():
+ if prop not in candidate.__dict__ or candidate.__dict__[prop] != value:
+ return False
+ return True
+
@classmethod
- def find(cls, vendor_id, product_id):
+ def _dev_matcher(cls, dev):
+ for device in SUPPORTED_DEVICES:
+ if cls._dev_match(device, dev):
+ return True
+ return False
+
+ @classmethod
+ def find(cls):
logger = logging.getLogger(__name__)
- logger.info('Looking for device {:04X}:{:04X}...'.format(vendor_id, product_id))
+ logger.info('Looking for BCM device...')
- device = usb.core.find(idVendor=vendor_id, idProduct=product_id)
+ device = usb.core.find(custom_match=cls._dev_matcher)
if device is None:
- raise Exception('Cannot find device {:04X}:{:04X}'.format(vendor_id, product_id))
+ raise Exception('Cannot find BCM device - check list of supported devices')
+ logger.info('Found {:04X}:{:04X}'.format(device.idVendor, device.idProduct))
logger.debug('Enumerating interfaces...')
configuration = device.get_active_configuration()
@@ -159,7 +175,7 @@
print('Usage: {} [on|off]'.format(sys.argv[0]))
sys.exit(2)
- communicator = BcmCommunicator.find(VENDOR_ID, DEVICE_ID)
+ communicator = BcmCommunicator.find()
if sys.argv[1] == 'on':
logger.info('Turning NFC on...')
turn_on(communicator)
--
Gitblit v1.9.1