Solaar/docs/features.md

11 KiB
Raw Blame History

title layout
List of HID++ 2.0 features page

Feature status

See functions in hidpp20.py and settings_templates.py

Feature ID Status Notes
ROOT 0x0000 ✔️ System
FEATURE_SET 0x0001 ✔️ System
FEATURE_INFO 0x0002 ✔️ System
DEVICE_FW_VERSION 0x0003 ✔️ get_firmware(), read only
DEVICE_UNIT_ID 0x0004
DEVICE_NAME 0x0005 ✔️ get_kind(), get_name(), read only
DEVICE_GROUPS 0x0006
DEVICE_FRIENDLY_NAME 0x0007
KEEP_ALIVE 0x0008
RESET 0x0020 aka "Config Change"
CRYPTO_ID 0x0021
TARGET_SOFTWARE 0x0030
WIRELESS_SIGNAL_STRENGTH 0x0080
DFUCONTROL_LEGACY 0x00C0
DFUCONTROL_UNSIGNED 0x00C1
DFUCONTROL_SIGNED 0x00C2
DFU 0x00D0
BATTERY_STATUS 0x1000 ✔️ get_battery(), read only
BATTERY_VOLTAGE 0x1001 ✔️ get_voltage(), read only
CHARGING_CONTROL 0x1010
LED_CONTROL 0x1300
GENERIC_TEST 0x1800
DEVICE_RESET 0x1802
OOBSTATE 0x1805
CONFIG_DEVICE_PROPS 0x1806
CHANGE_HOST 0x1814
HOSTS_INFO 0x1815
BACKLIGHT 0x1981
BACKLIGHT2 0x1982 ✔️ _feature_backlight2()
BACKLIGHT3 0x1983
PRESENTER_CONTROL 0x1A00
SENSOR_3D 0x1A01
REPROG_CONTROLS 0x1B00 get_keys(), only listing
REPROG_CONTROLS_V2 0x1B01
REPROG_CONTROLS_V2_2 0x1B02
REPROG_CONTROLS_V3 0x1B03
REPROG_CONTROLS_V4 0x1B04 get_keys(), only listing
REPORT_HID_USAGE 0x1BC0
PERSISTENT_REMAPPABLE_ACTION 0x1C00
WIRELESS_DEVICE_STATUS 0x1D4B status reporting from device
REMAINING_PAIRING 0x1DF0
FIRMWARE_PROPERTIES 0x1F1F
ADC_MEASUREMENT 0x1F20
LEFT_RIGHT_SWAP 0x2001
SWAP_BUTTON_CANCEL 0x2005
POINTER_AXIS_ORIENTATION 0x2006
VERTICAL_SCROLLING 0x2100 ✔️ get_vertical_scrolling_info(), read only
SMART_SHIFT 0x2110 ✔️ _feature_smart_shift()
HI_RES_SCROLLING 0x2120 ✔️ get_hi_res_scrolling_info(), _feature_hi_res_scroll()
HIRES_WHEEL 0x2121 ✔️ get_hires_wheel(), _feature_hires_smooth_invert(), _feature_hires_smooth_resolution()
LOWRES_WHEEL 0x2130 ✔️ get_lowres_wheel_status(), _feature_lowres_smooth_scroll()
THUMB_WHEEL 0x2150
MOUSE_POINTER 0x2200 ✔️ get_mouse_pointer_info(), read only
ADJUSTABLE_DPI 0x2201 ✔️ _feature_adjustable_dpi()
POINTER_SPEED 0x2205 ✔️ get_pointer_speed_info(), _feature_pointer_speed()
ANGLE_SNAPPING 0x2230
SURFACE_TUNING 0x2240
HYBRID_TRACKING 0x2400
FN_INVERSION 0x40A0 ✔️ _feature_fn_swap()
NEW_FN_INVERSION 0x40A2 ✔️ _feature_new_fn_swap()
K375S_FN_INVERSION 0x40A3 ✔️ _feature_k375s_fn_swap()
ENCRYPTION 0x4100
LOCK_KEY_STATE 0x4220
SOLAR_DASHBOARD 0x4301
KEYBOARD_LAYOUT 0x4520
KEYBOARD_DISABLE 0x4521
KEYBOARD_DISABLE_BY_USAGE 0x4522
DUALPLATFORM 0x4530
MULTIPLATFORM 0x4531
KEYBOARD_LAYOUT_2 0x4540
CROWN 0x4600
TOUCHPAD_FW_ITEMS 0x6010
TOUCHPAD_SW_ITEMS 0x6011
TOUCHPAD_WIN8_FW_ITEMS 0x6012
TAP_ENABLE 0x6020
TAP_ENABLE_EXTENDED 0x6021
CURSOR_BALLISTIC 0x6030
TOUCHPAD_RESOLUTION 0x6040
TOUCHPAD_RAW_XY 0x6100
TOUCHMOUSE_RAW_POINTS 0x6110
TOUCHMOUSE_6120 0x6120
GESTURE 0x6500
GESTURE_2 0x6501
GKEY 0x8010
MKEYS 0x8020
MR 0x8030
BRIGHTNESS_CONTROL 0x8040
REPORT_RATE 0x8060
COLOR_LED_EFFECTS 0x8070
RGB_EFFECTS 0X8071
PER_KEY_LIGHTING 0x8080
PER_KEY_LIGHTING_V2 0x8081
MODE_STATUS 0x8090
ONBOARD_PROFILES 0x8100
MOUSE_BUTTON_SPY 0x8110
LATENCY_MONITORING 0x8111
GAMING_ATTACHMENTS 0x8120
FORCE_FEEDBACK 0x8123
SIDETONE 0x8300
EQUALIZER 0x8310
HEADSET_OUT 0x8320

