Skip to content

Commit cce1429

Browse files
committed
improve touchpad emulation on sd
1 parent 477f629 commit cce1429

File tree

4 files changed

+147
-12
lines changed

4 files changed

+147
-12
lines changed

src/hhd/controller/virtual/sd/__init__.py

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Consumer,
88
Event,
99
Producer,
10+
DEBUG_MODE,
1011
)
1112
from hhd.controller.lib.uhid import UhidDevice, BUS_USB
1213
from hhd.controller.lib.common import encode_axis, set_button
@@ -19,6 +20,7 @@
1920
SDCONT_DESCRIPTOR,
2021
SD_AXIS_MAP,
2122
SD_BTN_MAP,
23+
SD_SETTINGS,
2224
)
2325

2426
MAX_IMU_SYNC_DELAY = 2
@@ -137,10 +139,14 @@ def produce(self, fds: Sequence[int]) -> Sequence[Event]:
137139
assert self.dev
138140
while ev := self.dev.read_event():
139141
match ev["type"]:
140-
# case "open":
141-
# logger.info(f"SD OPENED")
142-
# case "close":
143-
# logger.info(f"SD CLOSED")
142+
case "open":
143+
# logger.info(f"SD OPENED")
144+
pass
145+
case "close":
146+
# logger.info(f"SD CLOSED")
147+
pass
148+
case "start":
149+
pass
144150
case "get_report":
145151
match self.last_rep:
146152
case 0x83:
@@ -235,12 +241,35 @@ def produce(self, fds: Sequence[int]) -> Sequence[Event]:
235241
"weak_magnitude": right / (2**16 - 1),
236242
}
237243
)
244+
case 0xea:
245+
# Touchpad stuff
246+
pass
238247
case 0x8F:
248+
# logger.info(f"SD Received Haptics ({time.perf_counter()*1000:.3f}ms):\n{ev['data'].hex().rstrip(' 0')}")
239249
pass
250+
case 0x87:
251+
if DEBUG_MODE:
252+
rnum = ev["data"][4]
253+
ss = []
254+
for i in range(0, rnum, 3):
255+
rtype = ev["data"][5 + i]
256+
rdata = int.from_bytes(
257+
ev["data"][6 + i : 8 + i],
258+
byteorder="little",
259+
signed=False,
260+
)
261+
ss.append(
262+
f"{SD_SETTINGS[rtype] if rtype < len(SD_SETTINGS) else "UKNOWN"} ({rtype:02d}): {rdata:02x}"
263+
)
264+
mlen = max(map(len, ss))
265+
logger.info(
266+
f"SD Received Settings (n={rnum // 3}):{''.join(map(lambda x: '\n > ' + ' '*(mlen - len(x)) + x, ss))}"
267+
)
240268
case _:
241-
logger.info(
242-
f"SD SET_REPORT({ev['rnum']:02x}:{ev['rtype']:02x}): {trim(ev['data']).hex()}"
243-
)
269+
if DEBUG_MODE:
270+
logger.info(
271+
f"SD SET_REPORT({ev['rnum']:02x}:{ev['rtype']:02x}): {trim(ev['data']).hex()}"
272+
)
244273

245274
# 410000eb 0901401f 0000 0000 fbfb
246275
# 410000eb 0901401f ff7f ff7f fbfb
@@ -312,6 +341,18 @@ def consume(self, events: Sequence[Event]):
312341
elif code in SD_BTN_MAP:
313342
set_button(new_rep, SD_BTN_MAP[code], ev["value"])
314343

344+
if not self.touchpad_touch:
345+
encode_axis(
346+
new_rep,
347+
SD_AXIS_MAP["touchpad_x"],
348+
0.5,
349+
)
350+
encode_axis(
351+
new_rep,
352+
SD_AXIS_MAP["touchpad_y"],
353+
0.5,
354+
)
355+
315356
# If the IMU breaks, smoothly re-enable the controller
316357
failover = self.last_imu + MAX_IMU_SYNC_DELAY < curr
317358
if self.sync_gyro and failover and not self.imu_failed:

