279 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			8.1 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 enum import IntFlag
 | |
| 
 | |
| from .common import NamedInts
 | |
| 
 | |
| # <FeaturesSupported.xml sed '/LD_FID_/{s/.*LD_FID_/\t/;s/"[ \t]*Id="/=/;s/" \/>/,/p}' | sort -t= -k2
 | |
| # additional features names taken from https://github.com/cvuchener/hidpp and
 | |
| # https://github.com/Logitech/cpg-docs/tree/master/hidpp20
 | |
| """Possible features available on a Logitech device.
 | |
| 
 | |
| A particular device might not support all these features, and may support other
 | |
| unknown features as well.
 | |
| """
 | |
| 
 | |
| 
 | |
| class SupportedFeature(IntEnum):
 | |
|     ROOT = 0x0000
 | |
|     FEATURE_SET = 0x0001
 | |
|     FEATURE_INFO = 0x0002
 | |
|     # Common
 | |
|     DEVICE_FW_VERSION = 0x0003
 | |
|     DEVICE_UNIT_ID = 0x0004
 | |
|     DEVICE_NAME = 0x0005
 | |
|     DEVICE_GROUPS = 0x0006
 | |
|     DEVICE_FRIENDLY_NAME = 0x0007
 | |
|     KEEP_ALIVE = 0x0008
 | |
|     CONFIG_CHANGE = 0x0020
 | |
|     CRYPTO_ID = 0x0021
 | |
|     TARGET_SOFTWARE = 0x0030
 | |
|     WIRELESS_SIGNAL_STRENGTH = 0x0080
 | |
|     DFUCONTROL_LEGACY = 0x00C0
 | |
|     DFUCONTROL_UNSIGNED = 0x00C1
 | |
|     DFUCONTROL_SIGNED = 0x00C2
 | |
|     DFUCONTROL = 0x00C3
 | |
|     DFU = 0x00D0
 | |
|     BATTERY_STATUS = 0x1000
 | |
|     BATTERY_VOLTAGE = 0x1001
 | |
|     UNIFIED_BATTERY = 0x1004
 | |
|     CHARGING_CONTROL = 0x1010
 | |
|     LED_CONTROL = 0x1300
 | |
|     FORCE_PAIRING = 0x1500
 | |
|     GENERIC_TEST = 0x1800
 | |
|     DEVICE_RESET = 0x1802
 | |
|     OOBSTATE = 0x1805
 | |
|     CONFIG_DEVICE_PROPS = 0x1806
 | |
|     CHANGE_HOST = 0x1814
 | |
|     HOSTS_INFO = 0x1815
 | |
|     BACKLIGHT = 0x1981
 | |
|     BACKLIGHT2 = 0x1982
 | |
|     BACKLIGHT3 = 0x1983
 | |
|     ILLUMINATION = 0x1990
 | |
|     PRESENTER_CONTROL = 0x1A00
 | |
|     SENSOR_3D = 0x1A01
 | |
|     REPROG_CONTROLS = 0x1B00
 | |
|     REPROG_CONTROLS_V2 = 0x1B01
 | |
|     REPROG_CONTROLS_V2_2 = 0x1B02  # LogiOptions 2.10.73 features.xml
 | |
|     REPROG_CONTROLS_V3 = 0x1B03
 | |
|     REPROG_CONTROLS_V4 = 0x1B04
 | |
|     REPORT_HID_USAGE = 0x1BC0
 | |
|     PERSISTENT_REMAPPABLE_ACTION = 0x1C00
 | |
|     WIRELESS_DEVICE_STATUS = 0x1D4B
 | |
|     REMAINING_PAIRING = 0x1DF0
 | |
|     FIRMWARE_PROPERTIES = 0x1F1F
 | |
|     ADC_MEASUREMENT = 0x1F20
 | |
|     # Mouse
 | |
|     LEFT_RIGHT_SWAP = 0x2001
 | |
|     SWAP_BUTTON_CANCEL = 0x2005
 | |
|     POINTER_AXIS_ORIENTATION = 0x2006
 | |
|     VERTICAL_SCROLLING = 0x2100
 | |
|     SMART_SHIFT = 0x2110
 | |
|     SMART_SHIFT_ENHANCED = 0x2111
 | |
|     HI_RES_SCROLLING = 0x2120
 | |
|     HIRES_WHEEL = 0x2121
 | |
|     LOWRES_WHEEL = 0x2130
 | |
|     THUMB_WHEEL = 0x2150
 | |
|     MOUSE_POINTER = 0x2200
 | |
|     ADJUSTABLE_DPI = 0x2201
 | |
|     EXTENDED_ADJUSTABLE_DPI = 0x2202
 | |