"read only" in the notes column means that the state of the feature can be read, but not set.

Implementing a feature

Features are implemented as settable features in lib/logitech_receiver/settings_templates.py Some features also have direct implementation in lib/logitech_receiver/hidpp20.py

In most cases it should suffice to only implement the settable feature interface for each setting in the feature. That will add one or more widgets in the Solaar main window to show and change the feature, store and restore changed settings, and output the feature settings in solaar show.

Adding a setting involves several steps, described here and illustrated by the pointer speed setting.

Add a name, a label, and a description for the setting in the common strings section. The name is used in the persistent settings structure to store and restore changed settings. The label is displayed in the Solaar main window and the description is used as a tooltip there. The label and description should be specified as translatable strings.

_POINTER_SPEED = ('pointer_speed', _("Sensitivity (Pointer Speed)"), _("How fast the pointer moves"))

Create the feature interface for the setting. There are several possible feature interfaces, ranging from simple toggles, to ranges, to fixed lists, to dynamic lists, each created by a macro function. Pointer speed is a setting whose values are integers in a range so feature_range is used. The arguments to this macro are an identifier of the setting (in simple cases using the setting name is easiest), the HID++ 2.0 feature ID for the setting (from the FEATURE structure in hidpp20.py), the minimum and maximum values for the setting, the HID++ 2.0 function IDs to read and write the setting, the byte size of the setting value, a label and description for the setting, and which kinds of devices can have this setting. (This last is no longer used because keyboards with integrated pointers only report that they are keyboards.) The values to be used need to be determined from documentation of the feature or from reverse-engineering behaviour of Logitech software under Windows or MacOS.

def _feature_pointer_speed():
	"""Pointer Speed feature"""
	return feature_range(_POINTER_SPEED[0], _F.POINTER_SPEED, 0x002e, 0x01ff,
					read_function_id=0x0,
					write_function_id=0x10,
					bytes_count=2,
					label=_POINTER_SPEED[1], description=_POINTER_SPEED[2],
					device_kind=(_DK.mouse, _DK.trackball))

Settings that are toggles or choices work very similarly. Settings where the choices are determined from the device need an auxiliary function to receive and decipher the permissable choices. See _feature_adjustable_dpi_choices for an example.

Add the setting identifier to _SETTINGS_LIST, to the RegisterSettings list as a setting with no register implementation, and to the FeatureSettings list with its implementation.

Add the setting's name and feature to check_feature_settings (and feature interface identifier if different from the name) so that devices will be probed to see if they support the setting.

check_feature(_POINTER_SPEED[0], _F.POINTER_SPEED)