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