feat: use T-gesture for unlocking to prevent accidental unlocks

master
Leon Weber-Genzel 2025-05-26 12:32:03 +02:00
parent 8210e62e01
commit 8db9dda4e0
1 changed files with 27 additions and 6 deletions

View File

@ -28,7 +28,15 @@
const BUZZ_TOTAL_TIME = 5000; // 5 seconds total const BUZZ_TOTAL_TIME = 5000; // 5 seconds total
/** Gesture control constants */ /** Gesture control constants */
const DOUBLE_SWIPE_TIMEOUT = 1500; // 1.5 seconds between swipes const UNLOCK_GESTURE_TIMEOUT = 1500; // milliseconds before unlock gesture has to be started from scratcb
const UNLOCK_CONTROL_TIMEOUT = 5000; // milliseconds before gesture control locks again
const DIRECTION_LEFT = "left";
const DIRECTION_RIGHT = "right";
const DIRECTION_UP = "up";
const DIRECTION_DOWN = "down";
// ============================================================================= // =============================================================================
// STATE VARIABLES // STATE VARIABLES
@ -208,6 +216,19 @@
WIDGETS["widtimer"].draw(); WIDGETS["widtimer"].draw();
} }
function isHorizontal(direction) {
return (direction == DIRECTION_LEFT) || (direction == DIRECTION_RIGHT)
}
function isVertical(direction) {
return (direction == DIRECTION_UP) || (direction == DIRECTION_DOWN)
}
function isUnlockGesture(first_direction, second_direction) {
return (isHorizontal(first_direction) && isVertical(second_direction)
|| isVertical(first_direction) && isHorizontal(second_direction))
}
/** /**
* Set up gesture handlers with double-swipe protection against accidental activation * Set up gesture handlers with double-swipe protection against accidental activation
*/ */
@ -254,15 +275,15 @@
if (!isControlLocked) { if (!isControlLocked) {
// Controls unlocked - execute adjustment immediately // Controls unlocked - execute adjustment immediately
adjustTimer(adjustment); adjustTimer(adjustment);
} else if (lastSwipeDirection === direction && } else if (isUnlockGesture(direction, lastSwipeDirection) &&
currentTime - lastSwipeTime < DOUBLE_SWIPE_TIMEOUT) { currentTime - lastSwipeTime < UNLOCK_GESTURE_TIMEOUT) {
// Double swipe detected - unlock controls and execute // Double swipe detected - unlock controls and execute
isControlLocked = false; isControlLocked = false;
adjustTimer(adjustment); // adjustTimer(adjustment);
Bangle.buzz(50); // Provide unlock feedback Bangle.buzz(50); // Provide unlock feedback
// Auto-lock after 10 seconds of inactivity // Auto-lock after `UNLOCK_CONTROL_TIMEOUT` seconds of inactivity
setTimeout(resetUnlock, 10000); setTimeout(resetUnlock, UNLOCK_CONTROL_TIMEOUT);
} }
// Update gesture tracking state // Update gesture tracking state