updates to the command lines

This commit is contained in:
Daniel Pavel 2012-12-07 13:40:02 +02:00
parent ff6db1d00a
commit f0007d0a13
3 changed files with 95 additions and 94 deletions

View File

@ -21,23 +21,18 @@ def _require(module, os_package):
def _parse_arguments(): def _parse_arguments():
import argparse import argparse
arg_parser = argparse.ArgumentParser(prog=NAME.lower()) arg_parser = argparse.ArgumentParser(prog=NAME.lower())
arg_parser.add_argument('-S', '--no-systray', arg_parser.add_argument('-S', '--no-systray', action='store_false', dest='systray',
action='store_false', dest='systray',
help='don\'t embed the application window into the systray') help='don\'t embed the application window into the systray')
arg_parser.add_argument('-N', '--no-notifications', arg_parser.add_argument('-N', '--no-notifications', action='store_false', dest='notifications',
action='store_false', dest='notifications',
help='disable desktop notifications (shown only when in systray)') help='disable desktop notifications (shown only when in systray)')
arg_parser.add_argument('-v', '--verbose', arg_parser.add_argument('-d', '--debug', action='count', default=0,
action='count', default=0, help='print logging messages, for debugging purposes (may be repeated for extra verbosity)')
help='increase the logger verbosity (may be repeated)') arg_parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + __version__)
arg_parser.add_argument('-V', '--version',
action='version',
version='%(prog)s ' + __version__)
args = arg_parser.parse_args() args = arg_parser.parse_args()
import logging import logging
if args.verbose > 0: if args.debug > 0:
log_level = logging.WARNING - 10 * args.verbose log_level = logging.WARNING - 10 * args.debug
log_format='%(asctime)s %(levelname)8s [%(threadName)s] %(name)s: %(message)s' log_format='%(asctime)s %(levelname)8s [%(threadName)s] %(name)s: %(message)s'
logging.basicConfig(level=max(log_level, logging.DEBUG), format=log_format) logging.basicConfig(level=max(log_level, logging.DEBUG), format=log_format)
else: else:

View File