|     POINTER_SPEED = 0x2205
 | |
|     ANGLE_SNAPPING = 0x2230
 | |
|     SURFACE_TUNING = 0x2240
 | |
|     XY_STATS = 0x2250
 | |
|     WHEEL_STATS = 0x2251
 | |
|     HYBRID_TRACKING = 0x2400
 | |
|     # Keyboard
 | |
|     FN_INVERSION = 0x40A0
 | |
|     NEW_FN_INVERSION = 0x40A2
 | |
|     K375S_FN_INVERSION = 0x40A3
 | |
|     ENCRYPTION = 0x4100
 | |
|     LOCK_KEY_STATE = 0x4220
 | |
|     SOLAR_DASHBOARD = 0x4301
 | |
|     KEYBOARD_LAYOUT = 0x4520
 | |
|     KEYBOARD_DISABLE_KEYS = 0x4521
 | |
|     KEYBOARD_DISABLE_BY_USAGE = 0x4522
 | |
|     DUALPLATFORM = 0x4530
 | |
|     MULTIPLATFORM = 0x4531
 | |
|     KEYBOARD_LAYOUT_2 = 0x4540
 | |
|     CROWN = 0x4600
 | |
|     # Touchpad
 | |
|     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
 | |
|     # Gaming Devices
 | |
|     GKEY = 0x8010
 | |
|     MKEYS = 0x8020
 | |
|     MR = 0x8030
 | |
|     BRIGHTNESS_CONTROL = 0x8040
 | |
|     REPORT_RATE = 0x8060
 | |
|     EXTENDED_ADJUSTABLE_REPORT_RATE = 0x8061
 | |
|     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
 | |
|     # Headsets
 | |
|     SIDETONE = 0x8300
 | |
|     EQUALIZER = 0x8310
 | |
|     HEADSET_OUT = 0x8320
 | |
|     # Fake features for Solaar internal use
 | |
|     MOUSE_GESTURE = 0xFE00
 | |
| 
 | |
|     def __str__(self):
 | |
|         return self.name.replace("_", " ")
 | |
| 
 | |
| 
 | |
| class FeatureFlag(IntFlag):
 | |
|     """Single bit flags."""
 | |
| 
 | |
|     INTERNAL = 0x20
 | |
|     HIDDEN = 0x40
 | |
|     OBSOLETE = 0x80
 | |
| 
 | |
| 
 | |
| DEVICE_KIND = NamedInts(
 | |
|     keyboard=0x00,
 | |
|     remote_control=0x01,
 | |
|     numpad=0x02,
 | |
|     mouse=0x03,
 | |
|     touchpad=0x04,
 | |
|     trackball=0x05,
 | |
|     presenter=0x06,
 | |
|     receiver=0x07,
 | |
| )
 | |
| 
 | |
| 
 | |
| class OnboardMode(IntEnum):
 | |
|     MODE_NO_CHANGE = 0x00
 | |
|     MODE_ONBOARD = 0x01
 | |
|     MODE_HOST = 0x02
 | |
| 
 | |
| 
 | |
| class ChargeLevel(IntEnum):
 | |
|     AVERAGE = 50
 | |
|     FULL = 90
 | |
|     CRITICAL = 5
 | |
| 
 | |
| 
 | |
| class ChargeType(IntEnum):
 | |
|     STANDARD = 0x00
 | |
|     FAST = 0x01
 | |
|     SLOW = 0x02
 | |
| 
 | |
| 
 | |
| class ErrorCode(IntEnum):
 | |
|     UNKNOWN = 0x01
 | |
|     INVALID_ARGUMENT = 0x02
 | |
|     OUT_OF_RANGE = 0x03
 | |
|     HARDWARE_ERROR = 0x04
 | |
|     LOGITECH_ERROR = 0x05
 | |
|     INVALID_FEATURE_INDEX = 0x06
 | |
|     INVALID_FUNCTION = 0x07
 | |
|     BUSY = 0x08
 | |
|     UNSUPPORTED = 0x09
 | |
| 
 | |
| 
 | |
| class GestureId(IntEnum):
 | |
|     """Gesture IDs for feature GESTURE_2."""
 | |
| 
 | |
|     TAP_1_FINGER = 1  # task Left_Click
 | |
|     TAP_2_FINGER = 2  # task Right_Click
 | |
|     TAP_3_FINGER = 3
 | |
|     CLICK_1_FINGER = 4  # task Left_Click
 | |
|     CLICK_2_FINGER = 5  # task Right_Click
 | |
|     CLICK_3_FINGER = 6
 | |
|     DOUBLE_TAP_1_FINGER = 10
 | |
