110 lines
3.3 KiB
Python
110 lines
3.3 KiB
Python
#
|
|
# Constants used by the rest of the API.
|
|
#
|
|
|
|
from struct import pack as _pack
|
|
from binascii import hexlify as _hexlify
|
|
_hex = lambda d: _hexlify(d).decode('ascii').upper()
|
|
|
|
from .common import (FallbackDict, list2dict)
|
|
|
|
|
|
"""Possible features available on a Logitech device.
|
|
|
|
A particular device might not support all these features, and may support other
|
|
unknown features as well.
|
|
"""
|
|
FEATURE = type('FEATURE', (),
|
|
dict(
|
|
ROOT=b'\x00\x00',
|
|
FEATURE_SET=b'\x00\x01',
|
|
FIRMWARE=b'\x00\x03',
|
|
NAME=b'\x00\x05',
|
|
BATTERY=b'\x10\x00',
|
|
REPROGRAMMABLE_KEYS=b'\x1B\x00',
|
|
WIRELESS=b'\x1D\x4B',
|
|
SOLAR_CHARGE=b'\x43\x01',
|
|
))
|
|
|
|
def _feature_name(key):
|
|
if key is None:
|
|
return None
|
|
if type(key) == int:
|
|
return FEATURE_NAME[_pack('!H', key)]
|
|
return 'UNKNOWN_' + _hex(key)
|
|
|
|
|
|
"""Feature names indexed by feature id."""
|
|
FEATURE_NAME = FallbackDict(_feature_name)
|
|
FEATURE_NAME[FEATURE.ROOT] = 'ROOT'
|
|
FEATURE_NAME[FEATURE.FEATURE_SET] = 'FEATURE_SET'
|
|
FEATURE_NAME[FEATURE.FIRMWARE] = 'FIRMWARE'
|
|
FEATURE_NAME[FEATURE.NAME] = 'NAME'
|
|
FEATURE_NAME[FEATURE.BATTERY] = 'BATTERY'
|
|
FEATURE_NAME[FEATURE.REPROGRAMMABLE_KEYS] = 'REPROGRAMMABLE_KEYS'
|
|
FEATURE_NAME[FEATURE.WIRELESS] = 'WIRELESS'
|
|
FEATURE_NAME[FEATURE.SOLAR_CHARGE] = 'SOLAR_CHARGE'
|
|
|
|
|
|
FEATURE_FLAGS = { 0x20: 'internal', 0x40: 'hidden', 0x80: 'obsolete' }
|
|
|
|
|
|
_DEVICE_KINDS = ('keyboard', 'remote control', 'numpad', 'mouse',
|
|
'touchpad', 'trackball', 'presenter', 'receiver')
|
|
|
|
"""Possible types of devices connected to an UR."""
|
|
DEVICE_KIND = FallbackDict(lambda x: 'unknown', list2dict(_DEVICE_KINDS))
|
|
|
|
|
|
_FIRMWARE_KINDS = ('Firmware', 'Bootloader', 'Hardware', 'Other')
|
|
|
|
"""Names of different firmware levels possible, indexed by level."""
|
|
FIRMWARE_KIND = FallbackDict(lambda x: 'Unknown', list2dict(_FIRMWARE_KINDS))
|
|
|
|
|
|
_BATTERY_STATUSES = ('Discharging (in use)', 'Recharging', 'Almost full',
|
|
'Full', 'Slow recharge', 'Invalid battery', 'Thermal error',
|
|
'Charging error')
|
|
|
|
"""Names for possible battery status values."""
|
|
BATTERY_STATUS = FallbackDict(lambda x: 'unknown', list2dict(_BATTERY_STATUSES))
|
|
|
|
_KEY_NAMES = ( 'unknown_0000', 'Volume up', 'Volume down', 'Mute', 'Play/Pause',
|
|
'Next', 'Previous', 'Stop', 'Application switcher',
|
|
'unknown_0009', 'Calculator', 'unknown_000B', 'unknown_000C',
|
|
'unknown_000D', 'Mail')
|
|
|
|
"""Standard names for reprogrammable keys."""
|
|
KEY_NAME = FallbackDict(lambda x: 'unknown_%04X' % x, list2dict(_KEY_NAMES))
|
|
|
|
"""Possible flags on a reprogrammable key."""
|
|
KEY_FLAG = type('KEY_FLAG', (), dict(
|
|
REPROGRAMMABLE=0x10,
|
|
FN_SENSITIVE=0x08,
|
|
NONSTANDARD=0x04,
|
|
IS_FN=0x02,
|
|
MSE=0x01,
|
|
))
|
|
|
|
KEY_FLAG_NAME = FallbackDict(lambda x: 'unknown')
|
|
KEY_FLAG_NAME[KEY_FLAG.REPROGRAMMABLE] = 'reprogrammable'
|
|
KEY_FLAG_NAME[KEY_FLAG.FN_SENSITIVE] = 'fn-sensitive'
|
|
KEY_FLAG_NAME[KEY_FLAG.NONSTANDARD] = 'nonstandard'
|
|
KEY_FLAG_NAME[KEY_FLAG.IS_FN] = 'is-fn'
|
|
KEY_FLAG_NAME[KEY_FLAG.MSE] = 'mse'
|
|
|
|
_ERROR_NAMES = ('Ok', 'Unknown', 'Invalid argument', 'Out of range',
|
|
'Hardware error', 'Logitech internal', 'Invalid feature index',
|
|
'Invalid function', 'Busy', 'Unsupported')
|
|
|
|
"""Names for error codes."""
|
|
ERROR_NAME = FallbackDict(lambda x: 'Unknown error', list2dict(_ERROR_NAMES))
|
|
|
|
|
|
"""Maximum number of devices that can be attached to a single receiver."""
|
|
MAX_ATTACHED_DEVICES = 6
|
|
|
|
|
|
del FallbackDict
|
|
del list2dict
|