Skip to content

Commit bf94239

Browse files
committed
add sinput capabilities
1 parent 8a71bee commit bf94239

File tree

2 files changed

+83
-38
lines changed

2 files changed

+83
-38
lines changed

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

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@
1414

1515
from .const import (
1616
SINPUT_HID_REPORT,
17-
STANDARD_BUTTONS,
1817
SINPUT_BTN_MAP,
1918
SINPUT_AXIS_MAP,
20-
QUAD_PADDLES,
21-
DUAL_PADDLES,
2219
get_button_mask,
2320
GYRO_MAX_DPS,
2421
ACCEL_MAX_G,
22+
SINPUT_AVAILABLE_BUTTONS,
23+
SDL_SUBTYPE_XINPUT_SHARE_NONE,
24+
SDL_SUBTYPE_XINPUT_SHARE_DUAL,
25+
SDL_SUBTYPE_XINPUT_SHARE_QUAD,
26+
SDL_SUBTYPE_XINPUT_SHARE_NONE_CLICK,
27+
SDL_SUBTYPE_XINPUT_SHARE_DUAL_CLICK,
28+
SDL_SUBTYPE_XINPUT_SHARE_QUAD_CLICK,
2529
)
2630

2731
SINPUT_NANE = "S-Input (HHD)"
@@ -49,6 +53,7 @@ def close_cached():
4953
def __init__(
5054
self,
5155
enable_touchpad: bool = True,
56+
touchpad_click: bool = False,
5257
enable_rgb: bool = True,
5358
enable_gyro: bool = True,
5459
sync_gyro: bool = False,
@@ -64,6 +69,8 @@ def __init__(
6469
self.controller_id = controller_id
6570
self.glyphs = glyphs
6671
self.paddles = paddles
72+
self.touchpad_click = touchpad_click
73+
self.btns = {}
6774

6875
self.settings = (
6976
enable_touchpad,
@@ -192,14 +199,26 @@ def produce(self, fds: Sequence[int]) -> Sequence[Event]:
192199
)
193200

194201
# Set SDL types based on available buttons
202+
gtype = 0x02
203+
if self.touchpad_click:
204+
match self.paddles:
205+
case "none":
206+
gtype = SDL_SUBTYPE_XINPUT_SHARE_NONE_CLICK
207+
case "dual":
208+
gtype = SDL_SUBTYPE_XINPUT_SHARE_DUAL_CLICK
209+
case "quad":
210+
gtype = SDL_SUBTYPE_XINPUT_SHARE_QUAD_CLICK
211+
else:
212+
match self.paddles:
213+
case "none":
214+
gtype = SDL_SUBTYPE_XINPUT_SHARE_NONE
215+
case "dual":
216+
gtype = SDL_SUBTYPE_XINPUT_SHARE_DUAL
217+
case "quad":
218+
gtype = SDL_SUBTYPE_XINPUT_SHARE_QUAD
219+
195220
gtype = 0x01
196-
# match self.paddles:
197-
# case "none":
198-
# gtype = 0x02
199-
# case "dual":
200-
# gtype = 0x03
201-
# case "quad":
202-
# gtype = 0x04
221+
203222
match self.glyphs:
204223
case "standard":
205224
feats[ofs + 4] = 0x01
@@ -223,18 +242,10 @@ def produce(self, fds: Sequence[int]) -> Sequence[Event]:
223242
GYRO_MAX_DPS, 2, "little"
224243
)
225244

226-
# match self.paddles:
227-
# case "quad":
228-
# btns = QUAD_PADDLES
229-
# case "dual":
230-
# btns = DUAL_PADDLES
231-
# case _:
232-
# btns = STANDARD_BUTTONS
233-
234-
# bmask = get_button_mask(ofs + 12)
235-
# for key in btns:
236-
# set_button(feats, bmask[key], True)
237-
feats[ofs + 12 : ofs + 16] = 0xFF, 0xFF, 0xFF, 0xFF
245+
bmask = get_button_mask(ofs + 12)
246+
self.btns = SINPUT_AVAILABLE_BUTTONS[gtype]
247+
for key in self.btns:
248+
set_button(feats, bmask[key], True)
238249

239250
#
240251
# Serial
@@ -330,10 +341,7 @@ def consume(self, events: Sequence[Event]):
330341
if not self.enable_touchpad and code.startswith("touchpad"):
331342
continue
332343

333-
if self.paddles == "none" and code in QUAD_PADDLES:
334-
continue
335-
336-
if code in SINPUT_BTN_MAP:
344+
if code in self.btns and code in SINPUT_BTN_MAP:
337345
set_button(new_rep, SINPUT_BTN_MAP[code], ev["value"])
338346

339347
# Fix touchpad click requiring touch

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

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@
106106
"ls_y": AM((9 << 3), "i16"),
107107
"rs_x": AM((11 << 3), "i16"),
108108
"rs_y": AM((13 << 3), "i16"),
109-
"rt": AM((15 << 3), "i16", scale=2**16 -1, offset=-(2**15 -1)),
110-
"lt": AM((17 << 3), "i16", scale=2**16 -1, offset=-(2**15 -1)),
109+
"rt": AM((15 << 3), "i16", scale=2**16 - 1, offset=-(2**15 - 1)),
110+
"lt": AM((17 << 3), "i16", scale=2**16 - 1, offset=-(2**15 - 1)),
111111
"accel_x": AM(
112112
(23 << 3), "i16", scale=ACCEL_SCALE, bounds=(-(2**15) + 2, 2**15 - 1)
113113
),
@@ -148,24 +148,61 @@
148148
"share": BM(((ofs + 2) << 3) + 4),
149149
"extra_r2": BM(((ofs + 2) << 3) + 3),
150150
"extra_l2": BM(((ofs + 2) << 3) + 2),
151-
"touchpad_left": BM(((ofs + 2) << 3)),
151+
"touchpad_left": BM(((ofs + 2) << 3) + 1),
152152
}
153153

