ui: handle re-pairing receivers correctly when pairing

This commit is contained in:
Peter F. Patel-Schneider 2020-01-23 19:50:28 -05:00 committed by Filipe Laíns
parent e89b50cdf2
commit dc2a1adf26
3 changed files with 26 additions and 11 deletions

View File

@ -490,18 +490,25 @@ class Receiver(object):
del self._devices[key] del self._devices[key]
return return
action = 0x03 if self.re_pairs:
reply = self.write_register(_R.receiver_pairing, action, key) # invalidate the device, but these receivers don't unpair per se
if reply:
# invalidate the device
dev.online = False dev.online = False
dev.wpid = None dev.wpid = None
if key in self._devices: if key in self._devices:
del self._devices[key] del self._devices[key]
_log.warn("%s unpaired device %s", self, dev) _log.warn("%s removed device %s", self, dev)
else: else:
_log.error("%s failed to unpair device %s", self, dev) reply = self.write_register(_R.receiver_pairing, 0x03, key)
raise IndexError(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): def __len__(self):
return len([d for d in self._devices.values() if d is not None]) return len([d for d in self._devices.values() if d is not None])

View File

@ -61,8 +61,7 @@ def run(receivers, args, find_receiver, _ignore):
if n.devnumber not in known_devices: if n.devnumber not in known_devices:
receiver.status.new_device = receiver[n.devnumber] receiver.status.new_device = receiver[n.devnumber]
elif receiver.re_pairs: elif receiver.re_pairs:
# unfortunately this breaks encapsulation but the nice way tries to unpair del receiver[n.devnumber] # get rid of information on device re-paired away
del receiver._devices[n.devnumber] # get rid of information on device re-paired away
receiver.status.new_device = receiver[n.devnumber] receiver.status.new_device = receiver[n.devnumber]
timeout = 20 # seconds timeout = 20 # seconds

View File

@ -198,8 +198,17 @@ class ReceiverListener(_listener.EventsListener):
if n.sub_id == 0x40 and not already_known: if n.sub_id == 0x40 and not already_known:
return # disconnecting something that is not known - nothing to do return # disconnecting something that is not known - nothing to do
if n.sub_id == 0x41 and not already_known: if n.sub_id == 0x41:
dev = self.receiver.register_new_device(n.devnumber, n) 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: else:
dev = self.receiver[n.devnumber] dev = self.receiver[n.devnumber]