1
+ from micropython import const
2
+
1
3
from random import randint
2
4
3
5
from kmk .keys import Key , make_argumented_key
4
6
from kmk .modules import Module
7
+ from kmk .utils import Debug
8
+
9
+ debug = Debug (__name__ )
10
+
11
+ _INACTIVE = const (0 )
12
+ _HOLD = const (1 )
13
+ _ACTIVE = const (2 )
5
14
6
15
7
16
class RapidFireKey (Key ):
@@ -13,7 +22,7 @@ def __init__(
13
22
enable_interval_randomization = False ,
14
23
randomization_magnitude = 15 ,
15
24
toggle = False ,
16
- * kwargs ,
25
+ ** kwargs ,
17
26
):
18
27
super ().__init__ (** kwargs )
19
28
self .key = key
@@ -22,13 +31,11 @@ def __init__(
22
31
self .enable_interval_randomization = enable_interval_randomization
23
32
self .randomization_magnitude = randomization_magnitude
24
33
self .toggle = toggle
34
+ self ._state = _INACTIVE
35
+ self ._timeout = None
25
36
26
37
27
38
class RapidFire (Module ):
28
- _active_keys = {}
29
- _toggled_keys = []
30
- _waiting_keys = []
31
-
32
39
def __init__ (self ):
33
40
make_argumented_key (
34
41
names = ('RF' ,),
@@ -37,51 +44,57 @@ def __init__(self):
37
44
on_release = self ._rf_released ,
38
45
)
39
46
40
- def _get_repeat (self , key ):
47
+ def _on_timer_timeout (self , key , keyboard ):
48
+ if key ._state == _HOLD :
49
+ key ._state = _ACTIVE
50
+ keyboard .remove_key (key .key )
51
+ key ._timeout = keyboard .set_timeout (
52
+ 1 , lambda : self ._on_timer_timeout (key , keyboard )
53
+ )
54
+ return
55
+
56
+ keyboard .add_key (key .key )
57
+ keyboard .set_timeout (1 , lambda : keyboard .remove_key (key .key ))
58
+
59
+ interval = key .interval
41
60
if key .enable_interval_randomization :
42
- return key . interval + randint (
61
+ interval += randint (
43
62
- key .randomization_magnitude , key .randomization_magnitude
44
63
)
45
- return key .interval
46
-
47
- def _on_timer_timeout (self , key , keyboard ):
48
- keyboard .tap_key (key .key )
49
- if key in self ._waiting_keys :
50
- self ._waiting_keys .remove (key )
51
- if key .toggle and key not in self ._toggled_keys :
52
- self ._toggled_keys .append (key )
53
- self ._active_keys [key ] = keyboard .set_timeout (
54
- self ._get_repeat (key ), lambda : self ._on_timer_timeout (key , keyboard )
64
+ key ._timeout = keyboard .set_timeout (
65
+ interval , lambda : self ._on_timer_timeout (key , keyboard )
55
66
)
56
67
68
+ if debug .enabled :
69
+ debug (key .key , ' @' , interval , 'ms' )
70
+
57
71
def _rf_pressed (self , key , keyboard , * args , ** kwargs ):
58
- if key in self ._toggled_keys :
59
- self ._toggled_keys .remove (key )
72
+ if key ._state == _ACTIVE :
60
73
self ._deactivate_key (key , keyboard )
61
74
return
62
- if key .timeout > 0 :
63
- keyboard .tap_key (key .key )
64
- self ._waiting_keys .append (key )
65
- self ._active_keys [key ] = keyboard .set_timeout (
66
- key .timeout , lambda : self ._on_timer_timeout (key , keyboard )
67
- )
68
- else :
69
- self ._on_timer_timeout (key , keyboard )
75
+
76
+ keyboard .add_key (key .key )
77
+ key ._state = _HOLD
78
+ key ._timeout = keyboard .set_timeout (
79
+ key .timeout , lambda : self ._on_timer_timeout (key , keyboard )
80
+ )
70
81
71
82
def _rf_released (self , key , keyboard , * args , ** kwargs ):
72
- if key not in self ._active_keys :
73
- return
74
- if key in self ._toggled_keys :
75
- if key not in self ._waiting_keys :
83
+ if key ._state == _ACTIVE :
84
+ if key .toggle :
76
85
return
77
- self ._toggled_keys .remove (key )
78
- if key in self ._waiting_keys :
79
- self ._waiting_keys .remove (key )
86
+ key ._state = _INACTIVE
87
+ elif key ._state == _INACTIVE :
88
+ return
89
+ else :
90
+ keyboard .remove_key (key .key )
91
+
80
92
self ._deactivate_key (key , keyboard )
81
93
82
94
def _deactivate_key (self , key , keyboard ):
83
- keyboard .cancel_timeout (self ._active_keys [key ])
84
- self ._active_keys .pop (key )
95
+ keyboard .cancel_timeout (key ._timeout )
96
+ key ._state = _INACTIVE
97
+ key ._timeout = None
85
98
86
99
def during_bootup (self , keyboard ):
87
100
return
0 commit comments