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