From 7bb7a092a42724053b8e2e309c884ed379dbfbd1 Mon Sep 17 00:00:00 2001 From: Daniel Pavel Date: Wed, 12 Dec 2012 21:41:29 +0200 Subject: [PATCH] descriptors update (new device K230) also assume by default all devices have battery info in register 0x0D, and blacklist them when that's not the case --- lib/logitech/unifying_receiver/descriptors.py | 9 ++--- lib/logitech/unifying_receiver/hidpp10.py | 39 +++++++++++++------ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/lib/logitech/unifying_receiver/descriptors.py b/lib/logitech/unifying_receiver/descriptors.py index e4810d97..57823594 100644 --- a/lib/logitech/unifying_receiver/descriptors.py +++ b/lib/logitech/unifying_receiver/descriptors.py @@ -43,9 +43,9 @@ _D('Wireless Mouse M525') _D('Wireless Trackball M570') _D('Touch Mouse M600') _D('Marathon Mouse M705', - registers=_NamedInts(battery=0x0D), settings=[hidpp10.SmoothScroll_Setting(0x01)], ) +_D('Wireless Keyboard K230') _D('Wireless Keyboard K270') _D('Wireless Keyboard K350') _D('Wireless Keyboard K360') @@ -55,13 +55,10 @@ _D('Wireless Illuminated Keyboard K800') _D('Zone Touch Mouse T400') _D('Wireless Rechargeable Touchpad T650') _D('Logitech Cube', kind='mouse') -_D('Anywhere Mouse MX', codename='Anywhere MX', - registers=_NamedInts(battery=0x0D), - ) +_D('Anywhere Mouse MX', codename='Anywhere MX') _D('Performance Mouse MX', codename='Performance MX', - registers=_NamedInts(battery=0x0D), settings=[ - hidpp10.MouseDPI_Setting(0x63, _NamedInts(**dict((str(x * 100), 0x80 + x) for x in range(1, 16)))), + hidpp10.MouseDPI_Setting(0x63, _NamedInts(**{str(x * 100): (0x80 + x) for x in range(1, 16)})), ], ) diff --git a/lib/logitech/unifying_receiver/hidpp10.py b/lib/logitech/unifying_receiver/hidpp10.py index 9912cf19..fa56ebe6 100644 --- a/lib/logitech/unifying_receiver/hidpp10.py +++ b/lib/logitech/unifying_receiver/hidpp10.py @@ -4,8 +4,13 @@ from __future__ import absolute_import, division, print_function, unicode_literals +from logging import getLogger, DEBUG as _DEBUG +_log = getLogger('LUR').getChild('hidpp10') +del getLogger + from .common import (strhex as _strhex, NamedInts as _NamedInts, + NamedInt as _NamedInt, FirmwareInfo as _FirmwareInfo) from . import settings as _settings from .hidpp20 import FIRMWARE_KIND @@ -119,20 +124,30 @@ class MouseDPI_Setting(_settings.Setting): # functions # -def get_battery(device): - """Reads a device's battery level, if provided by the HID++ 1.0 protocol.""" - if 'battery' in device.registers: - register = device.registers['battery'] - +def get_register(device, name, default_number=-1): + known_register = device.registers[name] + register = known_register or default_number + if register > 0: reply = device.request(0x8100 + (register & 0xFF)) if reply: - charge = ord(reply[:1]) - status = ord(reply[2:3]) & 0xF0 - status = ('discharging' if status == 0x30 - else 'charging' if status == 0x50 - else 'fully charged' if status == 0x90 - else None) - return charge, status + return reply + + if not known_register and device.ping(): + _log.warn("%s: failed to read '%s' from default register 0x%02X, blacklisting", device, name, default_number) + device.registers[-default_number] = name + + +def get_battery(device): + """Reads a device's battery level, if provided by the HID++ 1.0 protocol.""" + reply = get_register(device, 'battery', 0x0D) + if reply: + charge = ord(reply[:1]) + status = ord(reply[2:3]) & 0xF0 + status = ('discharging' if status == 0x30 + else 'charging' if status == 0x50 + else 'fully charged' if status == 0x90 + else None) + return charge, status def get_serial(device):