diff --git a/boards/esp32-32e-4/esp32-32e-4.ino b/boards/esp32-32e-4/esp32-32e-4.ino index 8b72e6a..be5e792 100644 --- a/boards/esp32-32e-4/esp32-32e-4.ino +++ b/boards/esp32-32e-4/esp32-32e-4.ino @@ -21,18 +21,12 @@ void setup() { } void loop() { - // ── Touch debug: poll continuously ── + // ── Read touch ── TouchEvent evt = display.readTouch(); + + // ── Touch debug ── if(evt.pressed) { Serial.printf("[TOUCH] pressed: x=%d, y=%d\n", evt.x, evt.y); - } else { - // Debug: print raw Z even when not touched, to see controller state - static uint32_t lastDebug = 0; - if(millis() - lastDebug > 2000) { - lastDebug = millis(); - uint16_t z = tftDriver.getRawTouchZ(); - Serial.printf("[TOUCH] Raw Z=%d\n", z); - } } // ── State machine tick ── @@ -41,8 +35,11 @@ void loop() { // ── Render current screen ── display.render(logic.getScreenState()); - // ── Touch handling ── + // ── Touch handling (tap gestures) ── const ScreenState& st = logic.getScreenState(); + int tile = logic.handleTouch(evt); + + // ── Hold gesture (for silencing alerts) ── static int holdStartX = -1; static int holdStartY = -1; @@ -54,9 +51,8 @@ void loop() { holdStartY = -1; } if(h.started) { - TouchEvent t = display.readTouch(); - holdStartX = t.x; - holdStartY = t.y; + holdStartX = evt.x; + holdStartY = evt.y; } if(holdStartX >= 0) { display.updateHint(holdStartX, holdStartY, h.active); @@ -66,15 +62,6 @@ void loop() { holdStartY = -1; } - if(st.screen == ScreenID::DASHBOARD) { - TouchEvent evt = display.readTouch(); - if(evt.pressed) { - int tile = display.dashboardTouch(evt.x, evt.y); - if(tile >= 0) - Serial.printf("[DASH] Tile %d tapped\n", tile); - } - } - // ── Serial console ── if(Serial.available()) { String cmd = Serial.readStringUntil('\n'); diff --git a/boards/esp32-32e/esp32-32e.ino b/boards/esp32-32e/esp32-32e.ino index 74835b8..bf1217e 100644 --- a/boards/esp32-32e/esp32-32e.ino +++ b/boards/esp32-32e/esp32-32e.ino @@ -21,14 +21,20 @@ void setup() { } void loop() { + // ── Read touch ── + TouchEvent evt = display.readTouch(); + // ── State machine tick ── logic.update(); // ── Render current screen ── display.render(logic.getScreenState()); - // ── Touch handling ── + // ── Touch handling (tap gestures) ── const ScreenState& st = logic.getScreenState(); + int tile = logic.handleTouch(evt); + + // ── Hold gesture (for silencing alerts) ── static int holdStartX = -1; static int holdStartY = -1; @@ -40,11 +46,9 @@ void loop() { holdStartY = -1; } if(h.started) { - TouchEvent t = display.readTouch(); - holdStartX = t.x; - holdStartY = t.y; + holdStartX = evt.x; + holdStartY = evt.y; } - // Fix for esp32-32e.ino if(holdStartX >= 0) { display.updateHint(holdStartX, holdStartY, h.active); } @@ -53,15 +57,6 @@ void loop() { holdStartY = -1; } - if(st.screen == ScreenID::DASHBOARD) { - TouchEvent evt = display.readTouch(); - if(evt.pressed) { - int tile = display.dashboardTouch(evt.x, evt.y); - if(tile >= 0) - Serial.printf("[DASH] Tile %d tapped\n", tile); - } - } - // ── Serial console ── if(Serial.available()) { String cmd = Serial.readStringUntil('\n'); diff --git a/boards/esp32-s3-lcd-43/esp32-s3-lcd-43.ino b/boards/esp32-s3-lcd-43/esp32-s3-lcd-43.ino index ea2cfb6..d5fa564 100644 --- a/boards/esp32-s3-lcd-43/esp32-s3-lcd-43.ino +++ b/boards/esp32-s3-lcd-43/esp32-s3-lcd-43.ino @@ -21,14 +21,18 @@ void setup() { } void loop() { + // ── Read touch ── TouchEvent evt = display.readTouch(); + // ── State machine tick ── logic.update(); display.render(logic.getScreenState()); + // ── Touch handling (tap gestures) ── const ScreenState& st = logic.getScreenState(); + int tile = logic.handleTouch(evt); - // Track initial hold position for hint + // ── Hold gesture (for silencing alerts) ── static int holdStartX = -1; static int holdStartY = -1; @@ -43,7 +47,6 @@ void loop() { holdStartX = evt.x; holdStartY = evt.y; } - // Draw hint during hold (ACTIVE) or idle (IDLE) if(holdStartX >= 0) { if(h.active) { display.updateHint(holdStartX, holdStartY, true); @@ -55,21 +58,6 @@ void loop() { holdStartX = -1; holdStartY = -1; } - if(evt.pressed) { - if(st.screen == ScreenID::OFF) { - // Tap in OFF mode → wake to DASHBOARD - Serial.println("[TOUCH] OFF → DASHBOARD"); - logic.setScreen(ScreenID::DASHBOARD); - display.setBacklight(true); - } else if(st.screen == ScreenID::DASHBOARD) { - int tile = display.dashboardTouch(evt.x, evt.y); - if(tile >= 0) { - Serial.printf("[DASH] Tile %d tapped\n", tile); - } - } else if(st.screen == ScreenID::ALERT) { - Serial.println("[TOUCH] ALERT tap"); - } - } if(Serial.available()) { String cmd = Serial.readStringUntil('\n'); diff --git a/libraries/KlubhausCore/src/DoorbellLogic.cpp b/libraries/KlubhausCore/src/DoorbellLogic.cpp index 567fdc0..43e9aa0 100644 --- a/libraries/KlubhausCore/src/DoorbellLogic.cpp +++ b/libraries/KlubhausCore/src/DoorbellLogic.cpp @@ -278,3 +278,29 @@ void DoorbellLogic::setScreen(ScreenID s) { _display->setBacklight(needsBacklight); _state.backlightOn = needsBacklight; } + +int DoorbellLogic::handleTouch(const TouchEvent& evt) { + if(!evt.pressed) + return -1; + + if(_state.screen == ScreenID::OFF) { + Serial.println("[TOUCH] OFF → DASHBOARD"); + setScreen(ScreenID::DASHBOARD); + return -1; + } + + if(_state.screen == ScreenID::DASHBOARD) { + int tile = _display->dashboardTouch(evt.x, evt.y); + if(tile >= 0) { + Serial.printf("[DASH] Tile %d tapped\n", tile); + } + return tile; + } + + if(_state.screen == ScreenID::ALERT) { + Serial.println("[TOUCH] ALERT tap"); + return -1; + } + + return -1; +} diff --git a/libraries/KlubhausCore/src/DoorbellLogic.h b/libraries/KlubhausCore/src/DoorbellLogic.h index 75711c5..85311ae 100644 --- a/libraries/KlubhausCore/src/DoorbellLogic.h +++ b/libraries/KlubhausCore/src/DoorbellLogic.h @@ -25,6 +25,8 @@ public: /// Externally trigger silence (e.g. hold-to-silence gesture). void silenceAlert(); void setScreen(ScreenID s); + /// Handle touch input — returns dashboard tile index if tapped, or -1. + int handleTouch(const TouchEvent& evt); private: void pollTopics(); diff --git a/mise.toml b/mise.toml index 6fdef09..78eaf6b 100644 --- a/mise.toml +++ b/mise.toml @@ -2,6 +2,46 @@ # Klubhaus Doorbell — Multi-Target Build Harness # ═══════════════════════════════════════════════════════════ +# Usage: +# BOARD=esp32-32e-4 mise run compile # compile for esp32-32e-4 +# BOARD=esp32-32e-4 mise run upload # upload to esp32-32e-4 +# BOARD=esp32-32e-4 mise run monitor # monitor esp32-32e-4 +# +# Valid BOARD values: esp32-32e, esp32-32e-4, esp32-s3-43 + +[tasks.compile] +description = "Compile (uses BOARD env var)" +run = """ +case "$BOARD" in + esp32-32e) mise run compile-32e ;; + esp32-32e-4) mise run compile-32e-4 ;; + esp32-s3-43) mise run compile-s3-43 ;; + *) echo "Unknown BOARD: $BOARD" && exit 1 ;; +esac +""" + +[tasks.upload] +description = "Upload (uses BOARD env var)" +run = """ +case "$BOARD" in + esp32-32e) mise run upload-32e ;; + esp32-32e-4) mise run upload-32e-4 ;; + esp32-s3-43) mise run upload-s3-43 ;; + *) echo "Unknown BOARD: $BOARD" && exit 1 ;; +esac +""" + +[tasks.monitor] +description = "Monitor (uses BOARD env var)" +run = """ +case "$BOARD" in + esp32-32e) mise run monitor-32e ;; + esp32-32e-4) mise run monitor-32e-4 ;; + esp32-s3-43) mise run monitor-s3-43 ;; + *) echo "Unknown BOARD: $BOARD" && exit 1 ;; +esac +""" + [tasks.install-libs-shared] description = "Install shared (platform-independent) libraries" run = """