Skip to content

Commit 543cfcd

Browse files
committed
add touch keyboard vibration
1 parent f4aa40e commit 543cfcd

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

src/hhd/controller/physical/evdev.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ def __init__(
245245
msc_delay: float = 0.1,
246246
postprocess: dict[str, dict] = AXIS_CALIBRATION,
247247
requires_start: bool = False,
248+
vibrate_on_press: float = 0
248249
) -> None:
249250
self.vid = vid
250251
self.pid = pid
@@ -268,6 +269,7 @@ def __init__(
268269
self.start_pressed = None
269270
self.start_held = False
270271
self.requires_start = requires_start
272+
self.vibrate_on_press = vibrate_on_press
271273

272274
def open(self) -> Sequence[int]:
273275
for d, info in list_evs(filter_valid=True).items():
@@ -325,6 +327,7 @@ def open(self) -> Sequence[int]:
325327
self.fd = self.dev.fd
326328
self.started = True
327329
self.effect_id = -1
330+
self.effect_on_press_id = -1
328331
self.queue = []
329332
except Exception as e:
330333
# Prevent leftover rules in case of error
@@ -395,6 +398,38 @@ def consume(self, events: Sequence[Event]):
395398
self.effect_id = self.dev.upload_effect(effect)
396399
self.dev.write(getattr(ecodes, "EV_FF"), self.effect_id, 1)
397400

401+
case "vibrate_on_press":
402+
if not self.supports_vibration:
403+
continue
404+
405+
# Erase old effect
406+
if self.effect_on_press_id != -1:
407+
self.dev.erase_effect(self.effect_on_press_id)
408+
self.effect_on_press_id = -1
409+
410+
if ev["magnitude"] > 0:
411+
magnitude = min(
412+
int(ev["magnitude"] * 0xFFFF), 0xFFFF
413+
)
414+
415+
rumble = ff.Rumble(
416+
strong_magnitude=magnitude,
417+
weak_magnitude=magnitude,
418+
)
419+
420+
duration_ms = 80
421+
422+
effect = ff.Effect(
423+
getattr(ecodes, "FF_RUMBLE"),
424+
-1,
425+
0,
426+
ff.Trigger(0, 0),
427+
ff.Replay(duration_ms, 0),
428+
ff.EffectType(ff_rumble_effect=rumble),
429+
)
430+
self.effect_on_press_id = self.dev.upload_effect(effect)
431+
self.dev.write(getattr(ecodes, "EV_FF"), self.effect_on_press_id, 1)
432+
398433
def produce(self, fds: Sequence[int]) -> Sequence[Event]:
399434
out: list[Event] = []
400435
curr = time.time()
@@ -428,6 +463,15 @@ def produce(self, fds: Sequence[int]) -> Sequence[Event]:
428463

429464
while can_read(self.fd):
430465
for e in self.dev.read():
466+
if self.vibrate_on_press > 0:
467+
out.append(
468+
{
469+
"type": "vibrate_on_press",
470+
"code": "main",
471+
"magnitude": self.vibrate_on_press,
472+
}
473+
)
474+
431475
if e.type == B("EV_KEY"):
432476
if e.code == B("KEY_LEFTMETA"):
433477
self.start_held = e.value != 0

src/hhd/device/oxp/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ def controller_loop(
500500
btn_map=BTN_MAPPINGS,
501501
capabilities={EC("EV_KEY"): [EC("KEY_D")]},
502502
requires_start=True,
503+
vibrate_on_press=0.008,
503504
)
504505

505506
share_reboots = False

0 commit comments

Comments
 (0)