@@ -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
0 commit comments