A complete `pio run` (all 16 environments) on Linux turned up 6
failures beyond the case-sensitive-include fix already on this
branch:
1. meck_remote_repeater, meck_wifi_repeater, meck_wifi_repeater_t5s3
compile GxEPDDisplay.cpp / FastEPDDisplay.cpp, which #include
MeckFonts.h whenever HAS_MECK_FONTS is defined. HAS_MECK_FONTS is
set at the shared variant-base level (so all envs in that variant
inherit it), but the `-I examples/companion_radio/ui-new` include
path needed to find MeckFonts.h was only added to the
companion-radio envs, not the repeater envs in the same file.
Added the missing -I flag to the three repeater env sections.
2. meck_wifi_repeater_heltec_v3/v4/v4_headless failed with "missing
SConscript file 'merge-bin.py'". esp32_base's extra_scripts still
pointed at merge-bin.py, which was deleted in 451f4b01 ("remove
redundant merge script"). Other variants override extra_scripts
themselves so they never hit the stale base default; the Heltec
variants don't, so they inherited the broken reference. Pointed
esp32_base at merge_firmware.py instead, matching every variant
that already sets this explicitly.
3. After fix#1, meck_wifi_repeater_t5s3 still failed: wifimqtt.cpp
had a hardcoded `extern AutoDiscoverRTCClock rtc_clock;`, but the
T5S3 variant declares its global rtc_clock as PCF85063Clock (a
different concrete RTCClock subclass) in target.h. The local
extern was redundant anyway, since target.h is already included
at the top of this file and declares the correctly-typed global
for whichever variant is being built. Removed the stale extern so
the call resolves through the existing declaration.
Verified: `pio run` now succeeds for all 16 environments.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The repo has apparently only ever been built on case-insensitive
filesystems (macOS/Windows): every #include in the codebase uses
intended PascalCase/CamelCase header names (e.g. "SettingsScreen.h",
"WiFiMQTT.h"), but 28 of the actual files on disk were saved with
inconsistent casing (e.g. "Settingsscreen.h", "wifimqtt.h"). On a
case-sensitive filesystem (Linux) this is a hard compile failure, not
a cosmetic mismatch -- confirmed by running `pio run -e meck_audio_ble`
on Gentoo Linux, which failed immediately on "target.h: No such file
or directory" and a cascade of similar errors as each fix exposed the
next one.
Root causes, two flavors of the same underlying bug:
1. Header filename casing (29 files renamed via `git mv` to preserve
history): examples/companion_radio/ui-new/*, examples/simple_repeater/*,
and two variant-local headers (PCF85063Clock.h, TCA8418Keyboard.h x2).
Verified safe before renaming: every file has exactly one consistent
intended casing across all the places that #include it (checked via
a repo-wide scan comparing every #include against on-disk filenames,
zero conflicts found), so each rename is a pure no-op for behavior.
2. PlatformIO config paths using the wrong case for variant directories
that are actually lowercase on disk (variants/lilygo_tdeck_pro,
variants/lilygo_t5s3_epaper_pro):
- `-I variants/LilyGo_TDeck_Pro` / `-I variants/LilyGo_T5S3_EPaper_Pro`
in build_flags (3 occurrences, including lilygo_tdeck_max's
reference to TDeck Pro's shared headers) -- broke header resolution
for target.h and friends.
- `+<../variants/LilyGo_TDeck_Pro>` / `+<../variants/LilyGo_T5S3_EPaper_Pro>`
in build_src_filter (2 occurrences) -- silently excluded the board-init
.cpp files (TDeckBoard.cpp etc.) from compilation entirely, which
didn't fail until the *link* stage ("undefined reference to
radio_init()", `TDeckBoard::begin()`, etc.) since PlatformIO's glob
just matched nothing rather than erroring.
Verified fix: `pio run -e meck_audio_ble` now compiles, links, and
produces a firmware image cleanly (RAM 53.1%, Flash 49.6%).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ANON_REQ_TYPE_OWNER, firmware-ver removed (security exploit)
* ANON_REQ_TYPE_BASIC, formware-ver removed, just remote clock + some 'feature' bits
* CTL_TYPE_NODE_DISCOVER_REQ now ingored if 'repeat off' has been set
* repeater: onControlDataRecv(), now responds to new CTL_TYPE_NODE_DISCOVER_REQ (zero hop only)
* node prefs: new discovery_mod_timestamp (will be set to affect when node should respond to DISCOVERY_REQ's )