@@ -46,6 +46,18 @@ def _has_rotated_counter_clockwise(self, previous_value, current_value):
46
46
# Counter-clockwise rotation is indicated by a positive difference less than half the range
47
47
return 0 < diff < 32768
48
48
49
+ def _get_steps (self , previous_value , current_value ):
50
+ # Calculate difference considering wraparound
51
+ diff = (current_value - previous_value + 65536 ) % 65536
52
+ # Clockwise rotation is indicated by a positive difference less than half the range
53
+ if 0 < diff < 32768 :
54
+ return diff
55
+ # Counter-clockwise rotation is indicated by a negative difference less than half the range
56
+ elif 32768 < diff < 65536 :
57
+ return diff - 65536
58
+ else :
59
+ return 0
60
+
49
61
def _read_data (self ):
50
62
data = self .read (3 )
51
63
self ._pressed = data [2 ] != 0
@@ -78,11 +90,14 @@ def update(self):
78
90
has_rotated_clockwise = self ._has_rotated_clockwise (previous_value , self ._encoder_value )
79
91
has_rotated_counter_clockwise = self ._has_rotated_counter_clockwise (previous_value , self ._encoder_value )
80
92
93
+ # Figure out how many steps the encoder has moved since the last update
94
+ steps = self ._get_steps (previous_value , self ._encoder_value )
95
+
81
96
if (self ._on_rotate_clockwise and has_rotated_clockwise ):
82
- self ._on_rotate_clockwise (self ._encoder_value )
97
+ self ._on_rotate_clockwise (steps , self ._encoder_value )
83
98
84
99
if (self ._on_rotate_counter_clockwise and has_rotated_counter_clockwise ):
85
- self ._on_rotate_counter_clockwise (self ._encoder_value )
100
+ self ._on_rotate_counter_clockwise (steps , self ._encoder_value )
86
101
87
102
if (self ._on_press and self ._pressed and not previous_pressed_status ):
88
103
self ._on_press ()
0 commit comments