fix(touch): ignorar toque continuo al entrar a configMenu hasta soltar y presionar de nuevo

This commit is contained in:
Sebastián Nieto 2026-10-13 22:20:03 -03:00
parent 63a7f8161a
commit f6caf547fe
2 changed files with 23 additions and 6 deletions

View file

@ -2915,7 +2915,9 @@ void configMenu() {
tft.fillScreen(TFT_BLACK);
drawConfigHeader();
listMenu(select, scrollOffset);
waitForTouchRelease();
// Exigir que el usuario levante el dedo antes de registrar cualquier pulsacion en los submenues
bool requireTouchRelease = true;
while (true) {
if (wokeFromSleep || checkMenuTimeout()) break;
@ -2923,8 +2925,19 @@ void configMenu() {
int8_t executeSelect = -1;
uint16_t tx = 0, ty = 0;
bool touched = getTouch(&tx, &ty);
bool btnLow = (digitalRead(SELECTOR_PIN) == LOW);
if (getTouch(&tx, &ty)) {
// Solo habilitar interacciones cuando se haya soltado la pantalla y el boton por completo
if (!touched && !btnLow) {
requireTouchRelease = false;
}
if (touched) {
if (requireTouchRelease) {
delay(15);
continue;
}
resetMenuActivity();
int8_t touchedOpt = -1;
@ -2995,7 +3008,11 @@ void configMenu() {
executeSelect = select;
}
}
} else if (digitalRead(SELECTOR_PIN) == LOW) {
} else if (btnLow) {
if (requireTouchRelease) {
delay(15);
continue;
}
resetMenuActivity();
if (!pressed) {
pressed = true;

View file

@ -49,12 +49,12 @@ inline bool isScreenPressed() {
}
// Wait until both touchscreen and selector button are completely released with
// 30ms continuous debounce and 250ms maximum hardware safety timeout
inline void waitForTouchRelease() {
// 30ms continuous debounce and 4000ms maximum hardware safety timeout
inline void waitForTouchRelease(uint32_t maxWaitMs = 4000) {
uint16_t dummyX, dummyY;
uint8_t releaseCount = 0;
uint32_t startWait = millis();
while (releaseCount < 3 && (millis() - startWait < 250)) {
while (releaseCount < 3 && (millis() - startWait < maxWaitMs)) {
if (getTouch(&dummyX, &dummyY) || (digitalRead(SELECTOR_PIN) == LOW)) {
releaseCount = 0;
} else {