diff --git a/lib/logitech/unifying_receiver/base.py b/lib/logitech/unifying_receiver/base.py index f174f0cb..0d9b6957 100644 --- a/lib/logitech/unifying_receiver/base.py +++ b/lib/logitech/unifying_receiver/base.py @@ -209,11 +209,12 @@ def _skip_incoming(handle): raise NoReceiver(reason=reason) if data: - report_id = ord(data[:1]) - assert (report_id == 0x10 and len(data) == _SHORT_MESSAGE_SIZE or - report_id == 0x11 and len(data) == _LONG_MESSAGE_SIZE or - report_id == 0x20 and len(data) == _MEDIUM_MESSAGE_SIZE) _unhandled(report_id, ord(data[1:2]), data[2:]) + if _log.isEnabledFor(_DEBUG): + report_id = ord(data[:1]) + assert (report_id == 0x10 and len(data) == _SHORT_MESSAGE_SIZE or + report_id == 0x11 and len(data) == _LONG_MESSAGE_SIZE or + report_id == 0x20 and len(data) == _MEDIUM_MESSAGE_SIZE) else: return diff --git a/lib/logitech/unifying_receiver/hidpp10.py b/lib/logitech/unifying_receiver/hidpp10.py index 9d7ab648..7295e7e9 100644 --- a/lib/logitech/unifying_receiver/hidpp10.py +++ b/lib/logitech/unifying_receiver/hidpp10.py @@ -5,7 +5,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals from logging import getLogger # , DEBUG as _DEBUG -_log = getLogger('LUR').getChild('hidpp10') +_log = getLogger('LUR.hidpp10') del getLogger from .common import (strhex as _strhex, diff --git a/lib/logitech/unifying_receiver/hidpp20.py b/lib/logitech/unifying_receiver/hidpp20.py index eb5ae053..d59ebdc7 100644 --- a/lib/logitech/unifying_receiver/hidpp20.py +++ b/lib/logitech/unifying_receiver/hidpp20.py @@ -8,7 +8,7 @@ from struct import pack as _pack, unpack as _unpack from weakref import proxy as _proxy from logging import getLogger, DEBUG as _DEBUG -_log = getLogger('LUR').getChild('hidpp20') +_log = getLogger('LUR.hidpp20') del getLogger from .common import (FirmwareInfo as _FirmwareInfo, diff --git a/lib/logitech/unifying_receiver/listener.py b/lib/logitech/unifying_receiver/listener.py index 9e6b4604..57436e49 100644 --- a/lib/logitech/unifying_receiver/listener.py +++ b/lib/logitech/unifying_receiver/listener.py @@ -14,7 +14,7 @@ except ImportError: from queue import Queue as _Queue from logging import getLogger, DEBUG as _DEBUG -_log = getLogger('LUR').getChild('listener') +_log = getLogger('LUR.listener') del getLogger from . import base as _base @@ -94,7 +94,7 @@ class ThreadedHandle(object): # a while for it to acknowledge it. _EVENT_READ_TIMEOUT = 500 -# After this many read that did not produce a packet, call the tick() method. +# After this many reads that did not produce a packet, call the tick() method. _IDLE_READS = 4 @@ -148,11 +148,12 @@ class EventsListener(_threading.Thread): if n: # if _log.isEnabledFor(_DEBUG): - # _log.debug("processing %s", n) + # _log.debug("%s: processing %s", self.receiver, n) try: self._notifications_callback(n) except: _log.exception("processing %s", n) + elif self.tick_period: idle_reads += 1 if idle_reads % _IDLE_READS == 0: diff --git a/lib/logitech/unifying_receiver/receiver.py b/lib/logitech/unifying_receiver/receiver.py index 200ff645..551d2b55 100644 --- a/lib/logitech/unifying_receiver/receiver.py +++ b/lib/logitech/unifying_receiver/receiver.py @@ -8,7 +8,7 @@ import errno as _errno from weakref import proxy as _proxy from logging import getLogger -_log = getLogger('LUR').getChild('receiver') +_log = getLogger('LUR.receiver') del getLogger from . import base as _base @@ -190,7 +190,7 @@ class PairedDevice(object): return self.serial.__hash__() def __str__(self): - return '' % (self.number, self.codename or '?') + return '' % (self.number, self.wpid, self.codename or '?') __unicode__ = __repr__ = __str__ # @@ -260,21 +260,26 @@ class Receiver(object): # clear out all possible flags ok = self.request(0x8000) + flags = self.request(0x8100) + if flags: + flags = ord(flags[0:1]) << 16 | ord(flags[1:2]) << 8 | ord(flags[2:3]) + flags = tuple(_hidpp10.NOTIFICATION_FLAG.flag_names(flags)) + if ok: - _log.info("device notifications %s", 'enabled' if enable else 'disabled') + _log.info("%s: device notifications %s %s", self, 'enabled' if enable else 'disabled', flags) else: - _log.warn("failed to %s device notifications", 'enable' if enable else 'disable') + _log.warn("%s: failed to %s device notifications %s", self, 'enable' if enable else 'disable', flags) return ok def notify_devices(self): """Scan all devices.""" if self.handle: if not self.request(0x8002, 0x02): - _log.warn("failed to trigger device link notifications") + _log.warn("%s: failed to trigger device link notifications", self) def register_new_device(self, number): if self._devices.get(number) is not None: - raise IndexError("device number %d already registered" % number) + raise IndexError("%s: device number %d already registered" % (self, number)) dev = PairedDevice(self, number) # create a device object, but only use it if the receiver knows about it @@ -287,7 +292,7 @@ class Receiver(object): # return dev if dev.wpid: - _log.info("found device %d (%s)", number, dev.wpid) + _log.info("%s: found Unifying device %d (%s)", self, number, dev.wpid) self._devices[number] = dev return dev self._devices[number] = None @@ -298,7 +303,7 @@ class Receiver(object): reply = self.request(0x80B2, lock, device, timeout) if reply: return True - _log.warn("failed to %s the receiver lock", 'close' if lock_closed else 'open') + _log.warn("%s: failed to %s the receiver lock", self, 'close' if lock_closed else 'open') def count(self): count = self.request(0x8102) diff --git a/lib/logitech/unifying_receiver/status.py b/lib/logitech/unifying_receiver/status.py index 7eb1f777..c3d720a6 100644 --- a/lib/logitech/unifying_receiver/status.py +++ b/lib/logitech/unifying_receiver/status.py @@ -218,7 +218,7 @@ class DeviceStatus(dict): if _log.isEnabledFor(_DEBUG): sw_present = bool(flags & 0x10) has_payload = bool(flags & 0x80) - _log.debug("%s: connection notification: software=%s, encrypted=%s, link=%s, payload=%s", + _log.debug("%s: unifying connection notification: software=%s, encrypted=%s, link=%s, payload=%s", self._device, sw_present, link_encrypyed, link_established, has_payload) self[ENCRYPTED] = link_encrypyed self._changed(link_established) diff --git a/lib/solaar/cli.py b/lib/solaar/cli.py index 4fec12b0..d63a69c7 100644 --- a/lib/solaar/cli.py +++ b/lib/solaar/cli.py @@ -5,6 +5,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals import sys +import logging NAME = 'solaar-cli' @@ -15,6 +16,8 @@ from solaar import __version__ # def _fail(text): + if sys.exc_info()[0]: + logging.exception(text) sys.exit("%s: error: %s" % (NAME, text)) @@ -364,7 +367,6 @@ def _parse_arguments(): args = arg_parser.parse_args() - import logging if args.debug > 0: log_level = logging.WARNING - 10 * args.debug log_format='%(asctime)s %(levelname)8s %(name)s: %(message)s' diff --git a/lib/solaar/listener.py b/lib/solaar/listener.py index 5f63b7f6..a58302e3 100644 --- a/lib/solaar/listener.py +++ b/lib/solaar/listener.py @@ -5,7 +5,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals from logging import getLogger, DEBUG as _DEBUG -_log = getLogger('listener') +_log = getLogger('solaar.listener') del getLogger from logitech.unifying_receiver import (Receiver, @@ -53,13 +53,13 @@ class ReceiverListener(_listener.EventsListener): receiver.status = _status.ReceiverStatus(receiver, self._status_changed) def has_started(self): - _log.info("notifications listener has started") + _log.info("%s: notifications listener has started (%s)", self.receiver, self.receiver.handle) self.receiver.enable_notifications() self.receiver.notify_devices() self._status_changed(self.receiver, _status.ALERT.LOW) def has_stopped(self): - _log.info("notifications listener has stopped") + _log.info("%s: notifications listener has stopped", self.receiver) if self.receiver: self.receiver.enable_notifications(False) self.receiver.close() @@ -68,12 +68,12 @@ class ReceiverListener(_listener.EventsListener): def tick(self, timestamp): if _log.isEnabledFor(_DEBUG): - _log.debug("polling status: %s %s", self.receiver, list(iter(self.receiver))) + _log.debug("%s: polling status: %s", self.receiver, list(iter(self.receiver))) if self._last_tick > 0 and timestamp - self._last_tick > _POLL_TICK * 3: # if we missed a couple of polls, most likely the computer went into # sleep, and we have to reinitialize the receiver again - _log.warn("possible sleep detected, closing this listener") + _log.warn("%s: possible sleep detected, closing this listener", self.receiver) self.stop() return @@ -114,6 +114,7 @@ class ReceiverListener(_listener.EventsListener): def _notifications_handler(self, n): assert self.receiver + # _log.debug("%s: handling %s", self.receiver, n) if n.devnumber == 0xFF: # a receiver notification if self.receiver.status is not None: @@ -125,7 +126,7 @@ class ReceiverListener(_listener.EventsListener): dev = self.receiver[n.devnumber] if not dev: - _log.warn("received %s for invalid device %d: %r", n, n.devnumber, dev) + _log.warn("%s: received %s for invalid device %d: %r", self.receiver, n, n.devnumber, dev) return if not already_known: @@ -141,7 +142,7 @@ class ReceiverListener(_listener.EventsListener): if self.receiver.status.lock_open and not already_known: # this should be the first notification after a device was paired assert n.sub_id == 0x41 and n.address == 0x04 - _log.info("pairing detected new device") + _log.info("%s: pairing detected new device", self.receiver) self.receiver.status.new_device = dev def __str__(self):