Skip to content

Commit 2db8570

Browse files
committed
Add option for ROG Ally to remap ROG/QAM to L5/R5, with double/triple-tap for original function
1 parent 1208000 commit 2db8570

File tree

4 files changed

+74
-11
lines changed

4 files changed

+74
-11
lines changed

src/hhd/controller/base.py

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,7 @@ def __init__(
544544
"start_is_keyboard",
545545
]
546546
) = None,
547+
guide_to_paddles: bool = False,
547548
trigger: None | Literal["analog_to_discrete", "discrete_to_analogue"] = None,
548549
dpad: (
549550
None
@@ -578,6 +579,7 @@ def __init__(
578579
startselect_chord: bool = False,
579580
) -> None:
580581
self.swap_guide = swap_guide
582+
self.guide_to_paddles = guide_to_paddles
581583
self.trigger = trigger
582584
self.dpad = dpad
583585
self.led = led
@@ -631,6 +633,8 @@ def __init__(
631633
self.emit and self.emit.simple_qam()
632634
)
633635
self.guide_pressed = False
636+
self.guide_released = None
637+
self.guide_times = 0
634638
self.steam_check = params.get("steam_check", None)
635639
self.steam_check_last = time.perf_counter()
636640
self.steam_check_fn = params.get("steam_check_fn", None)
@@ -1011,12 +1015,13 @@ def process(self, events: Sequence[Event]) -> Sequence[Event]:
10111015
)
10121016
ev["code"] = "" # type: ignore
10131017

1014-
if self.emit and ev["code"] == "mode":
1015-
# Steam might do weirdness, emit an event to prepare
1016-
# the overlay
1017-
self.guide_pressed = ev["value"]
1018-
if ev["value"]:
1019-
self.emit({"type": "special", "event": "guide"})
1018+
# overlay doesn't do anything with the "guide" event
1019+
# if self.emit and ev["code"] == "mode":
1020+
# # Steam might do weirdness, emit an event to prepare
1021+
# # the overlay
1022+
# self.guide_pressed = ev["value"]
1023+
# if ev["value"]:
1024+
# self.emit({"type": "special", "event": "guide"})
10201025

10211026
if (
10221027
self.dpad == "discrete_to_analog" or self.dpad == "both"
@@ -1052,6 +1057,21 @@ def process(self, events: Sequence[Event]) -> Sequence[Event]:
10521057
}
10531058
)
10541059

1060+
if ev["code"] == "mode" and self.guide_to_paddles:
1061+
logger.info(f"guide_to_paddles mode button: {ev["value"]}, curr: {curr}")
1062+
ev["code"] = ""
1063+
if self.qam_simple:
1064+
ev["code"] = "extra_l2"
1065+
elif ev["value"]:
1066+
self.guide_times += 1
1067+
self.guide_pressed = curr
1068+
self.guide_released = None
1069+
elif self.guide_pressed:
1070+
logger.info("releasing")
1071+
self.guide_released = curr
1072+
self.guide_pressed = None
1073+
logger.info(f"guide_times: {self.guide_times}, guide_pressed: {self.guide_pressed}, guide_released: {self.guide_released}")
1074+
10551075
if (
10561076
self.qam_button is not None and ev["code"] == self.qam_button
10571077
) or (self.keyboard_is == "qam" and ev["code"] == "keyboard"):
@@ -1077,11 +1097,11 @@ def process(self, events: Sequence[Event]) -> Sequence[Event]:
10771097
self.qam_released = curr
10781098
self.qam_pressed = None
10791099
else:
1080-
if self.has_qam:
1100+
if self.has_qam or self.guide_to_paddles:
10811101
out.append(
10821102
{
10831103
"type": "button",
1084-
"code": "share",
1104+
"code": self.guide_to_paddles and "extra_r2" or "share",
10851105
"value": ev["value"],
10861106
},
10871107
)
@@ -1369,6 +1389,23 @@ def process(self, events: Sequence[Event]) -> Sequence[Event]:
13691389
if ev["type"] != "button" or ev["code"]:
13701390
out.append(ev)
13711391

