solaar-cli: return on the first match when searching for device name

results may be occasionally ambiguous, but the command runs faster
This commit is contained in:
Daniel Pavel 2012-12-13 15:12:51 +02:00
parent 59c5619b44
commit 9db2a65b31
2 changed files with 19 additions and 17 deletions

View File

@ -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)

View File

@ -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