udev: add a timeout to find_paired_node because the device might not be instantly ready (e.g. after pairing)
This commit is contained in:
parent
2d29db4609
commit
246c6cc1b2
|
|
@ -34,6 +34,7 @@ import os as _os
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from select import select as _select
|
from select import select as _select
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
from time import time as _timestamp
|
||||||
|
|
||||||
from pyudev import Context as _Context
|
from pyudev import Context as _Context
|
||||||
from pyudev import Device as _Device
|
from pyudev import Device as _Device
|
||||||
|
|
@ -154,7 +155,7 @@ def _match(action, device, filter):
|
||||||
return d_info
|
return d_info
|
||||||
|
|
||||||
|
|
||||||
def find_paired_node(receiver_path, index):
|
def find_paired_node(receiver_path, index, timeout):
|
||||||
"""Find the node of a device paired with a receiver"""
|
"""Find the node of a device paired with a receiver"""
|
||||||
context = _Context()
|
context = _Context()
|
||||||
receiver_phys = _Devices.from_device_file(context, receiver_path).find_parent('hid').get('HID_PHYS')
|
receiver_phys = _Devices.from_device_file(context, receiver_path).find_parent('hid').get('HID_PHYS')
|
||||||
|
|
@ -163,10 +164,14 @@ def find_paired_node(receiver_path, index):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
phys = f'{receiver_phys}:{index}'
|
phys = f'{receiver_phys}:{index}'
|
||||||
for dev in context.list_devices(subsystem='hidraw'):
|
timeout += _timestamp()
|
||||||
dev_phys = dev.find_parent('hid').get('HID_PHYS')
|
delta = _timestamp()
|
||||||
if dev_phys and dev_phys == phys:
|
while delta < timeout:
|
||||||
return dev.device_node
|
for dev in context.list_devices(subsystem='hidraw'):
|
||||||
|
dev_phys = dev.find_parent('hid').get('HID_PHYS')
|
||||||
|
if dev_phys and dev_phys == phys:
|
||||||
|
return dev.device_node
|
||||||
|
delta = _timestamp()
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ class Device(object):
|
||||||
# device is unpaired
|
# device is unpaired
|
||||||
assert self.wpid is not None, 'failed to read wpid: device %d of %s' % (number, receiver)
|
assert self.wpid is not None, 'failed to read wpid: device %d of %s' % (number, receiver)
|
||||||
|
|
||||||
self.path = _hid.find_paired_node(receiver.path, number)
|
self.path = _hid.find_paired_node(receiver.path, number, _base.DEFAULT_TIMEOUT)
|
||||||
self.handle = _hid.open_path(self.path) if self.path else None
|
self.handle = _hid.open_path(self.path) if self.path else None
|
||||||
|
|
||||||
self.descriptor = _DESCRIPTORS.get(self.wpid)
|
self.descriptor = _DESCRIPTORS.get(self.wpid)
|
||||||
|
|
@ -280,7 +280,7 @@ class Device(object):
|
||||||
for s in self.descriptor.settings:
|
for s in self.descriptor.settings:
|
||||||
try:
|
try:
|
||||||
setting = s(self)
|
setting = s(self)
|
||||||
except Exception as e: # Do nothing if the device is offline
|
except Exception as e: # Do nothing if the device is offline
|
||||||
setting = None
|
setting = None
|
||||||
if self.online:
|
if self.online:
|
||||||
raise e
|
raise e
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue