mirror of
https://github.com/agessaman/MeshCore.git
synced 2026-08-26 17:49:54 +00:00
Neighbors publication was gated on BOARD_HAS_PSRAM. Removing that gate alone was not enough: the feature built but was inert without PSRAM, because three allocation sites asked for MALLOC_CAP_SPIRAM (which returns null with no PSRAM), the bridge's persistent buffer was allocated inside a BOARD_HAS_PSRAM block, and neighborDiscoverReady() rejected every pass at runtime on psramFound(). The entry table also did not fit: finishNeighborDiscover put pubkey_hex[50][65] plus entries[50] on the stack, a 4752-byte frame against the mesh loop task's 8 KB. - Gate on MAX_NEIGHBOURS plus PSRAM or an explicit per-variant MQTT_NEIGHBORS_WITHOUT_PSRAM opt-in. - Move the entry table and its hex strings into one heap block sized to the pass; the frame drops from 4752 to 304 bytes. - Prefer PSRAM and fall back to internal DRAM in the mesh-side allocations and the ArduinoJson pool; hoist the bridge's persistent buffer out of the BOARD_HAS_PSRAM block (psram_malloc already falls back). - Keep the runtime psramFound() check only where the buffers are sized for PSRAM, so a board whose PSRAM failed to init still refuses. - Size for internal DRAM without PSRAM: 4 KB text buffer and 20 entries per publish, keeping the pool to a single block and the peak near 13 KB rather than ~35 KB. Oversized tables truncate and report total_neighbors as before. Enabled on the ESP32-S3 observer envs (Heltec V3/WSL3, RAK3112, Heltec Tracker v1.1/v2). Left off for the classic ESP32 T-LoRa V2.1-1.6, which is already limited to one active TLS slot. Costs ~7.4 KB static DRAM on repeaters and ~9.6 KB on room servers. The prefs layout is unchanged, so this is neutral for existing devices.