Replaces the build-flag-driven #ifdef sprawl (~30 blocks across 6 files)
with a small HAL in firmware/src/hal/ and per-board folders under
firmware/src/boards/. Shared code (main.cpp, ui.cpp, splash.cpp) no
longer contains a single `#ifdef BOARD_*` — optional features are
guarded by BoardCaps (runtime) and BOARD_HAS_* macros (compile-time,
inside the board's own files).
Why: lets community contributors port to new ESP32 + AMOLED + touch
combos by dropping in a boards/<name>/ folder + a PlatformIO env,
without touching shared files. See docs/porting/adding-a-board.md.
Highlights:
- New HAL: display_hal, touch_hal, input_hal, power_hal, imu_hal,
board_caps. Each board provides display.cpp, touch.cpp, input.cpp,
power.cpp, imu.cpp, caps.cpp, board_init.cpp + private hardware
drivers (e.g. io_expander.{h,cpp} on AMOLED-1.8).
- PlatformIO build_src_filter selects each board's folder per env.
- ui.cpp picks fonts and layout from board_caps() via compute_layout()
with screen-height breakpoints (>= 460 → large, else compact).
- splash.cpp computes CELL = min(W,H)/20 — responsive instead of two
hardcoded values.
- idle.cpp (from #24) rewired through display_hal + power_hal — no
longer depends on the deleted display_cfg.h / power.h.
- power_hal gains power_hal_is_vbus_in() for idle's
IDLE_SLEEP_WHEN_CHARGING gate.
- boards/template/ + docs/porting/{adding-a-board,hal-contract,
capability-flags}.md to bootstrap new ports.
- display_cfg.h, power.{h,cpp}, imu.{h,cpp}, io_expander.{h,cpp}
deleted from src/ root (moved into boards/<name>/ or hal/).
Verification: both `pio run -e waveshare_amoled_216` and
`pio run -e waveshare_amoled_18` succeed unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
24 lines
1.0 KiB
C
24 lines
1.0 KiB
C
#pragma once
|
|
#include <stdint.h>
|
|
|
|
// Runtime board description consumed by board-agnostic code (UI, main loop).
|
|
// Each board provides a single BoardCaps instance via board_caps().
|
|
//
|
|
// Compile-time-only facts (pin numbers, library choice) belong in
|
|
// boards/<name>/board.h and never leak into shared code. Anything the UI or
|
|
// main loop needs at runtime — display size, optional-feature presence —
|
|
// goes here so shared code stays free of #ifdef BOARD_*.
|
|
struct BoardCaps {
|
|
const char* name; // human-readable, e.g. "Waveshare AMOLED 2.16"
|
|
|
|
int16_t width; // active display width in pixels
|
|
int16_t height; // active display height in pixels
|
|
|
|
uint8_t button_count; // 1 = primary (BOOT) only; 2 = primary + secondary
|
|
bool has_rotation; // IMU-driven CPU rotation in the flush callback
|
|
bool has_battery; // AXP2101 battery measurement is meaningful
|
|
bool has_imu; // QMI8658 (or compatible) is populated
|
|
};
|
|
|
|
const BoardCaps& board_caps(void);
|