1392+
# Handle Guide button multitap (only needed when guide_to_paddles == True)
1393+
if self.guide_to_paddles:
1394+
if self.guide_pressed and self.guide_times == 2:
1395+
send_steam_expand = True
1396+
self.guide_pressed = None
1397+
self.guide_times = 0
1398+
if self.guide_released and (
1399+
curr - self.guide_released > self.QAM_MULTI_PRESS_DELAY
1400+
):
1401+
out.append({"type": "button", "code": "extra_l2", "value": True})
1402+
self.queue.append((
1403+
{"type": "button", "code": "extra_l2", "value": False},
1404+
curr + self.QAM_TAP_TIME
1405+
))
1406+
self.guide_released = None
1407+
self.guide_times = 0
1408+
13721409
# Handle QAM button
13731410
# Below is the multitap implementation
13741411
# If it was disabled, the code is a NO-OP
@@ -1398,12 +1435,14 @@ def process(self, events: Sequence[Event]) -> Sequence[Event]:
13981435
self.qam_pre_sent = True
13991436

14001437
send_steam_qam = send_steam_qam or (
1401-
qam_apply and not qam_hhd and self.qam_released and self.qam_times == 1
1438+
qam_apply and not qam_hhd and self.qam_released and
1439+
self.qam_times == (self.guide_to_paddles and 2 or 1)
14021440
)
1403-
send_steam_expand = (
1441+
send_steam_expand = send_steam_expand or (
14041442
qam_apply and self.qam_pressed and was_held and self.qam_hold == "mode"
14051443
)
14061444
if qam_apply and self.emit:
1445+
logger.info(f"apply and emit, guide_to_paddles = {self.guide_to_paddles}, qam_hhd: {qam_hhd}")
14071446
if qam_hhd:
14081447
match self.qam_times:
14091448
case 0:
@@ -1412,6 +1451,20 @@ def process(self, events: Sequence[Event]) -> Sequence[Event]:
14121451
self.emit({"type": "special", "event": "qam_double"})
14131452
case _:
14141453
self.emit({"type": "special", "event": "qam_triple"})
1454+
elif self.guide_to_paddles:
1455+
match self.qam_times:
1456+
case 0:
1457+
pass
1458+
case 1:
1459+
out.append({"type": "button", "code": "extra_r2", "value": True})
1460+
self.queue.append((
1461+
{"type": "button", "code": "extra_r2", "value": False},
1462+
curr + self.QAM_TAP_TIME
1463+
))
1464+
case 2:
1465+
self.emit({"type": "special", "event": "qam_single"})
1466+
case 3:
1467+
self.emit({"type": "special", "event": "qam_double"})
14151468
else:
14161469
# FIXME: hiding the event based on qam_hold should not happen
14171470
# instead the handler should not open hhd

src/hhd/device/rog_ally/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
"vibration": 50 if allyx else 100,
5151
}
5252

53-
MODE_DELAY = 0.15
53+
MODE_DELAY = 0.04
5454
VIBRATION_DELAY = 0.1
5555
VIBRATION_ON: Event = {
5656
"type": "rumble",
@@ -393,6 +393,7 @@ def controller_loop(
393393
nintendo_mode=conf["nintendo_mode"].to(bool),
394394
emit=emit,
395395
swap_guide="select_is_guide" if conf["swap_armory"].to(bool) else None,
396+
guide_to_paddles=conf.get("armory_as_paddles", False),
396397
qam_no_release=not conf["swap_armory"].to(bool),
397398
params=d_params,
398399
)

src/hhd/device/rog_ally/controllers.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ children:
2323
hint: >-
2424
Swaps the Armory Crate and Command center buttons with start and select.
2525
default: False
26+
27+
armory_as_paddles:
28+
type: bool
29+
title: Use ROG/QAM as L5/R5
30+
tags: [non-essential]
31+
hint: >-
32+
Replaces Armory Crate and Command Center with L5 and R5. Double-tap for original function, triple-tap view for HHD.
33+
default: False
2634

2735
imu:
2836
type: bool

src/hhd/plugins/overlay/controllers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ def __call__(self, expanded=False) -> Any:
133133
return False
134134

135135
try:
136+
logger.info(f"QamHandlerKeyboard: opening {expanded}")
136137
btn = B("KEY_1") if expanded else B("KEY_2")
137138
self.uinput.write(B("EV_KEY"), B("KEY_LEFTCTRL"), 1)
138139
self.uinput.write(B("EV_KEY"), btn, 1)

0 commit comments

Comments
 (0)