Skip to content

Commit ed074ef

Browse files
committed
Discard long-hold swipes
1 parent 885a83c commit ed074ef

4 files changed

Lines changed: 26 additions & 12 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Added new context arrows, customizable colors, and a page index indicator for me
1515
### Other Bug Fixes and Improvements
1616
- Settings: Reduced default _Buttons Debounce_ value (with an even lower default on _M5StickV_)
1717
- Settings: Expanded value ranges for _Touch Threshold_ and _Buttons Debounce_
18-
- Swipe handling: Diagonal swipes are now discarded, and the swipe detection threshold has been slightly reduced
18+
- Swipe handling: Diagonal and long-hold swipes are now discarded, and the swipe detection threshold has been slightly reduced
1919
- Keypad: Added backtick **`**
2020
- Bugfix: Screensaver not activating in menu pages without statusbar
2121
- Embit: Improved BIP39 mnemonic validation

src/krux/touch.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
PRESSED = 1
3131
RELEASED = 2
3232

33+
SWIPE_DURATION_MS = 750
3334
SWIPE_THRESHOLD = 35
3435
SWIPE_RIGHT = 1
3536
SWIPE_LEFT = 2
@@ -48,6 +49,7 @@ def __init__(self, width, height, irq_pin=None, res_pin=None):
4849
For Krux width = max_y, height = max_x
4950
"""
5051
self.sample_time = 0
52+
self.pressed_time = 0
5153
self.y_regions = []
5254
self.x_regions = []
5355
self.index = 0
@@ -223,26 +225,35 @@ def current_state(self):
223225
data = self.touch_driver.current_point()
224226
if isinstance(data, tuple):
225227
self._store_points(data)
226-
elif data is None: # gets release then return to idle.
228+
return self.state
229+
230+
if data is None: # gets release then return to idle.
227231
if self.state == RELEASED: # On touch release
228232
self.state = IDLE
229-
elif self.state == PRESSED:
233+
return self.state
234+
235+
if self.state == PRESSED:
230236
self.state = RELEASED
237+
231238
if self.release_point is not None:
232239
dx = self.release_point[0] - self.press_point[0][0]
233240
dy = self.release_point[1] - self.press_point[0][1]
234241

235242
if abs(dx) > SWIPE_THRESHOLD or abs(dy) > SWIPE_THRESHOLD:
236-
# discards swipes with angle > 27 degrees
237-
if abs(dx) > abs(dy) * 2:
238-
self.gesture = SWIPE_LEFT if dx < 0 else SWIPE_RIGHT
239-
elif abs(dy) > abs(dx) * 2:
240-
self.gesture = SWIPE_UP if dy < 0 else SWIPE_DOWN
243+
# discard swipes that took more than ~1s
244+
if self.sample_time - self.pressed_time < SWIPE_DURATION_MS:
245+
# discards swipes with angle > 27 degrees
246+
if abs(dx) > abs(dy) * 2:
247+
self.gesture = SWIPE_LEFT if dx < 0 else SWIPE_RIGHT
248+
elif abs(dy) > abs(dx) * 2:
249+
self.gesture = SWIPE_UP if dy < 0 else SWIPE_DOWN
250+
else:
251+
self.gesture = SWIPE_NONE # undetermined diagonal swipe
241252
else:
242-
# undetermined diagonal swipe
243-
self.gesture = SWIPE_NONE
244-
else:
245-
print("Touch error")
253+
self.gesture = SWIPE_NONE # hold finger on screen for too long
254+
return self.state
255+
256+
print("Touch error")
246257
return self.state
247258

248259
def event(self, validate_position=True):
@@ -257,6 +268,7 @@ def event(self, validate_position=True):
257268
if isinstance(self.touch_driver.irq_point, tuple):
258269
if self.valid_position(self.touch_driver.irq_point):
259270
self._store_points(self.touch_driver.irq_point)
271+
self.pressed_time = time.ticks_ms()
260272
return True
261273
return False
262274

tests/test_input.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ def mock_points(point1, point2):
691691
"current_point",
692692
side_effect=[None, point1, point2, None, None],
693693
)
694+
input.touch.pressed_time = time.ticks_ms()
694695

695696
# Swipe Right
696697
input.touch.clear_regions()

tests/test_touch.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ def test_gesture_detection(
308308
touch.state = PRESSED
309309
touch.press_point = [press_point]
310310
touch.release_point = release_point
311+
touch.pressed_time = time.ticks_ms()
311312

312313
touch.current_state()
313314

0 commit comments

Comments
 (0)