@ -23,6 +23,9 @@ def _require(module, os_package):
except ImportError: except ImportError:
_fail("missing required package '%s'" % os_package) _fail("missing required package '%s'" % os_package)
#
#
#
def _receiver(): def _receiver():
from logitech.unifying_receiver import Receiver from logitech.unifying_receiver import Receiver
@ -49,14 +52,15 @@ def _find_device(receiver, name):
return dev return dev
if len(name) < 3: if len(name) < 3:
_fail("need at least 3 characters to match the device") _fail("need at least 3 characters to match a device")
if name in 'receiver': name = name.lower()
if 'receiver'.startswith(name) or name == receiver.serial:
return receiver return receiver
dev = None dev = None
for d in receiver: for d in receiver:
if name in d.name.lower() or name in d.codename.lower(): if name == d.serial or name in d.name.lower() or name in d.codename.lower():
if dev is None: if dev is None:
dev = d dev = d
else: else:
@ -67,9 +71,9 @@ def _find_device(receiver, name):
return dev return dev
def _print_receiver(receiver, short=True): def _print_receiver(receiver, verbose=False):
if short: if not verbose:
print ("-: Unifying Receiver [%s:%s]" % (receiver.path, receiver.serial)) print ("-: Unifying Receiver [%s:%s] with %d devices" % (receiver.path, receiver.serial, receiver.count()))
return return
print ("-: Unifying Receiver") print ("-: Unifying Receiver")
@ -78,6 +82,8 @@ def _print_receiver(receiver, short=True):
for f in receiver.firmware: for f in receiver.firmware:
print (" %-11s: %s" % (f.kind, f.version)) print (" %-11s: %s" % (f.kind, f.version))
print (" Has %d paired device(s)." % receiver.count())
notifications = receiver.request(0x8100) notifications = receiver.request(0x8100)
if notifications: if notifications:
notifications = ord(notifications[0:1]) << 16 | ord(notifications[1:2]) << 8 notifications = ord(notifications[0:1]) << 16 | ord(notifications[1:2]) << 8
@ -87,96 +93,100 @@ def _print_receiver(receiver, short=True):
else: else:
print (" All notifications disabled.") print (" All notifications disabled.")
print (" Reported %d paired device(s)." % receiver.count())
activity = receiver.request(0x83B3) activity = receiver.request(0x83B3)
if activity: if activity:
activity = [(d, ord(activity[d - 1:d])) for d in range(1, receiver.max_devices)] activity = [(d, ord(activity[d - 1:d])) for d in range(1, receiver.max_devices)]
print(" Device activity counters: %s" % ', '.join(('%d=%d' % (d, a)) for d, a in activity if a > 0)) print(" Device activity counters: %s" % ', '.join(('%d=%d' % (d, a)) for d, a in activity if a > 0))
def _print_device(dev, short=True): def _print_device(dev, verbose=False):
p = dev.protocol p = dev.protocol
state = '' if p > 0 else ' inactive' state = '' if p > 0 else ' inactive'
if short: if not verbose:
print ("%d: %s [%s:%s]%s" % (dev.number, dev.name, dev.codename, dev.serial, state)) print ("%d: %s [%s:%s]%s" % (dev.number, dev.name, dev.codename, dev.serial, state))
return return
print ("%d: %s" % (dev.number, dev.name)) print ("%d: %s" % (dev.number, dev.name))
print (" Codename : %s" % dev.codename) print (" Codename : %s" % dev.codename)
print (" Kind : %s" % dev.kind) print (" Kind : %s" % dev.kind)
print (" Serial number: %s" % dev.serial)
print (" Wireless PID : %s" % dev.wpid)
if p == 0: if p == 0:
print (" Protocol : unknown (device is inactive)") print (" Protocol : unknown (device is inactive)")
else: else:
print (" Protocol : HID++ %1.1f" % p) print (" Protocol : HID++ %1.1f" % p)
print (" Polling rate : %d ms" % dev.polling_rate)
print (" Wireless PID : %s" % dev.wpid)
print (" Serial number: %s" % dev.serial)
for fw in dev.firmware: for fw in dev.firmware:
print (" %-11s: %s %s" % (fw.kind, fw.name, fw.version)) print (" %-11s: %s" % (fw.kind, (fw.name + ' ' + fw.version).strip()))
if dev.power_switch_location: if dev.power_switch_location:
print (" The power switch is located on the %s" % dev.power_switch_location) print (" The power switch is located on the %s" % dev.power_switch_location)
if p == 0:
return
from logitech.unifying_receiver import hidpp10, hidpp20 from logitech.unifying_receiver import hidpp10, hidpp20
if p > 0:
if dev.features: if dev.features:
print (" Supports %d HID++ 2.0 features:" % len(dev.features)) print (" Supports %d HID++ 2.0 features:" % len(dev.features))
for index, feature in enumerate(dev.features): for index, feature in enumerate(dev.features):
feature = dev.features[index] feature = dev.features[index]
flags = dev.request(0x0000, feature.bytes(2)) flags = dev.request(0x0000, feature.bytes(2))
flags = 0 if flags is None else ord(flags[1:2]) flags = 0 if flags is None else ord(flags[1:2])
flags = hidpp20.FEATURE_FLAG.flag_names(flags) flags = hidpp20.FEATURE_FLAG.flag_names(flags)
print (" %2d: %-20s {%04X} %s" % (index, feature, feature, flags)) print (" %2d: %-20s {%04X} %s" % (index, feature, feature, flags))
if dev.keys: if dev.keys:
print (" Has %d reprogrammable keys:" % len(dev.keys)) print (" Has %d reprogrammable keys:" % len(dev.keys))
for k in dev.keys: for k in dev.keys:
flags = hidpp20.KEY_FLAG.flag_names(k.flags) flags = hidpp20.KEY_FLAG.flag_names(k.flags)
print (" %2d: %-20s => %-20s %s" % (k.index, hidpp20.KEY[k.key], hidpp20.KEY[k.task], flags)) print (" %2d: %-20s => %-20s %s" % (k.index, k.key, k.task, flags))
battery = hidpp10.get_battery(dev) or hidpp20.get_battery(dev) if p > 0:
if battery: battery = hidpp20.get_battery(dev)
charge, status = battery if battery is None:
print (" Battery: %d%% charged, %s" % (charge, status)) battery = hidpp10.get_battery(dev)
if battery:
charge, status = battery
print (" Battery is %d%% charged, %s" % (charge, status))
else:
print (" Battery status unavailable.")
else: else:
print (" Battery report not supported.") print (" Battery status is unknown (device is inactive).")
#
#
#
def list_devices(receiver, args): def show_devices(receiver, args):
_print_receiver(receiver, args.short) if args.device == 'all':
for dev in receiver: _print_receiver(receiver, args.verbose)
if not args.short: for dev in receiver:
print ("") if args.verbose:
_print_device(dev, args.short) print ("")
_print_device(dev, args.verbose)
def show_device(receiver, args):
dev = _find_device(receiver, args.device)
if dev is receiver:
_print_receiver(receiver, False)
else: else:
_print_device(dev, False) dev = _find_device(receiver, args.device)
if dev is receiver:
_print_receiver(receiver, args.verbose)
else:
_print_device(dev, args.verbose)
def pair_device(receiver, args): def pair_device(receiver, args):
# get all current devices # get all current devices
known_devices = [dev.number for dev in receiver] known_devices = [dev.number for dev in receiver]
from threading import Event
done = Event()
from logitech.unifying_receiver import status from logitech.unifying_receiver import status
r_status = status.ReceiverStatus(receiver, lambda *args, **kwargs: None) r_status = status.ReceiverStatus(receiver, lambda *args, **kwargs: None)
done = False
def _events_handler(event): def _events_handler(event):
global done
if event.devnumber == 0xFF: if event.devnumber == 0xFF:
r_status.process_event(event) r_status.process_event(event)
if not r_status.lock_open: if not r_status.lock_open:
done.set() done = True
elif event.sub_id == 0x41 and event.address == 0x04: elif event.sub_id == 0x41 and event.address == 0x04:
if event.devnumber not in known_devices: if event.devnumber not in known_devices:
r_status.new_device = receiver[event.devnumber] r_status.new_device = receiver[event.devnumber]
@ -193,7 +203,7 @@ def pair_device(receiver, args):
receiver.set_lock(False, timeout=20) receiver.set_lock(False, timeout=20)
print ("Pairing: turn your new device on (timing out in 20 seconds).") print ("Pairing: turn your new device on (timing out in 20 seconds).")
while not done.is_set(): while not done:
event = base.read(receiver.handle, 2000) event = base.read(receiver.handle, 2000)
if event: if event:
event = base.make_event(*event) event = base.make_event(*event)
@ -214,9 +224,9 @@ def pair_device(receiver, args):
def unpair_device(receiver, args): def unpair_device(receiver, args):
dev = _find_device(receiver, args.device) dev = _find_device(receiver, args.device)
if dev is receiver: if dev is receiver:
_fail("cannot unpair the receiver") _fail("cannot unpair the receiver from itself!")
# query these # query these now, it's last chance to get them
number, name, codename, serial = dev.number, dev.name, dev.codename, dev.serial number, name, codename, serial = dev.number, dev.name, dev.codename, dev.serial
try: try:
del receiver[number] del receiver[number]
@ -228,41 +238,37 @@ def unpair_device(receiver, args):
def _parse_arguments(): def _parse_arguments():
import argparse import argparse
arg_parser = argparse.ArgumentParser(prog=NAME.lower()) arg_parser = argparse.ArgumentParser(prog=NAME.lower())
arg_parser.add_argument('-v', '--verbose', arg_parser.add_argument('-d', '--debug', action='count', default=0,
action='count', default=0, help='print logging messages, for debugging purposes (may be repeated for extra verbosity)')
help='increase the logger verbosity (may be repeated)') arg_parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + __version__)
arg_parser.add_argument('-V', '--version',
action='version',
version='%(prog)s ' + __version__)
subparsers = arg_parser.add_subparsers(title='sub-commands')
list_p = subparsers.add_parser('list', help='list paired devices') subparsers = arg_parser.add_subparsers(title='commands')
list_p.add_argument('--full', action='store_false', dest='short',
help='print full info about each device')
list_p.set_defaults(cmd=list_devices)
show_p = subparsers.add_parser('show', help='show info about a single device', sp = subparsers.add_parser('show', help='show information about paired devices')
epilog='The <device> argument may be a device number (1..6),' sp.add_argument('device', nargs='?', default='all',
' at least 3 characters of a device\'s name,' help='device to show information about; may be a device number (1..6), a device serial, '
' or "receiver".') 'at least 3 characters of a device\'s name, "receiver", or "all" (the default)')
show_p.add_argument('device', help='device to show information about') sp.add_argument('-v', '--verbose', action='store_true',
show_p.set_defaults(cmd=show_device) help='print all available information about the inspected device(s)')
sp.set_defaults(cmd=show_devices)
pair_p = subparsers.add_parser('pair', help='pair a new device')
pair_p.set_defaults(cmd=pair_device)
unpair_p = subparsers.add_parser('unpair', help='unpair a device', sp = subparsers.add_parser('pair', help='pair a new device',
epilog='The <device> argument may be a device number (1..6),' epilog='The Logitech Unifying Receiver supports up to 6 paired devices at the same time.')
' or at least 3 characters of a device\'s name.') sp.set_defaults(cmd=pair_device)
unpair_p.add_argument('device', help='device to unpair')
unpair_p.set_defaults(cmd=unpair_device) sp = subparsers.add_parser('unpair', help='unpair a device')
sp.add_argument('device',
help='device to unpair; may be a device number (1..6), a device serial, '
'or at least 3 characters of a device\'s name.')
sp.set_defaults(cmd=unpair_device)
args = arg_parser.parse_args() args = arg_parser.parse_args()
import logging import logging
if args.verbose > 0: if args.debug > 0:
log_level = logging.WARNING - 10 * args.verbose log_level = logging.WARNING - 10 * args.debug
log_format='%(asctime)s %(levelname)8s [%(threadName)s] %(name)s: %(message)s' log_format='%(asctime)s %(levelname)8s %(name)s: %(message)s'
logging.basicConfig(level=max(log_level, logging.DEBUG), format=log_format) logging.basicConfig(level=max(log_level, logging.DEBUG), format=log_format)
else: else:
logging.root.addHandler(logging.NullHandler()) logging.root.addHandler(logging.NullHandler())

View File

@ -101,7 +101,7 @@ if __name__ == '__main__':
else: else:
# the devices might reply quite slow # the devices might reply quite slow
rlist, wlist, xlist = _select([handle], [], [], 1) rlist, wlist, xlist = _select([handle], [], [], 1)
time.sleep(0.050) time.sleep(1)
except EOFError: except EOFError:
pass pass
except Exception as e: except Exception as e: