Skip to content

PR #7 review and validation

Validated on 2026-09-10 against integration commit fa010196b130dee9a8a6fc6325d794e2f4fb9ede, which combines base 01cc7b8a with PR head c002966c and the review fixes. This includes the stacked ESP32 memory changes already present in PR #7.

Review fixes

  • Use the published ExpressLRS Linkflow calibration, expose 17–30 dBm, and retain the fixed +2 dBm radio drive and correct RF output after radio recovery. Propagate startup and radio-setting failures.
  • Keep Linkflow LoRa OTA enabled, as intended by the added repeater target.
  • Preserve stored ACLs and flood filters when allocation fails. Release owned buffers and prevent accidental shallow copies of their owners.
  • Release heap OTA workspaces after self-serving windows; retain them for active transfers, manual staging, folder operations, and pending application. Service cleanup on Companions and reset staged-resume flags when a context disappears.
  • Count dynamically allocated clients, filters, and OTA workspaces in the RAM budget. Respect explicit OTA storage ownership in PlatformIO flags.

Automated validation

  • pio test -e native -e native_kiss_modem: 1,393/1,393 cases passed.
  • Real C++ radio-power, heap-context, ACL persistence/CLI, and shared OTA queue tests passed. The applicable radio-power, heap-context, and shared-queue tests also passed on Linux with AddressSanitizer and UndefinedBehaviorSanitizer.
  • Display/inbox, radio receive, static DRAM, and runtime RAM regression tests passed. ACL allocation-failure coverage verifies that stored clients survive.
  • Sequential firmware builds and their memory gates passed for: GEPRC_Linkflow_900_repeater, Heltec_v2_companion_radio_ble, Tbeam_SX1262_repeater_observer_mqtt, heltec_v4_r8_repeater_observer_mqtt, RAK_4631_repeater, and SenseCapIndicator-LoRa_companion_radio_full.

Indicator hardware validation

The original SenseCAP Indicator LoRa with 8 MiB flash and 8 MiB octal PSRAM was reached through the MercerWoodMesh Pi over Wi-Fi. Its MAC, public identity, board reply, and existing partition layout were checked before updating. USB interfaces were absent, so this run does not qualify USB behavior.

The Full profile was applied to SenseCapIndicator-LoRa_comp_radio_usb_wifi. The exact application is 2,149,208 bytes:

  • Application SHA-256: 7a2b11e731f946af79d1104818c7993d3897e6d8ec1f0121d27284c0f0c8c665
  • ELF SHA-256, also verified in the application descriptor: 24e60c7785a7aefe3fb0536b0b595bf19e1264e4d5f100d201290dc95eb1761a

This direct profile build uses the repository's default v1.17.1 version text and 14 Aug 2026 build-date text; the hashes above identify the tested image.

The Wi-Fi updater returned HTTP 200 and booted the application in app1 at 0x400000. The previous application remains in app0 at 0x10000; the partition table, NVS, and SPIFFS were not rewritten. Public identity, radio parameters, and USB logging preference matched their pre-update values.

The existing Companion stress harness, using a TCP socket adapter, completed 100 persistent cycles and 100 reconnects in 109.9 seconds: 501 requests and 501 validated responses, with no discarded bytes, malformed frames, or device error flags. Device info, time, storage, and core statistics were exercised. The text terminal exposed all four display-power controls and display.inbox. The OTA folder service issued a valid COUNT request, received an empty-folder reply, and returned to its disconnected state after the client closed.

After these checks, four memory snapshots showed 69,548–69,996 bytes of free internal heap and a 61,428-byte largest block. PSRAM availability stayed at 6,408,731 bytes. Final uptime was 262 seconds, with zero error flags and an empty outbound queue. This is a short regression check, not a long-term soak. Raw baseline, upload, stress, and final-state records are retained on the Pi under /home/mikec/hwtest/runs/pr7-review/.

No Linkflow module or RF power meter was available in this run. Linkflow power calibration is supported by the pinned upstream table and executable driver tests, not a physical RF output measurement. The Indicator's ESP32-S3 does not exercise the classic ESP32 heap-OTA default; host tests and classic ESP32 builds cover that path. Physical display readability was not inspected.