/* * KLUBHAUS ALERT v5.1 — " BOARD_NAME " Edition * * Target: LCDWiki E32R35T (ESP32-WROOM-32E + 3.5" ST7796S + XPT2046) * * Hold-and-release interaction model: * - Hold finger → progress bar fills * - Bar full → jitter/flash ("RELEASE!") * - Lift finger → action fires (finger already off screen) */ #include #include "Config.h" #include "DisplayManager.h" #include "DoorbellLogic.h" #include "BoardConfig.h" #include #ifndef LOAD_GLCD #error "LOAD_GLCD is NOT defined — fonts missing!" #endif #if USE_TFT_ESPI #ifndef ST7796_DRIVER #if USE_TFT_ESPI #error "TFT_eSPI setup mismatch — ST7796_DRIVER expected for E32R35T" #endif #endif #endif #define HOLD_TO_SILENCE_MS 1000 DoorbellLogic logic; DisplayManager display; void setup() { Serial.begin(115200); unsigned long t = millis(); while (!Serial && millis() - t < 3000) delay(10); delay(500); Serial.println("\n========================================"); Serial.println(" KLUBHAUS ALERT v5.1 — " BOARD_NAME ""); #if DEBUG_MODE Serial.println(" *** DEBUG MODE — _test topics ***"); #endif Serial.println("========================================"); display.begin(); logic.begin(); display.render(logic.getScreenState()); delay(1500); logic.beginWiFi(); display.render(logic.getScreenState()); logic.connectWiFiBlocking(); display.render(logic.getScreenState()); delay(1500); logic.finishBoot(); display.setBacklight(false); Serial.printf("[MEM] Free heap: %d | Free PSRAM: %d\n", ESP.getFreeHeap(), ESP.getFreePsram()); Serial.println("[BOOT] Ready — monitoring ntfy.sh\n"); } // ── Silence handler (delegates to DoorbellLogic) ──────────────── void silenceAlerts() { Serial.println("[SILENCE] User completed hold-to-silence gesture"); logic.onTouch(TouchEvent{true, 0, 0}); } void loop() { logic.update(); display.render(logic.getScreenState()); // Touch → hold-to-silence gesture TouchEvent evt = display.readTouch(); if (evt.pressed) { // Dashboard tile tap if (logic.getScreenState().screen == ScreenID::DASHBOARD) { int tile = display.dashboardTouch(evt.x, evt.y); if (tile >= 0) Serial.printf("[DASH] Tile %d tapped\n", tile); } } // Hold-to-silence during ALERT if (logic.getScreenState().deviceState == DeviceState::ALERTING) { HoldState h = display.updateHold(HOLD_TO_SILENCE_MS); if (h.completed) silenceAlerts(); // Hint animation when not touching if (!h.active) display.updateHint(); } // Serial commands if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd.length() > 0) logic.onSerialCommand(cmd); } } void loop() { logic.update(); display.render(logic.getScreenState()); // Touch → hold-to-silence gesture TouchEvent evt = display.readTouch(); if (evt.pressed) { // Dashboard tile tap if (logic.getScreenState().screen == ScreenID::DASHBOARD) { int tile = display.dashboardTouch(evt.x, evt.y); if (tile >= 0) Serial.printf("[DASH] Tile %d tapped\n", tile); } } // Hold-to-silence during ALERT if (logic.getScreenState().deviceState == DeviceState::ALERTING) { HoldState h = display.updateHold(HOLD_TO_SILENCE_MS); if (h.completed) silenceAlerts(); // Hint animation when not touching if (!h.active) display.updateHint(); } // Serial commands if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd.length() > 0) logic.onSerialCommand(cmd); } }