From 4059b377b40eeab481a37c9d689795dc0cebd335 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sat, 13 Aug 2022 22:45:20 -0400 Subject: [PATCH] receiver: use last_id as maximum device number not max_devices --- lib/logitech_receiver/device.py | 2 +- lib/logitech_receiver/receiver.py | 7 +++++-- lib/solaar/cli/__init__.py | 2 +- lib/solaar/listener.py | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/logitech_receiver/device.py b/lib/logitech_receiver/device.py index 89494c63..c4a5f45f 100644 --- a/lib/logitech_receiver/device.py +++ b/lib/logitech_receiver/device.py @@ -44,7 +44,7 @@ class Device: self.product_id = None if receiver: - assert number > 0 and number <= receiver.max_devices + assert number > 0 and number <= 15 # some receivers have devices past their max # of devices self.number = number # will be None at this point for directly connected devices # 'device active' flag; requires manual management. self.online = None diff --git a/lib/logitech_receiver/receiver.py b/lib/logitech_receiver/receiver.py index 3f6e188b..2bd7be78 100644 --- a/lib/logitech_receiver/receiver.py +++ b/lib/logitech_receiver/receiver.py @@ -62,6 +62,7 @@ class Receiver: self.receiver_kind = product_info.get('receiver_kind', 'unknown') # read the serial immediately, so we can find out max_devices + self.last_id = 0 if self.receiver_kind == 'bolt': serial_reply = self.read_register(_R.bolt_uniqueId) self.serial = _strhex(serial_reply) @@ -72,6 +73,7 @@ class Receiver: if serial_reply: self.serial = _strhex(serial_reply[1:5]) self.max_devices = ord(serial_reply[6:7]) + self.last_id = ord(serial_reply[7:8]) if self.max_devices <= 0 or self.max_devices > 6: self.max_devices = product_info.get('max_devices', 1) # TODO _properly_ figure out which receivers do and which don't support unpairing @@ -84,6 +86,7 @@ class Receiver: self.serial = None self.max_devices = product_info.get('max_devices', 1) self.may_unpair = product_info.get('may_unpair', False) + self.last_id = self.last_id if self.last_id else self.max_devices self.name = product_info.get('name', '') self.re_pairs = product_info.get('re_pairs', False) @@ -295,7 +298,7 @@ class Receiver: write_register = _hidpp10.write_register def __iter__(self): - for number in range(1, 1 + self.max_devices): + for number in range(1, 16): # some receivers have devices past their max # devices if number in self._devices: dev = self._devices[number] else: @@ -313,7 +316,7 @@ class Receiver: if not isinstance(key, int): raise TypeError('key must be an integer') - if key < 1 or key > self.max_devices: + if key < 1 or key > 15: # some receivers have devices past their max # devices raise IndexError(key) return self.register_new_device(key) diff --git a/lib/solaar/cli/__init__.py b/lib/solaar/cli/__init__.py index 40ee90b9..33039056 100644 --- a/lib/solaar/cli/__init__.py +++ b/lib/solaar/cli/__init__.py @@ -157,7 +157,7 @@ def _find_device(receivers, name): for r in receivers: if not r.isDevice: # look for nth device of receiver - if number and number <= r.max_devices: + if number: dev = r[number] if dev: yield dev diff --git a/lib/solaar/listener.py b/lib/solaar/listener.py index 9690fc7a..841e1f43 100644 --- a/lib/solaar/listener.py +++ b/lib/solaar/listener.py @@ -205,7 +205,7 @@ class ReceiverListener(_listener.EventsListener): return # a device notification - if not (0 < n.devnumber <= self.receiver.max_devices): + if not (0 < n.devnumber <= 16): # some receivers have devices past their max # devices if _log.isEnabledFor(_WARNING): _log.warning('Unexpected device number (%s) in notification %s.', n.devnumber, n) return