diff --git a/build_legacy.sh b/build_legacy.sh index 31d15a956..f3a3bd377 100755 --- a/build_legacy.sh +++ b/build_legacy.sh @@ -3061,6 +3061,7 @@ requires_dram_limited_neighbors() { # 8 KiB static reserve at 254 neighbors. Use their board-declared 50-entry # tables when the OTA manager is included. case "${1,,}" in + heltec_wireless_tracker_repeater_observer_mqtt|\ heltec_tracker_v1_1_repeater_observer_mqtt|\ heltec_tracker_v2_repeater_observer_mqtt) # The non-PSRAM Tracker's color framebuffer, MQTT/TLS and OTA leave diff --git a/docs/optional_screens.md b/docs/optional_screens.md index fb22769a9..8952c6101 100644 --- a/docs/optional_screens.md +++ b/docs/optional_screens.md @@ -34,6 +34,10 @@ recipe has no verified panel readback connection. Detection is not enabled for that wiring. A touchscreen acknowledgement alone does not establish that the LCD responds. The V4 R8 TFT and older V4 TFT pin mappings are distinct. +Full Wireless Tracker repeaters retain the board's 50-neighbor capacity, as +the V1.1 and V2 Full profiles already do. This preserves RAM for the screen, +GPS, MQTT and update services; the RAM admission limits remain unchanged. + The R8 readback route is documented in Heltec's [Expansion Kit V2.03 schematic](https://resource.heltec.cn/download/WiFi_LoRa_32_Expansion_Kit-V2/schematic/Expansion_board_V2.03.pdf). Tracker V1 wiring is documented in the @@ -75,7 +79,7 @@ the picker can advertise detection. | Check | Result | | --- | --- | | Native detection, rendering, power and headless regressions | PASS, 31 test methods, including 12 new detection methods with sanitizers and negative controls | -| Recipe, release-proof, controls and offline-picker regressions | PASS, 41 test methods | +| Recipe, release-proof, controls and offline-picker regressions | PASS, 42 test methods | | Resolved PlatformIO configuration | PASS, 31 optional-screen environments across the three hardware families; integral-screen recipes excluded | | Picker JavaScript regressions | PASS, 4 suites | | Complete build-profile selection suite | PASS | diff --git a/test/test_optional_display_profiles.py b/test/test_optional_display_profiles.py index f45b7d80b..ad5b2413c 100644 --- a/test/test_optional_display_profiles.py +++ b/test/test_optional_display_profiles.py @@ -26,6 +26,26 @@ def manifest(spec, target): class OptionalDisplayProfilesTest(unittest.TestCase): + def test_all_tracker_full_repeaters_keep_the_measured_safe_neighbor_capacity(self): + script = r''' +set -euo pipefail +source "$1/build_legacy.sh" +ESP32_FULL_BUILD=1 +for target in Heltec_Wireless_Tracker_repeater_observer_mqtt heltec_tracker_v1_1_repeater_observer_mqtt heltec_tracker_v2_repeater_observer_mqtt; do + PLATFORMIO_BUILD_FLAGS="" + PLATFORMIO_BUILD_UNFLAGS="" + BUILD_REDUCTIONS=() + apply_repeater_neighbor_capacity "$target" + [[ "$PLATFORMIO_BUILD_FLAGS" == *"-DMAX_NEIGHBOURS=50"* ]] + [[ " ${BUILD_REDUCTIONS[*]} " == *"mesh.neighbors limited to 50"* ]] +done +ESP32_FULL_BUILD=0 +! requires_dram_limited_neighbors Heltec_Wireless_Tracker_repeater_observer_mqtt +''' + result = subprocess.run(["bash", "-c", script, "optional-screen-capacity", str(ROOT)], + cwd=ROOT, capture_output=True, text=True, check=False) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + def test_optional_hardware_defaults_and_integral_screens_are_separate(self): recipes = Recipes() for spec, target in zip(displays.SPECS, TARGETS):