|     DOUBLE_TAP_2_FINGER = 11
 | |
|     DOUBLE_TAP_3_FINGER = 12
 | |
|     TRACK_1_FINGER = 20  # action MovePointer
 | |
|     TRACKING_ACCELERATION = 21
 | |
|     TAP_DRAG_1_FINGER = 30  # action Drag
 | |
|     TAP_DRAG_2_FINGER = 31  # action SecondaryDrag
 | |
|     DRAG_3_FINGER = 32
 | |
|     TAP_GESTURES = 33  # group all tap gestures under a single UI setting
 | |
|     FN_CLICK_GESTURE_SUPPRESSION = 34  # suppresses Tap and Edge gestures, toggled by Fn+Click
 | |
|     SCROLL_1_FINGER = 40  # action ScrollOrPageXY / ScrollHorizontal
 | |
|     SCROLL_2_FINGER = 41  # action ScrollOrPageXY / ScrollHorizontal
 | |
|     SCROLL_2_FINGER_HORIZONTAL = 42  # action ScrollHorizontal
 | |
|     SCROLL_2_FINGER_VERTICAL = 43  # action WheelScrolling
 | |
|     SCROLL_2_FINGER_STATELESS = 44
 | |
|     NATURAL_SCROLLING = 45  # affects native HID wheel reporting by gestures, not when diverted
 | |
|     THUMBWHEEL = (46,)  # action WheelScrolling
 | |
|     V_SCROLL_INTERTIA = 48
 | |
|     V_SCROLL_BALLISTICS = 49
 | |
|     SWIPE_2_FINGER_HORIZONTAL = 50  # action PageScreen
 | |
|     SWIPE_3_FINGER_HORIZONTAL = 51  # action PageScreen
 | |
|     SWIPE_4_FINGER_HORIZONTAL = 52  # action PageScreen
 | |
|     SWIPE_3_FINGER_VERTICAL = 53
 | |
|     SWIPE_4_FINGER_VERTICAL = 54
 | |
|     LEFT_EDGE_SWIPE_1_FINGER = 60
 | |
|     RIGHT_EDGE_SWIPE_1_FINGER = 61
 | |
|     BOTTOM_EDGE_SWIPE_1_FINGER = 62
 | |
|     TOP_EDGE_SWIPE_1_FINGER = 63
 | |
|     LEFT_EDGE_SWIPE_1_FINGER_2 = 64  # task HorzScrollNoRepeatSet
 | |
|     RIGHT_EDGE_SWIPE_1_FINGER_2 = 65
 | |
|     BOTTOM_EDGE_SWIPE_1_FINGER_2 = 66
 | |
|     TOP_EDGE_SWIPE_1_FINGER_2 = 67
 | |
|     LEFT_EDGE_SWIPE_2_FINGER = 70
 | |
|     RIGHT_EDGE_SWIPE_2_FINGER = 71
 | |
|     BottomEdgeSwipe2Finger = 72
 | |
|     BOTTOM_EDGE_SWIPE_2_FINGER = 72
 | |
|     TOP_EDGE_SWIPE_2_FINGER = 73
 | |
|     ZOOM_2_FINGER = 80  # action Zoom
 | |
|     ZOOM_2_FINGER_PINCH = 81  # ZoomBtnInSet
 | |
|     ZOOM_2_FINGER_SPREAD = 82  # ZoomBtnOutSet
 | |
|     ZOOM_3_FINGER = 83
 | |
|     ZOOM_2_FINGER_STATELESS = 84
 | |
|     TWO_FINGERS_PRESENT = 85
 | |
|     ROTATE_2_FINGER = 87
 | |
|     FINGER_1 = 90
 | |
|     FINGER_2 = 91
 | |
|     FINGER_3 = 92
 | |
|     FINGER_4 = 93
 | |
|     FINGER_5 = 94
 | |
|     FINGER_6 = 95
 | |
|     FINGER_7 = 96
 | |
|     FINGER_8 = 97
 | |
|     FINGER_9 = 98
 | |
|     FINGER_10 = 99
 | |
|     DEVICE_SPECIFIC_RAW_DATA = 100
 | |
| 
 | |
| 
 | |
| class ParamId(IntEnum):
 | |
|     """Param Ids for feature GESTURE_2"""
 | |
| 
 | |
|     EXTRA_CAPABILITIES = 1  # not suitable for use
 | |
|     PIXEL_ZONE = 2  # 4 2-byte integers, left, bottom, width, height; pixels
 | |
|     RATIO_ZONE = 3  # 4 bytes, left, bottom, width, height; unit 1/240 pad size
 | |
|     SCALE_FACTOR = 4  # 2-byte integer, with 256 as normal scale
 |