From 9db2a65b31ecfb9802af8a8da8cb922ed4447af1 Mon Sep 17 00:00:00 2001 From: Daniel Pavel Date: Thu, 13 Dec 2012 15:12:51 +0200 Subject: [PATCH] solaar-cli: return on the first match when searching for device name results may be occasionally ambiguous, but the command runs faster --- app/solaar_cli.py | 29 +++++++++++--------------- lib/logitech/unifying_receiver/base.py | 7 +++++++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/solaar_cli.py b/app/solaar_cli.py index 0b64e1e0..a63591cf 100644 --- a/app/solaar_cli.py +++ b/app/solaar_cli.py @@ -40,7 +40,7 @@ def _receiver(): return r -def _find_device(receiver, name): +def _find_device(receiver, name, may_be_receiver=False): if len(name) == 1: try: number = int(name) @@ -57,20 +57,17 @@ def _find_device(receiver, name): _fail("need at least 3 characters to match a device") name = name.lower() - if 'receiver'.startswith(name) or name.upper() == receiver.serial: + if may_be_receiver and ('receiver'.startswith(name) or name == receiver.serial.lower()): return receiver - dev = None - for d in receiver: - if name.upper() == d.serial or name in d.name.lower() or name in d.codename.lower(): - if dev is None: - dev = d - else: - _fail("'%s' matches multiple devices" % name) + for dev in receiver: + if (name == dev.serial.lower() or + name == dev.codename.lower() or + name == str(dev.kind).lower() or + name in dev.name.lower()): + return dev - if dev is None: - _fail("no device found matching '%s'" % name) - return dev + _fail("no device found matching '%s'" % name) def _print_receiver(receiver, verbose=False): @@ -169,7 +166,7 @@ def show_devices(receiver, args): print ("") _print_device(dev, args.verbose) else: - dev = _find_device(receiver, args.device) + dev = _find_device(receiver, args.device, True) if dev is receiver: _print_receiver(receiver, args.verbose) else: @@ -230,8 +227,6 @@ def pair_device(receiver, args): def unpair_device(receiver, args): dev = _find_device(receiver, args.device) - if dev is receiver: - _fail("cannot unpair the receiver from itself!") # query these now, it's last chance to get them number, name, codename, serial = dev.number, dev.name, dev.codename, dev.serial @@ -244,8 +239,8 @@ def unpair_device(receiver, args): def config_device(receiver, args): dev = _find_device(receiver, args.device) - if dev is receiver: - _fail("no settings for the receiver") + # if dev is receiver: + # _fail("no settings for the receiver") if not dev.settings: _fail("no settings for %s" % dev.name) diff --git a/lib/logitech/unifying_receiver/base.py b/lib/logitech/unifying_receiver/base.py index 5393250c..b0d98bc6 100644 --- a/lib/logitech/unifying_receiver/base.py +++ b/lib/logitech/unifying_receiver/base.py @@ -266,6 +266,10 @@ def request(handle, devnumber, request_id, *params): :param params: parameters for the feature call, 3 to 16 bytes. :returns: the reply data, or ``None`` if some error occured. """ + + # import inspect as _inspect + # print ('\n '.join(str(s) for s in _inspect.stack())) + assert isinstance(request_id, int) if devnumber != 0xFF and request_id < 0x8000: timeout = _DEVICE_REQUEST_TIMEOUT @@ -353,6 +357,9 @@ def ping(handle, devnumber): if _log.isEnabledFor(_DEBUG): _log.debug("(%s) pinging device %d", handle, devnumber) + # import inspect as _inspect + # print ('\n '.join(str(s) for s in _inspect.stack())) + # randomize the SoftwareId and mark byte to be able to identify the ping # reply, and set most significant (0x8) bit in SoftwareId so that the reply # is always distinguishable from notifications