receiver: add option to not wait for a reply when requesting to device

This commit is contained in:
Peter F. Patel-Schneider 2020-07-11 10:00:56 -04:00
parent c9c472e391
commit c6506b3508
3 changed files with 12 additions and 11 deletions

View File

@ -312,16 +312,14 @@ del namedtuple
# #
def request(handle, devnumber, request_id, *params): # a very few requests (e.g., host switching) do not expect a reply, but use no_reply=True with extreme caution
def request(handle, devnumber, request_id, *params, no_reply=False):
"""Makes a feature call to a device and waits for a matching reply. """Makes a feature call to a device and waits for a matching reply.
This function will wait for a matching reply indefinitely.
:param handle: an open UR handle. :param handle: an open UR handle.
:param devnumber: attached device number. :param devnumber: attached device number.
:param request_id: a 16-bit integer. :param request_id: a 16-bit integer.
:param params: parameters for the feature call, 3 to 16 bytes. :param params: parameters for the feature call, 3 to 16 bytes.
:returns: the reply data, or ``None`` if some error occurred. :returns: the reply data, or ``None`` if some error occurred. or no reply expected
""" """
# import inspect as _inspect # import inspect as _inspect
@ -354,6 +352,9 @@ def request(handle, devnumber, request_id, *params):
_skip_incoming(handle, ihandle, notifications_hook) _skip_incoming(handle, ihandle, notifications_hook)
write(ihandle, devnumber, request_data) write(ihandle, devnumber, request_data)
if no_reply:
return None
# we consider timeout from this point # we consider timeout from this point
request_started = _timestamp() request_started = _timestamp()
delta = 0 delta = 0

View File

@ -435,11 +435,11 @@ class KeysArray(object):
# #
def feature_request(device, feature, function=0x00, *params): def feature_request(device, feature, function=0x00, *params, no_reply=False):
if device.online and device.features: if device.online and device.features:
if feature in device.features: if feature in device.features:
feature_index = device.features.index(int(feature)) feature_index = device.features.index(int(feature))
return device.request((feature_index << 8) + (function & 0xFF), *params) return device.request((feature_index << 8) + (function & 0xFF), *params, no_reply=no_reply)
def get_firmware(device): def get_firmware(device):

View File

@ -284,15 +284,15 @@ class PairedDevice(object):
_log.info('%s: device notifications %s %s', self, 'enabled' if enable else 'disabled', flag_names) _log.info('%s: device notifications %s %s', self, 'enabled' if enable else 'disabled', flag_names)
return flag_bits if ok else None return flag_bits if ok else None
def request(self, request_id, *params): def request(self, request_id, *params, no_reply=False):
return _base.request(self.receiver.handle, self.number, request_id, *params) return _base.request(self.receiver.handle, self.number, request_id, *params, no_reply=no_reply)
read_register = _hidpp10.read_register read_register = _hidpp10.read_register
write_register = _hidpp10.write_register write_register = _hidpp10.write_register
def feature_request(self, feature, function=0x00, *params): def feature_request(self, feature, function=0x00, *params, no_reply=False):
if self.protocol >= 2.0: if self.protocol >= 2.0:
return _hidpp20.feature_request(self, feature, function, *params) return _hidpp20.feature_request(self, feature, function, *params, no_reply=no_reply)
def ping(self): def ping(self):
"""Checks if the device is online, returns True of False""" """Checks if the device is online, returns True of False"""