mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-09-15 15:46:40 +00:00
Settings > Radio gains a repeater toggle, 16 community-suggested radio presets plus manual Freq/SF/BW/CR tuning (digit-by-digit Freq editor), 4 persisted user preset slots, and the packet pool bumped 16->32 so queued retransmits stop starving incoming-packet allocation while relaying. Four opt-in politeness knobs (skip-advert, max-hops, yield, min-SNR), all flood-only and off by default, plus overhear suppression that cancels a queued retransmit if a peer relays the same packet first. Adaptive Power Control is suppressed while relaying (pins TX power to the ceiling) and duty-cycle RX is forced off, since a repeater needs to hear and relay at consistent power. A dedicated Tools > Repeater screen consolidates the toggle, the politeness knobs, and live forwarding stats, plus an optional "Custom" radio profile — a dedicated frequency/SF/BW/CR for relaying, separate from the companion's own network, band-matched to the companion frequency by default and used everywhere a radio change can happen (boot, on-device toggle, app-driven CMD_SET_RADIO_PARAMS, Settings radio edits) so the device never silently falls back to the wrong params mid-relay. Diagnostics gains the actually-forwarded packet count, real heap-free via mallinfo(), a reset-counters popup, and hardened loop-detect bounds. Also: a frequency-floor fix and a float-equality preset-match fix in the repeater profile logic, deduped BW-table/valCol/profile- seeding helpers shared between Settings and the Repeater screen, and a build.sh fix tolerating control characters in `pio project config`'s JSON dump. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
35 lines
1.1 KiB
C++
35 lines
1.1 KiB
C++
#include "DeviceDiag.h"
|
|
|
|
#if defined(NRF52_PLATFORM)
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
#include <malloc.h>
|
|
|
|
// Heap region size from the linker symbols the core's new.cpp uses for sbrk
|
|
// (framework-arduinoadafruitnrf52/cores/nRF5/new.cpp). "Used" comes from
|
|
// newlib's mallinfo().uordblks (bytes actually outstanding) rather than
|
|
// sbrk(0) - __HeapBase: sbrk only ever grows, so a high-water mark there
|
|
// counts freed-and-recycled blocks as permanently "used" and free heap looks
|
|
// far lower than it really is.
|
|
extern unsigned char __HeapBase[];
|
|
extern unsigned char __HeapLimit[];
|
|
|
|
void DeviceDiag::getHeapStats(uint32_t& free_bytes, uint32_t& total_bytes) {
|
|
total_bytes = (uint32_t)(__HeapLimit - __HeapBase);
|
|
uint32_t used = (uint32_t)mallinfo().uordblks;
|
|
free_bytes = (used < total_bytes) ? (total_bytes - used) : 0;
|
|
}
|
|
|
|
uint32_t DeviceDiag::getStackFreeBytes() {
|
|
return (uint32_t)uxTaskGetStackHighWaterMark(NULL) * sizeof(StackType_t);
|
|
}
|
|
|
|
#else
|
|
|
|
void DeviceDiag::getHeapStats(uint32_t& free_bytes, uint32_t& total_bytes) {
|
|
free_bytes = 0; total_bytes = 0;
|
|
}
|
|
uint32_t DeviceDiag::getStackFreeBytes() { return 0; }
|
|
|
|
#endif
|