From 907c5ab075f5eee42d938d889e1dd300e76708cd Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sat, 25 Jan 2020 08:48:16 -0500 Subject: [PATCH] receiver: change usb identification of receivers to dictionary to allow adding other fields, add receiver name to dictionary --- lib/hidapi/udev.py | 15 +++++++++---- lib/logitech_receiver/base.py | 2 +- lib/logitech_receiver/base_usb.py | 36 ++++++++++++++++++++++++++----- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lib/hidapi/udev.py b/lib/hidapi/udev.py index 87b51736..86cf2f84 100644 --- a/lib/hidapi/udev.py +++ b/lib/hidapi/udev.py @@ -78,7 +78,13 @@ def exit(): return True -def _match(action, device, vendor_id=None, product_id=None, interface_number=None, hid_driver=None): +# The filter is used to determine whether this is a device of interest to Solaar +def _match(action, device, filter): + vendor_id=filter.get('vendor_id') + product_id=filter.get('product_id') + interface_number=filter.get('usb_interface') + hid_driver=filter.get('hid_driver') + usb_device = device.find_parent('usb', 'usb_device') # print ("* parent", action, device, "usb:", usb_device) if not usb_device: @@ -164,7 +170,7 @@ def monitor_glib(callback, *device_filters): # print ("***", action, device) if action == 'add': for filter in filters: - d_info = _match(action, device, *filter) + d_info = _match(action, device, filter) if d_info: GLib.idle_add(cb, action, d_info) break @@ -189,7 +195,7 @@ def monitor_glib(callback, *device_filters): m.start() -def enumerate(vendor_id=None, product_id=None, interface_number=None, hid_driver=None): +def enumerate(usb_id): """Enumerate the HID Devices. List all the HID devices attached to the system, optionally filtering by @@ -197,8 +203,9 @@ def enumerate(vendor_id=None, product_id=None, interface_number=None, hid_driver :returns: a list of matching ``DeviceInfo`` tuples. """ + for dev in _Context().list_devices(subsystem='hidraw'): - dev_info = _match('add', dev, vendor_id, product_id, interface_number, hid_driver) + dev_info = _match('add', dev, usb_id) if dev_info: yield dev_info diff --git a/lib/logitech_receiver/base.py b/lib/logitech_receiver/base.py index 13bffa2e..b6635318 100644 --- a/lib/logitech_receiver/base.py +++ b/lib/logitech_receiver/base.py @@ -83,7 +83,7 @@ from .base_usb import ALL as _RECEIVER_USB_IDS def receivers(): """List all the Linux devices exposed by the UR attached to the machine.""" for receiver_usb_id in _RECEIVER_USB_IDS: - for d in _hid.enumerate(*receiver_usb_id): + for d in _hid.enumerate(receiver_usb_id): yield d diff --git a/lib/logitech_receiver/base_usb.py b/lib/logitech_receiver/base_usb.py index a36a212a..8153a48a 100644 --- a/lib/logitech_receiver/base_usb.py +++ b/lib/logitech_receiver/base_usb.py @@ -26,11 +26,37 @@ from __future__ import absolute_import, division, print_function, unicode_litera _DRIVER = ('hid-generic', 'generic-usb', 'logitech-djreceiver') -# each tuple contains (vendor_id, product_id, usb interface number, hid driver) -_unifying_receiver = lambda product_id: (0x046d, product_id, 2, _DRIVER) -_nano_receiver = lambda product_id: (0x046d, product_id, 1, _DRIVER) -_lenovo_receiver = lambda product_id: (0x17ef, product_id, 1, _DRIVER) -_lightspeed_receiver = lambda product_id: (0x046d, product_id, 2, _DRIVER) +_unifying_receiver = lambda product_id: { + 'vendor_id':0x046d, + 'product_id':product_id, + 'usb_interface':2, + 'hid_driver':_DRIVER, + 'name':'Unifying Receiver' +} + +_nano_receiver = lambda product_id: { + 'vendor_id':0x046d, + 'product_id':product_id, + 'usb_interface':1, + 'hid_driver':_DRIVER, + 'name':'Nano Receiver' +} + +_lenovo_receiver = lambda product_id: { + 'vendor_id':0x17ef, + 'product_id':product_id, + 'usb_interface':1, + 'hid_driver':_DRIVER, + 'name':'Nano Receiver' +} + +_lightspeed_receiver = lambda product_id: { + 'vendor_id':0x046d, + 'product_id':product_id, + 'usb_interface':2, + 'hid_driver':_DRIVER, + 'name':'Lightspeed Receiver' +} # standard Unifying receivers (marked with the orange Unifying logo) UNIFYING_RECEIVER_C52B = _unifying_receiver(0xc52b)