#include #include "Config.h" #include "DoorbellLogic.h" #include "DisplayManager.h" #define HOLD_TO_SILENCE_MS 1000 DoorbellLogic logic; DisplayManager display; void setup() { Serial.begin(115200); delay(1000); Serial.println("\n=== KLUBHAUS ALERT v5.1 ==="); display.begin(); logic.begin(); display.render(logic.getScreenState()); delay(2000); logic.beginWiFi(); display.render(logic.getScreenState()); logic.connectWiFiBlocking(); display.render(logic.getScreenState()); delay(1500); logic.finishBoot(); display.render(logic.getScreenState()); } void loop() { logic.update(); const ScreenState& state = logic.getScreenState(); // ---- Touch handling (varies by screen) ---- if (state.screen == ScreenID::ALERT) { // Hold-to-silence: progress bar drawn by render() HoldState hold = display.updateHold(HOLD_TO_SILENCE_MS); if (hold.completed) { Serial.println("[HOLD] Silence hold completed"); logic.onTouch(TouchEvent{true, hold.x, hold.y}); } } else if (state.screen == ScreenID::DASHBOARD) { // Dashboard: tile taps don't dismiss, outside taps dismiss 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); // Tile-specific actions go here later } else { // Tap outside tiles — dismiss dashboard logic.onTouch(evt); } } } else { // All other screens (OFF, boot, etc): simple touch TouchEvent evt = display.readTouch(); if (evt.pressed) { logic.onTouch(evt); } } // ---- Render ---- display.render(logic.getScreenState()); // ---- Serial commands ---- if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd.length() > 0) logic.onSerialCommand(cmd); } }