device: keep track of devices in list

This commit is contained in:
Peter F. Patel-Schneider 2022-07-25 17:57:09 -04:00
parent ac7bf547e1
commit 218f7c9620
1 changed files with 12 additions and 1 deletions

View File

@ -29,12 +29,13 @@ KIND_MAP = {kind: _hidpp10.DEVICE_KIND[str(kind)] for kind in _hidpp20.DEVICE_KI
class Device: class Device:
instances = []
read_register = _hidpp10.read_register read_register = _hidpp10.read_register
write_register = _hidpp10.write_register write_register = _hidpp10.write_register
def __init__(self, receiver, number, link_notification=None, info=None, path=None, handle=None): def __init__(self, receiver, number, link_notification=None, info=None, path=None, handle=None):
assert receiver or info assert receiver or info
self.instances.append(self)
self.receiver = receiver self.receiver = receiver
self.may_unpair = False self.may_unpair = False
self.isDevice = True # some devices act as receiver so we need a property to distinguish them self.isDevice = True # some devices act as receiver so we need a property to distinguish them
@ -158,6 +159,15 @@ class Device:
# may be a 2.0 device; if not, it will fix itself later # may be a 2.0 device; if not, it will fix itself later
self.features = _hidpp20.FeaturesArray(self) self.features = _hidpp20.FeaturesArray(self)
@classmethod
def find(self, serial):
assert serial, 'need serial number or unit ID to find a device'
result = None
for device in self.instances:
if device.online and (device.unitId == serial or device.serial == serial):
result = device
return result
@property @property
def protocol(self): def protocol(self):
if not self._protocol and self.online: if not self._protocol and self.online:
@ -480,6 +490,7 @@ class Device:
def close(self): def close(self):
handle, self.handle = self.handle, None handle, self.handle = self.handle, None
self.instances.remove(self)
return (handle and _base.close(handle)) return (handle and _base.close(handle))
def __del__(self): def __del__(self):