From dc2a1adf26e7304483d9566aec311a44c310c53e Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 23 Jan 2020 19:50:28 -0500 Subject: [PATCH] ui: handle re-pairing receivers correctly when pairing --- lib/logitech_receiver/receiver.py | 21 ++++++++++++++------- lib/solaar/cli/pair.py | 3 +-- lib/solaar/listener.py | 13 +++++++++++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/logitech_receiver/receiver.py b/lib/logitech_receiver/receiver.py index 9637a861..9f6cdccb 100644 --- a/lib/logitech_receiver/receiver.py +++ b/lib/logitech_receiver/receiver.py @@ -490,18 +490,25 @@ class Receiver(object): del self._devices[key] return - action = 0x03 - reply = self.write_register(_R.receiver_pairing, action, key) - if reply: - # invalidate the device + if self.re_pairs: + # invalidate the device, but these receivers don't unpair per se dev.online = False dev.wpid = None if key in self._devices: del self._devices[key] - _log.warn("%s unpaired device %s", self, dev) + _log.warn("%s removed device %s", self, dev) else: - _log.error("%s failed to unpair device %s", self, dev) - raise IndexError(key) + reply = self.write_register(_R.receiver_pairing, 0x03, key) + if reply: + # invalidate the device + dev.online = False + dev.wpid = None + if key in self._devices: + del self._devices[key] + _log.warn("%s unpaired device %s", self, dev) + else: + _log.error("%s failed to unpair device %s", self, dev) + raise IndexError(key) def __len__(self): return len([d for d in self._devices.values() if d is not None]) diff --git a/lib/solaar/cli/pair.py b/lib/solaar/cli/pair.py index 3338a243..81705600 100644 --- a/lib/solaar/cli/pair.py +++ b/lib/solaar/cli/pair.py @@ -61,8 +61,7 @@ def run(receivers, args, find_receiver, _ignore): if n.devnumber not in known_devices: receiver.status.new_device = receiver[n.devnumber] elif receiver.re_pairs: - # unfortunately this breaks encapsulation but the nice way tries to unpair - del receiver._devices[n.devnumber] # get rid of information on device re-paired away + del receiver[n.devnumber] # get rid of information on device re-paired away receiver.status.new_device = receiver[n.devnumber] timeout = 20 # seconds diff --git a/lib/solaar/listener.py b/lib/solaar/listener.py index 339d9650..6fa6ace2 100644 --- a/lib/solaar/listener.py +++ b/lib/solaar/listener.py @@ -198,8 +198,17 @@ class ReceiverListener(_listener.EventsListener): if n.sub_id == 0x40 and not already_known: return # disconnecting something that is not known - nothing to do - if n.sub_id == 0x41 and not already_known: - dev = self.receiver.register_new_device(n.devnumber, n) + if n.sub_id == 0x41: + if not already_known: + dev = self.receiver.register_new_device(n.devnumber, n) + elif self.receiver.status.lock_open and self.receiver.re_pairs: + dev = self.receiver[n.devnumber] + del self.receiver[n.devnumber] # get rid of information on device re-paired away + self._status_changed(dev) # signal that this device has changed + dev = self.receiver.register_new_device(n.devnumber, n) + self.receiver.status.new_device = self.receiver[n.devnumber] + else: + dev = self.receiver[n.devnumber] else: dev = self.receiver[n.devnumber]