receiver: use last_id as maximum device number not max_devices

This commit is contained in:
Peter F. Patel-Schneider 2022-08-13 22:45:20 -04:00
parent a36a6297f3
commit 4059b377b4
4 changed files with 8 additions and 5 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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