154154
SINPUT_BTN_MAP = get_button_mask(3)
155155

156-
STANDARD_BUTTONS = [
157-
"b", "a", "y", "x",
158-
"dpad_up", "dpad_down", "dpad_left", "dpad_right",
159-
"ls", "rs", "lb", "rb",
160-
"lt", "rt",
161-
"start", "select", "mode", "share",
156+
XINPUT = [
157+
"b",
158+
"a",
159+
"y",
160+
"x",
161+
"dpad_up",
162+
"dpad_down",
163+
"dpad_left",
164+
"dpad_right",
165+
"ls",
166+
"rs",
167+
"lb",
168+
"rb",
169+
"start",
170+
"select",
171+
"mode",
172+
]
173+
174+
STANDARD_BUTTONS = XINPUT + [
175+
"share",
162176
]
163177

164178
DUAL_PADDLES = [
165-
"extra_l1", "extra_r1",
179+
"extra_l1",
180+
"extra_r1",
166181
] + STANDARD_BUTTONS
167182

168183
QUAD_PADDLES = [
169-
"extra_l1", "extra_r1",
170-
"extra_l2", "extra_r2",
184+
"extra_l1",
185+
"extra_r1",
186+
"extra_l2",
187+
"extra_r2",
171188
] + STANDARD_BUTTONS
189+
190+
SDL_SUBTYPE_FULL_MAPPING = 0x00
191+
SDL_SUBTYPE_XINPUT_ONLY = 0x01
192+
SDL_SUBTYPE_XINPUT_SHARE_NONE = 0x02
193+
SDL_SUBTYPE_XINPUT_SHARE_DUAL = 0x03
194+
SDL_SUBTYPE_XINPUT_SHARE_QUAD = 0x04
195+
SDL_SUBTYPE_XINPUT_SHARE_NONE_CLICK = 0x05
196+
SDL_SUBTYPE_XINPUT_SHARE_DUAL_CLICK = 0x06
197+
SDL_SUBTYPE_XINPUT_SHARE_QUAD_CLICK = 0x07
198+
SDL_SUBTYPE_LOAD_FIRMWARE = 0xFF
199+
200+
SINPUT_AVAILABLE_BUTTONS = {
201+
SDL_SUBTYPE_XINPUT_ONLY: STANDARD_BUTTONS,
202+
SDL_SUBTYPE_XINPUT_SHARE_NONE: STANDARD_BUTTONS,
203+
SDL_SUBTYPE_XINPUT_SHARE_DUAL: DUAL_PADDLES,
204+
SDL_SUBTYPE_XINPUT_SHARE_QUAD: QUAD_PADDLES,
205+
SDL_SUBTYPE_XINPUT_SHARE_NONE_CLICK: STANDARD_BUTTONS + ["touchpad_left"],
206+
SDL_SUBTYPE_XINPUT_SHARE_DUAL_CLICK: DUAL_PADDLES + ["touchpad_left"],
207+
SDL_SUBTYPE_XINPUT_SHARE_QUAD_CLICK: QUAD_PADDLES + ["touchpad_left"],
208+
}

0 commit comments

Comments
 (0)