src/hhd/controller/virtual/sd/const.py

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848
)
4949

5050
SD_AXIS_MAP = {
51-
"touchpad_x": AM((20 << 3), "u16", scale=2**14 - 2, offset=2**14),
52-
"touchpad_y": AM((22 << 3), "u16", scale=2**14 - 2, offset=2**14),
53-
"touchpad_force": AM((58 << 3), "u16", scale=2**14 - 2),
51+
"touchpad_x": AM((20 << 3), "i16", scale=2**16-3, offset=-2**15+1),
52+
"touchpad_y": AM((22 << 3), "i16", scale=-2**16+3, offset=2**15-1),
53+
"touchpad_force": AM((58 << 3), "i16", scale=2**14 - 2),
5454
"accel_x": AM(
5555
(24 << 3), "i16", scale=16384 / 9.80665, bounds=(-(2**15) + 2, 2**15 - 1)
5656
),
@@ -109,3 +109,97 @@
109109
# "touchpad_touch2": BM((36 << 3), flipped=True),
110110
# "touchpad_left": BM((9 << 3) + 6),
111111
}
112+
113+
SD_SETTINGS = [
114+
# /* 0 */
115+
"SETTING_MOUSE_SENSITIVITY",
116+
"SETTING_MOUSE_ACCELERATION",
117+
"SETTING_TRACKBALL_ROTATION_ANGLE",
118+
"SETTING_HAPTIC_INTENSITY_UNUSED",
119+
"SETTING_LEFT_GAMEPAD_STICK_ENABLED",
120+
"SETTING_RIGHT_GAMEPAD_STICK_ENABLED",
121+
"SETTING_USB_DEBUG_MODE",
122+
"SETTING_LEFT_TRACKPAD_MODE",
123+
"SETTING_RIGHT_TRACKPAD_MODE",
124+
"SETTING_MOUSE_POINTER_ENABLED",
125+
# /* 10 */
126+
"SETTING_DPAD_DEADZONE",
127+
"SETTING_MINIMUM_MOMENTUM_VEL",
128+
"SETTING_MOMENTUM_DECAY_AMMOUNT",
129+
"SETTING_TRACKPAD_RELATIVE_MODE_TICKS_PER_PIXEL",
130+
"SETTING_HAPTIC_INCREMENT",
131+
"SETTING_DPAD_ANGLE_SIN",
132+
"SETTING_DPAD_ANGLE_COS",
133+
"SETTING_MOMENTUM_VERTICAL_DIVISOR",
134+
"SETTING_MOMENTUM_MAXIMUM_VELOCITY",
135+
"SETTING_TRACKPAD_Z_ON",
136+
# /* 20 */
137+
"SETTING_TRACKPAD_Z_OFF",
138+
"SETTING_SENSITIVY_SCALE_AMMOUNT",
139+
"SETTING_LEFT_TRACKPAD_SECONDARY_MODE",
140+
"SETTING_RIGHT_TRACKPAD_SECONDARY_MODE",
141+
"SETTING_SMOOTH_ABSOLUTE_MOUSE",
142+
"SETTING_STEAMBUTTON_POWEROFF_TIME",
143+
"SETTING_UNUSED_1",
144+
"SETTING_TRACKPAD_OUTER_RADIUS",
145+
"SETTING_TRACKPAD_Z_ON_LEFT",
146+
"SETTING_TRACKPAD_Z_OFF_LEFT",
147+
# /* 30 */
148+
"SETTING_TRACKPAD_OUTER_SPIN_VEL",
149+
"SETTING_TRACKPAD_OUTER_SPIN_RADIUS",
150+
"SETTING_TRACKPAD_OUTER_SPIN_HORIZONTAL_ONLY",
151+
"SETTING_TRACKPAD_RELATIVE_MODE_DEADZONE",
152+
"SETTING_TRACKPAD_RELATIVE_MODE_MAX_VEL",
153+
"SETTING_TRACKPAD_RELATIVE_MODE_INVERT_Y",
154+
"SETTING_TRACKPAD_DOUBLE_TAP_BEEP_ENABLED",
155+
"SETTING_TRACKPAD_DOUBLE_TAP_BEEP_PERIOD",
156+
"SETTING_TRACKPAD_DOUBLE_TAP_BEEP_COUNT",
157+
"SETTING_TRACKPAD_OUTER_RADIUS_RELEASE_ON_TRANSITION",
158+
# /* 40 */
159+
"SETTING_RADIAL_MODE_ANGLE",
160+
"SETTING_HAPTIC_INTENSITY_MOUSE_MODE",
161+
"SETTING_LEFT_DPAD_REQUIRES_CLICK",
162+
"SETTING_RIGHT_DPAD_REQUIRES_CLICK",
163+
"SETTING_LED_BASELINE_BRIGHTNESS",
164+
"SETTING_LED_USER_BRIGHTNESS",
165+
"SETTING_ENABLE_RAW_JOYSTICK",
166+
"SETTING_ENABLE_FAST_SCAN",
167+
"SETTING_IMU_MODE",
168+
"SETTING_WIRELESS_PACKET_VERSION",
169+
# /* 50 */
170+
"SETTING_SLEEP_INACTIVITY_TIMEOUT",
171+
"SETTING_TRACKPAD_NOISE_THRESHOLD",
172+
"SETTING_LEFT_TRACKPAD_CLICK_PRESSURE",
173+
"SETTING_RIGHT_TRACKPAD_CLICK_PRESSURE",
174+
"SETTING_LEFT_BUMPER_CLICK_PRESSURE",
175+
"SETTING_RIGHT_BUMPER_CLICK_PRESSURE",
176+
"SETTING_LEFT_GRIP_CLICK_PRESSURE",
177+
"SETTING_RIGHT_GRIP_CLICK_PRESSURE",
178+
"SETTING_LEFT_GRIP2_CLICK_PRESSURE",
179+
"SETTING_RIGHT_GRIP2_CLICK_PRESSURE",
180+
# /* 60 */
181+
"SETTING_PRESSURE_MODE",
182+
"SETTING_CONTROLLER_TEST_MODE",
183+
"SETTING_TRIGGER_MODE",
184+
"SETTING_TRACKPAD_Z_THRESHOLD",
185+
"SETTING_FRAME_RATE",
186+
"SETTING_TRACKPAD_FILT_CTRL",
187+
"SETTING_TRACKPAD_CLIP",
188+
"SETTING_DEBUG_OUTPUT_SELECT",
189+
"SETTING_TRIGGER_THRESHOLD_PERCENT",
190+
"SETTING_TRACKPAD_FREQUENCY_HOPPING",
191+
# /* 70 */
192+
"SETTING_HAPTICS_ENABLED",
193+
"SETTING_STEAM_WATCHDOG_ENABLE",
194+
"SETTING_TIMP_TOUCH_THRESHOLD_ON",
195+
"SETTING_TIMP_TOUCH_THRESHOLD_OFF",
196+
"SETTING_FREQ_HOPPING",
197+
"SETTING_TEST_CONTROL",
198+
"SETTING_HAPTIC_MASTER_GAIN_DB",
199+
"SETTING_THUMB_TOUCH_THRESH",
200+
"SETTING_DEVICE_POWER_STATUS",
201+
"SETTING_HAPTIC_INTENSITY",
202+
# /* 80 */
203+
"SETTING_STABILIZER_ENABLED",
204+
"SETTING_TIMP_MODE_MTE",
205+
]

src/hhd/device/legion_go/slim/controller.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ children:
5252
5353
touchpad:
5454
type: multiple
55-
title: Touchpad Emulation [ALPHA]
55+
title: Touchpad Emulation [BETA]
5656
default: disabled
5757
tags: [ non-essential, ordinal ]
5858
hint: >-

src/hhd/plugins/outputs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ modes:
9898
Allows for gyro, paddles, and has a proper QAM button.
9999
handheld_mode:
100100
type: bool
101-
title: Handheld Mode [ALPHA]
101+
title: Handheld Mode [BETA]
102102
tags: [non-essential]
103103
default: False
104104
hint: >-

0 commit comments

Comments
 (0)