MeshCore 1.17.1.5 Dev - USA Cascade
Use feature switches by role for exact on/off commands for Companion, Repeater, Room Server, and Sensor, including MQTT, logging, power saving, GPS, and board exceptions. Open the USB web console for the default ASCII terminal on Full Companion and infrastructure images.
The firmware identifier and main release tag follow
v1.17.1.5-halo-keymind-cascade-dev-<commit>, matching the 1.17.1.4 naming
convention. Supplemental pages retain the repeater-room-, utility-,
logging-, lora-ota-, and full-profiles- prefixes where those outputs
exist. The Companion page is marked Latest; the supplemental pages remain
development prereleases.
This release uses the USA/Canada radio preset and Cascade runtime defaults. The release build records the resolved frequency, bandwidth, spreading factor, and coding rate. The offline USA Cascadia fallback is 910.525 MHz, BW62.5, SF7, CR5. Saved node settings survive ordinary firmware updates.
Memory corrections in aa20e927
All 583 published profiles (the 540-profile matrix plus 43 supplemental Full
repeaters) were checked against the new
runtime RAM policy. All 11 failing profiles
have replacements, and the same queue sharing has been applied to the other
41 nRF52 Full profiles: 52 corrected profiles in total, initially built from
aa20e927.
The existing release tags stay in place; corrected filenames end in aa20e927,
except Wireless Paper Full's capacity-restoring follow-up, 1e4d1e16.
Companion remains Latest. Both Mesh America catalogs and the firmware picker
point to the replacement files.
All 43 nRF52 Full Companions keep 256 offline frames normally and lend 128
slots to mOTA while needed. Wireless Paper Full now also shares its queue and
keeps 350 contacts and 40 channels. The other six corrected ESP32 Full
profiles below use 150 contacts, preserving their 256-frame queue and Full transports.
Export contacts before upgrading if you have more than 150; entries beyond
that limit may be unavailable and a later save may omit them. This warning
applies to those six profiles and the superseded aa20e927 Wireless Paper image.
Wireless Paper Full's
1e4d1e16 update
has 256 message slots normally and 128 while an mOTA session borrows its
workspace. Idle WiFi listening leaves all 256 slots available. If more than
128 unread messages are queued, sync them with an app before starting mOTA.
Source stop/disconnect restores all 256 slots and frees ESP32 scratch buffers.
USB, Bluetooth, WiFi, the display and the partition layout are retained.
The application is 1,869,976 bytes; use its app-only .bin for a compatible
WiFi update, or its merged image for USB installation.
The T096 and T1 LoRa OTA repeater corrections allocate the diagnostic manual
staging buffer only when requested, recovering about 4 KiB at startup.
Ordinary mOTA uses its existing staging store. ota dev clear releases a manual
stage; allocation failure reports an error before writing. These same-version
repairs require an explicit exact-target manual LoRa installation or USB;
forward-only trusted autoinstall does not select an equal-version repair.
Available RAM below means capacity before startup allocations, not free
heap after boot. The Wireless Paper row includes its latest 1e4d1e16 update:
| Failing original profile | Original bytes | Replacement bytes | Required bytes |
|---|---|---|---|
Generic_ESPNOW_companion_radio_full |
101,920 | 139,456 | 136,192 |
Heltec_Wireless_Paper_companion_radio_full |
150,144 | 161,336 | 152,576 |
Heltec_Wireless_Tracker_companion_radio_full |
148,496 | 186,032 | 169,986 |
Heltec_ct62_companion_radio_full |
99,104 | 136,640 | 136,192 |
Heltec_t096_companion_radio_full_femon |
54,724 | 74,060 | 73,728 |
Heltec_t1_companion_radio_full |
55,044 | 74,380 | 73,728 |
Heltec_v3_companion_radio_full |
143,840 | 181,376 | 173,056 |
Xiao_C3_companion_radio_full |
98,880 | 136,416 | 136,192 |
heltec_tracker_v2_companion_radio_full_femon |
133,136 | 170,672 | 169,986 |
Heltec_t096_repeater_lora_ota_no_external_sensors |
61,588 | 65,676 | 65,538 |
Heltec_t1_repeater_lora_ota_no_external_sensors |
61,964 | 66,052 | 65,538 |
Each replacement has a matching .memory.json with its ELF hash, RAM budget
and firmware-file hashes. The
complete audit
distinguishes original binary/log calculations from new ELF checks.
All 52 exact firmware builds, their native file pairs, and 150 native mOTA
tests passed, alongside memory, allocation-failure, shared-queue and picker
regressions. Wireless Paper's follow-up also passed complete TCP mOTA transfers
with address/leak sanitizers, repeated disconnects, queue-full refusal, idle
listening and USB/TCP ownership changes. Physical boot/load/soak validation
remains pending.
G3 USB disappearance with power saving enabled
The published 26303793 firmware has an ESP32 native-USB sleep bug that
matches a Station G3 report: USB disappears from the connected Pi after a
few minutes, the display button stops responding, but the repeater still
answers over LoRa. Hardware confirmation of this report is pending.
Cascade enables device power saving by default on fresh settings. After two minutes, the repeater can enter light sleep when no serial terminal is open, even though the Pi has enumerated the USB device. Light sleep stops USB service; the radio GPIO can still wake the CPU, while the G3 display button is only polled. Closing a terminal must not be treated as unplugging the USB host. Espressif documents the underlying native USB sleep limitation.
To enable USB logging on an ESP32 1.17.1.5 image with logging support, disable power saving first. Use the role's text terminal, or the repeater's remote admin CLI if USB has already disappeared:
set powersaving off
set usb.logging on
get powersaving
get usb.logging
The read-back commands should report power saving off and USB logging on.
For an image without USB logging, use just set powersaving off and get powersaving
to apply/check the sleep workaround. Disabling power saving saves the setting and takes
effect immediately; it does not erase the node or change LoRa RX power
saving (radio.rxps). If USB does not reappear after disabling sleep
remotely, power-cycle once and check that the port and display button remain
usable beyond the two-minute mark. Ordinary reflashing can retain the
saved power-saving setting, so check it during comparisons with another
firmware build too.
On unified Full infrastructure, also run set powersaving off before enabling
USB through set logging.output usb or set logging.output both. These are
separate commands. Turning logging off does not automatically restore the
saved power-saving setting. nRF52 logging does not need this ESP32 workaround.
WiFi/MQTT-only logging does not need set powersaving off while the
Repeater/Room Server MQTT bridge is running. The original 26303793 code
already prevents device sleep in that state. Select set logging.output wifi
where supported and check get mqtt.running; get mqtt.enabled alone
only checks the saved preference. MQTT-capable Full Companion now uses the
same mqtt.enabled and logging.output commands as infrastructure. Disabling
MQTT preserves broker settings; the MQTT tab exposes the same master switch.
The source correction keeps native USB serviced while a host is enumerated, including when its terminal is closed. Enabled live USB logging also blocks ESP32 light sleep, even without a host. FreeRTOS can still idle/yield; this does not disable the saved power-saving setting or Companion CPU scaling. With logging off, USB power from a charger still permits sleep.
The corrected G3 uses its user button as a light-sleep wake source alongside LoRa. Button activity keeps the CPU and display awake for at least two minutes; holding or pressing the button again extends the interval. The usual display timeout can keep the screen on longer. An intentional long-press power-off retains its existing action. After the wake interval, sleep is allowed when power saving is enabled, logging is off, no native USB host is attached, and no running bridge or pending work needs service.
Host simulations cover both native USB modes, terminal close/reconnect,
logging toggles, OTA inhibition, simultaneous button/LoRa wake configuration,
and the two-minute interval across timer rollover. The Station G3 repeater
download remains the original 26303793 build; continue to use the logging
workaround above on that image.
T096 Full Companion Bluetooth and menu freeze report
A report against Heltec_t096_companion_radio_full_femon describes no usable
Bluetooth despite a displayed PIN, followed by a freeze while stepping through
the device menu. Reflashing both with and without a full wipe gave the same
result. The exact freeze and Bluetooth behavior still need confirmation on a
physical T096 with the source correction below.
The published 26303793 Full image leaves only 54,724 bytes (53.4 KiB)
between the linked heap boundaries. Its static RAM check did not account for
the allocations made at startup: the 160x80 color framebuffer alone needs
25,602 bytes, followed by task stacks, the packet pool, filesystem buffers,
and message previews. This leaves inadequate runtime headroom. The pinned
Bluefruit library also ignores failure to create its BLE/SOC worker tasks,
and the sensor menu could write through a failed CayenneLPP allocation. Those
are code paths consistent with this report; a PIN is not proof of a working
Bluetooth radio.
The correction applies to every nRF52 Full Companion, keeping its offline queue at 256 frames during normal use. mOTA borrows the upper 128 slots for its roughly 19 KiB session state only when needed, leaving 128 message slots during mOTA use. Starting a source or a TempRadio discovery session acquires this workspace. Stopping or disconnecting the USB/Bluetooth source restores all 256 slots, even if the temporary radio window is still open. A discovery-only session returns the slots when its TempRadio window ends. No heap resizing is involved.
Unread messages keep their order across both transitions. If more than 128 frames are pending, mOTA refuses to start and asks you to sync unread messages with a Companion app first; it does not discard them to make room. OTA configuration and signer keys survive reuse of the workspace. While mOTA owns it, the normal queue overflow policy applies to the remaining 128 slots.
The T096 profile requires at least 72 KiB of heap space at link time. It retains 350 contacts, 40 channels, the color display, sensors, USB, Bluetooth, Bluetooth DFU, and USB/Bluetooth mOTA sending. This reserve is space for runtime allocations, not a measurement of free heap after boot. Bluetooth startup now checks both worker tasks and all registered services; a failed partial initialization does not repeat every five seconds. The sensor page reports low memory if its buffer could not be allocated.
Regression tests transfer complete mOTA containers through the actual shared
context, check queue wraparound and message order, and cover source stop,
disconnect, conflicting USB/Bluetooth ownership and repeated sessions. They
also inject worker-task and GATT-service failures, verify that retries do not
initialize the stack again, open the sensor path with a failed allocation,
and use the real linker assertion to reject the old heap budget.
The original T096 Full download has been replaced by the corrected aa20e927
image on the same release page. Another wipe is not a fix for the old compiled
memory budget.
For the corrected T096 build, use its matching application UF2 through the existing USB bootloader. Preserve the bootloader and node data. Check Bluetooth discovery, pairing and message exchange on battery power and with USB attached; then step through every menu page, return from screen-off, and check USB and Bluetooth mOTA sending. Hardware validation is pending.
Firmware roles and update support
Use the exact board's Full Companion image when available. Every Full Companion must pass linked-firmware checks for MOTA sending, its text terminal, and the platform's source transports. ESP32 supplies USB and WiFi sources; nRF52 supplies USB and encrypted Bluetooth sources. Full Companions remain USB-updateable and do not require LoRa self-installation. Optional ESP32 WiFi self-update uses port 8080 where the existing partition layout has two application slots; nRF52 retains Bluetooth DFU with a compatible bootloader.
Read Full Companion feature switches for on/off commands, USB logging, power saving, WiFi/Bluetooth selection, GPS, MQTT, MOTA sending, and update directions.
Infrastructure artifacts must have a verified wireless self-update path.
Option 3 reports and omits infrastructure on platforms without a wireless
updater. The report is ota-excluded-targets.txt. Source/seeder capability
alone does not count as self-update support. ESP32 qualification checks both
application slots and OTA metadata; nRF52 Bluetooth qualification checks the
linked DFU service and its application ZIP. LoRa installation on nRF52 still
requires the exact matching OTAFIX bootloader and storage arrangement.
Classic ESP32 capacity limits are recorded in each artifact's capability manifest. Generic E22, Heltec V2, Meshadventurer, and T-Beam OTA repeaters, plus the TLora MQTT repeater, use 50 neighbors where needed to preserve the required internal RAM reserve. T-Beam MQTT repeater profiles retain the full rule engine with 31 flood rules; constrained classic ESP32 ESP-NOW bridges with logging use 47. Meshadventurer Full uses 100 contacts, 30 group channels, and a 16-frame offline queue while retaining its MOTA and transport features.
Since 1.17.1.4, this branch also includes USB session and contact-persistence fixes, automatic nRF52 ExtraFS recovery, improved Indicator setup/display handling, compressed MOTA transport, and measured ESP32 memory limits. Qualified internal-flash nRF52840 receivers now reserve 64 KiB of retained RAM to extend application MOTA staging beyond the available flash prefix. This handoff requires the exact board's OTAFIX 2.4.6 bootloader. Install that bootloader before relying on LoRa updates from these new hybrid receiver images: they reject application containers larger than one flash page when the installed bootloader lacks the retained-RAM capability. QSPI/microSD roles and Full Companions retain their existing storage layouts. An interrupted hybrid download must be fetched again after an application restart or power cycle. See the protocol for the exact admission and reset checks.
Build using option 3
The equivalent reproducible command is:
OUTPUT_DIR=.releases/1.17.1.5-halo-keymind-cascade-dev \
bash build.sh build-firmwares-logging-matrix \
--firmware-version v1.17.1.5-halo-keymind-cascade-dev \
--radio-preset usa-cascadia --profile cascade \
--require-ota --skip-kiss --resume --background
Or run bash build.sh, select option 3, set version
v1.17.1.5-halo-keymind-cascade-dev, and retain USA Cascadia/Cascade.
Option 3 enables the infrastructure OTA requirement by
default. It merges supported runtime USB logging into canonical artifacts and
builds the expanded ESP32 profiles. It runs one PlatformIO process at a time.
The background launcher prints its persistent log and status paths. Each
target also gets a log in OUTPUT_DIR/build-logs/. Resume accepts only
artifacts with the current capability schema and a successful qualification;
infrastructure also needs a verified update method. Any failed target leaves
the matrix unsuccessful and must be resolved before publication.
--allow-no-ota is an explicit development override for cable-only
infrastructure. Those outputs do not belong in this OTA-required release.
Use a separate output directory when changing the radio or settings profile.
Use a fresh release output directory after changing the source revision or
firmware version so packaging cannot mix old and new binaries.
Local release staging
After the matrix completes successfully, scripts/package_cascade_release.py
groups the qualified images using the previous GitHub release naming. Each
group includes the firmware files, capability manifests, TSV/JSON inventory,
checksums, build notes, and Full Companion directions. The staging directory's
root FIRMWARE-PICKER-1.17.1.5.html opens the local downloads; the copies inside
each release group use the planned GitHub download URLs. Staging does not
push commits, create remote tags, or publish a GitHub release.
Published release set and small-slot Heltec V4 updates
The capability JSON and target inventories now report both Bluetooth DFU and
LoRa mOTA for all 60 nRF52 receiver profiles. The original report omitted the
nRF52 LoRa method. Each affected manifest includes ota_update_requirements.lora
with its storage type, accepted package types, exact-base requirement for deltas,
and the matching OTAFIX bootloader link. Internal-flash receivers accept in-place
deltas; supported QSPI/SD receivers also accept full application packages. The
20 retained-RAM receivers require OTAFIX 2.4.6's matching handoff support.
These reports verify the released application bytes and storage layout; they
do not certify the bootloader installed on a physical device. Firmware binaries
and tags are unchanged. Full Companion mOTA sending remains separate from
self-update capability.
Published firmware tags remain at source commit 26303793. Documentation can
advance independently. The original matrix qualified 540 profiles (1,080
firmware files) from 551 attempts; 11 oversized portable attempts have expanded
Full replacements. The variant map maps all 1,361
previous-release choices to 1,325 covered choices and 36 excluded entries.
Multiple old choices map to the same current artifact.
For Heltec V4 with an existing compatible 1.25 MiB OTA application slot, the
standard heltec_v4_repeater application is 1,179,200 bytes and the lean
heltec_v4_repeater_lora_ota_no_external_sensors application is 1,232,024 bytes.
Both fit that slot. Start the WiFi uploader with start ota ap, join
MeshCore-OTA, and open http://192.168.4.1/update. Upload the application
.bin; use stop ota to close an unused uploader. Their merged USB installers
write two 6.25 MiB application slots. Expanded Full V4 applications require
the larger layout and do not fit a 1.25 MiB slot.