179 lines
6.0 KiB
Python
179 lines
6.0 KiB
Python
## Copyright (C) 2012-2013 Daniel Pavel
|
|
## Copyright (C) 2014-2024 Solaar Contributors https://pwr-solaar.github.io/Solaar/
|
|
##
|
|
## This program is free software; you can redistribute it and/or modify
|
|
## it under the terms of the GNU General Public License as published by
|
|
## the Free Software Foundation; either version 2 of the License, or
|
|
## (at your option) any later version.
|
|
##
|
|
## This program is distributed in the hope that it will be useful,
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
## GNU General Public License for more details.
|
|
##
|
|
## You should have received a copy of the GNU General Public License along
|
|
## with this program; if not, write to the Free Software Foundation, Inc.,
|
|
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
from enum import IntEnum
|
|
|
|
from .common import NamedInts
|
|
|
|
"""HID constants for HID++ 1.0.
|
|
|
|
Most of them as defined by the official Logitech HID++ 1.0
|
|
documentation, some of them guessed.
|
|
"""
|
|
|
|
DEVICE_KIND = NamedInts(
|
|
unknown=0x00,
|
|
keyboard=0x01,
|
|
mouse=0x02,
|
|
numpad=0x03,
|
|
presenter=0x04,
|
|
remote=0x07,
|
|
trackball=0x08,
|
|
touchpad=0x09,
|
|
tablet=0x0A,
|
|
gamepad=0x0B,
|
|
joystick=0x0C,
|
|
headset=0x0D, # not from Logitech documentation
|
|
remote_control=0x0E, # for compatibility with HID++ 2.0
|
|
receiver=0x0F, # for compatibility with HID++ 2.0
|
|
)
|
|
|
|
POWER_SWITCH_LOCATION = NamedInts(
|
|
base=0x01,
|
|
top_case=0x02,
|
|
edge_of_top_right_corner=0x03,
|
|
top_left_corner=0x05,
|
|
bottom_left_corner=0x06,
|
|
top_right_corner=0x07,
|
|
bottom_right_corner=0x08,
|
|
top_edge=0x09,
|
|
right_edge=0x0A,
|
|
left_edge=0x0B,
|
|
bottom_edge=0x0C,
|
|
)
|
|
|
|
# Some flags are used both by devices and receivers. The Logitech documentation
|
|
# mentions that the first and last (third) byte are used for devices while the
|
|
# second is used for the receiver. In practise, the second byte is also used for
|
|
# some device-specific notifications (keyboard illumination level). Do not
|
|
# simply set all notification bits if the software does not support it. For
|
|
# example, enabling keyboard_sleep_raw makes the Sleep key a no-operation unless
|
|
# the software is updated to handle that event.
|
|
# Observations:
|
|
# - wireless and software present were seen on receivers, reserved_r1b4 as well
|
|
# - the rest work only on devices as far as we can tell right now
|
|
# In the future would be useful to have separate enums for receiver and device notification flags,
|
|
# but right now we don't know enough.
|
|
# additional flags taken from https://drive.google.com/file/d/0BxbRzx7vEV7eNDBheWY0UHM5dEU/view?usp=sharing
|
|
NOTIFICATION_FLAG = NamedInts(
|
|
numpad_numerical_keys=0x800000,
|
|
f_lock_status=0x400000,
|
|
roller_H=0x200000,
|
|
battery_status=0x100000, # send battery charge notifications (0x07 or 0x0D)
|
|
mouse_extra_buttons=0x080000,
|
|
roller_V=0x040000,
|
|
power_keys=0x020000, # system control keys such as Sleep
|
|
keyboard_multimedia_raw=0x010000, # consumer controls such as Mute and Calculator
|
|
multi_touch=0x001000, # notify on multi-touch changes
|
|
software_present=0x000800, # software is controlling part of device behaviour
|
|
link_quality=0x000400, # notify on link quality changes
|
|
ui=0x000200, # notify on UI changes
|
|
wireless=0x000100, # notify when the device wireless goes on/off-line
|
|
configuration_complete=0x000004,
|
|
voip_telephony=0x000002,
|
|
threed_gesture=0x000001,
|
|
)
|
|
|
|
ERROR = NamedInts(
|
|
invalid_SubID__command=0x01,
|
|
invalid_address=0x02,
|
|
invalid_value=0x03,
|
|
connection_request_failed=0x04,
|
|
too_many_devices=0x05,
|
|
already_exists=0x06,
|
|
busy=0x07,
|
|
unknown_device=0x08,
|
|
resource_error=0x09,
|
|
request_unavailable=0x0A,
|
|
unsupported_parameter_value=0x0B,
|
|
wrong_pin_code=0x0C,
|
|
)
|
|
|
|
PAIRING_ERRORS = NamedInts(device_timeout=0x01, device_not_supported=0x02, too_many_devices=0x03, sequence_timeout=0x06)
|
|
BOLT_PAIRING_ERRORS = NamedInts(device_timeout=0x01, failed=0x02)
|
|
|
|
|
|
class Registers(IntEnum):
|
|
"""Known HID registers.
|
|
|
|
Devices usually have a (small) sub-set of these. Some registers are only
|
|
applicable to certain device kinds (e.g. smooth_scroll only applies to mice).
|
|
"""
|
|
|
|
# Generally applicable
|
|
NOTIFICATIONS = 0x00
|
|
FIRMWARE = 0xF1
|
|
|
|
# only apply to receivers
|
|
RECEIVER_CONNECTION = 0x02
|
|
RECEIVER_PAIRING = 0xB2
|
|
DEVICES_ACTIVITY = 0x2B3
|
|
RECEIVER_INFO = 0x2B5
|
|
BOLT_DEVICE_DISCOVERY = 0xC0
|
|
BOLT_PAIRING = 0x2C1
|
|
BOLT_UNIQUE_ID = 0x02FB
|
|
|
|
# only apply to devices
|
|
MOUSE_BUTTON_FLAGS = 0x01
|
|
KEYBOARD_HAND_DETECTION = 0x01
|
|
DEVICES_CONFIGURATION = 0x03
|
|
BATTERY_STATUS = 0x07
|
|
KEYBOARD_FN_SWAP = 0x09
|
|
BATTERY_CHARGE = 0x0D
|
|
KEYBOARD_ILLUMINATION = 0x17
|
|
THREE_LEDS = 0x51
|
|
MOUSE_DPI = 0x63
|
|
|
|
# notifications
|
|
PASSKEY_REQUEST_NOTIFICATION = 0x4D
|
|
PASSKEY_PRESSED_NOTIFICATION = 0x4E
|
|
DEVICE_DISCOVERY_NOTIFICATION = 0x4F
|
|
DISCOVERY_STATUS_NOTIFICATION = 0x53
|
|
PAIRING_STATUS_NOTIFICATION = 0x54
|
|
|
|
|
|
# Subregisters for receiver_info register
|
|
INFO_SUBREGISTERS = NamedInts(
|
|
serial_number=0x01, # not found on many receivers
|
|
fw_version=0x02,
|
|
receiver_information=0x03,
|
|
pairing_information=0x20, # 0x2N, by connected device
|
|
extended_pairing_information=0x30, # 0x3N, by connected device
|
|
device_name=0x40, # 0x4N, by connected device
|
|
bolt_pairing_information=0x50, # 0x5N, by connected device
|
|
bolt_device_name=0x60, # 0x6N01, by connected device,
|
|
)
|
|
|
|
# Flags taken from https://drive.google.com/file/d/0BxbRzx7vEV7eNDBheWY0UHM5dEU/view?usp=sharing
|
|
DEVICE_FEATURES = NamedInts(
|
|
reserved1=0x010000,
|
|
special_buttons=0x020000,
|
|
enhanced_key_usage=0x040000,
|
|
fast_fw_rev=0x080000,
|
|
reserved2=0x100000,
|
|
reserved3=0x200000,
|
|
scroll_accel=0x400000,
|
|
buttons_control_resolution=0x800000,
|
|
inhibit_lock_key_sound=0x000001,
|
|
reserved4=0x000002,
|
|
mx_air_3d_engine=0x000004,
|
|
host_control_leds=0x000008,
|
|
reserved5=0x000010,
|
|
reserved6=0x000020,
|
|
reserved7=0x000040,
|
|
reserved8=0x000080,
|
|
)
|