David Gwilliam 8e39a1f23c refactor: add active parameter to updateHint method signature
1. **Method Signature Update**: Added `bool active` parameter to `updateHint()` method across the display driver hierarchy:
   - `DisplayManager::updateHint(x, y, active)` - delegates to driver
   - `DisplayDriverTFT::updateHint(x, y, active)` - override implementation
   - `DisplayDriverGFX::updateHint(x, y, active)` - override implementation

2. **Code Formatting**: `DisplayManager.h` reformatted (whitespace/comment style changes only)

- **Breaking Change**: All existing `updateHint(x, y)` calls will fail to compile until updated to include the `active` parameter
- **Enhanced Control**: Callers can now explicitly show/hide touch hints rather than just updating position, enabling better touch feedback UX (e.g., hide hint on touch release)
- **API Consistency**: All implementations in the driver hierarchy now enforce the same signature
2026-02-17 05:23:43 -08:00
2026-02-16 19:08:47 -08:00
2026-02-16 19:08:47 -08:00
2026-02-16 19:08:47 -08:00

Klubhaus Doorbell

Multi-target doorbell alert system powered by ntfy.sh.

Targets

Board Display Library Build Task
ESP32-32E SPI TFT (ILI9341 etc.) TFT_eSPI mise run compile-32e
ESP32-S3-Touch-LCD-4.3 800x480 RGB parallel Arduino_GFX mise run compile-s3-43

Quick Start

  1. Install prerequisites: arduino-cli (with esp32:esp32 platform) and mise.

  2. Edit WiFi credentials:

     cp boards/esp32-32e/secrets.h.example boards/esp32-32e/secrets.h
     cp boards/esp32-s3-lcd-43/secrets.h.example boards/esp32-s3-lcd-43/secrets.h
    

    Then edit both secrets.h files with your WiFi SSIDs and passwords.

  3. Build and upload:

     mise run compile-s3-43
     mise run upload-s3-43
    
     mise run compile-32e
     mise run upload-32e
    

Project Structure

.
├── libraries/
│   └── KlubhausCore/              Shared Arduino library
│       └── src/
│           ├── KlubhausCore.h     Umbrella include
│           ├── Config.h           Shared constants
│           ├── ScreenState.h      State enums / structs
│           ├── IDisplayDriver.h   Abstract display interface
│           ├── DisplayManager.h   Thin delegation wrapper
│           ├── NetManager.*       WiFi, NTP, HTTP
│           └── DoorbellLogic.*    State machine, ntfy polling
├── boards/
│   ├── esp32-32e/                 ESP32-32E sketch
│   │   ├── esp32-32e.ino
│   │   ├── board_config.h
│   │   ├── secrets.h              (gitignored)
│   │   ├── tft_user_setup.h
│   │   └── DisplayDriverTFT.*
│   └── esp32-s3-lcd-43/           ESP32-S3-LCD-4.3 sketch
│       ├── esp32-s3-lcd-43.ino
│       ├── board_config.h
│       ├── secrets.h              (gitignored)
│       └── DisplayDriverGFX.*
├── vendor/                        Per-board vendored display libs
│   ├── esp32-32e/TFT_eSPI/
│   └── esp32-s3-lcd-43/GFX_Library_for_Arduino/
└── mise.toml                      Build harness

Serial Commands

Type into the serial monitor at 115200 baud:

Command Action
alert Trigger a test alert
silence Silence current alert
dashboard Show dashboard screen
off Turn off display
status Print state + memory info
reboot Restart device

Architecture

Each board target gets its own sketch directory with a concrete IDisplayDriver implementation. The shared KlubhausCore library contains all business logic, networking, and the abstract interface. Arduino CLI's --libraries flag ensures each board only links its own vendored display library -- no preprocessor conflicts.

Board sketch (.ino)
    |
    +-- #include <KlubhausCore.h>    (shared library)
    |       +-- DoorbellLogic        (state machine + ntfy polling)
    |       +-- NetManager           (WiFi, HTTP, NTP)
    |       +-- DisplayManager       (delegates to IDisplayDriver)
    |       +-- IDisplayDriver       (pure virtual interface)
    |
    +-- DisplayDriverXxx             (board-specific, concrete driver)
            +-- links against vendored display lib
                (TFT_eSPI or Arduino_GFX, never both)
Description
No description provided
Readme 93 MiB
Languages
C++ 79%
C 10.1%
Shell 8.2%
Python 2.7%