Fit STM32 release images and repair stale CI fixtures

Fix the STM32 flash overflows and fleet fixture compile failure from
https://github.com/mikecarper/MeshCore/actions/runs/40241742182.

Fold already-unsupported RX control paths only for the integrated STM32WL
wrapper. Preserve RXPS-off validation, persistence, pending application and
rollback. External radios retain their supported controls.

Use measured GCC 14 code sharing in the four small STM32 USB Companion
recipes. Keep firmware features, contact/channel capacities, filesystem
boundaries and flash/RAM admission checks unchanged.

Refresh downstream host fixtures for saved radio intent, deferred service
restarts, WebConfig ownership, RX recovery and color tint state. Retain or
strengthen behavior checks rather than skipping failing coverage.

Validation: canonical RAK3x72, Wio Mini, Wio Dev and Tiny Relay USB Companion
packages and Mini Repeater build passed at release-version length. All
post-failure host checks, compact arithmetic/float checks, build-profile and
real PlatformIO recipe/path/RAM-policy checks passed locally.
This commit is contained in:
mikecarper committed 2026-10-25 22:00:24 -07:00
1 parent ad34fd3a0d
commit b0c49a4cc3
24 files changed
+252 -35

No files matched your search

+7
View File
@@ -53,7 +53,13 @@ static void transmitted(SensorMesh& mesh) {
assert(mesh.pool.queued.size() == 1 && mesh.tracker_pending);
Packet* packet = mesh.pool.removeOutboundByIdx(0);
mesh.pool.in_flight = packet;
const auto tx_services = mesh._cli.tx_services, rx_services = mesh._cli.rx_services;
const auto tuning_services = mesh._cli.profiles.tuning_services;
const auto primary_services = mesh.primary_radio_services;
mesh.onSendComplete(packet);
assert(mesh._cli.tx_services == tx_services + 1 && mesh._cli.rx_services == rx_services + 1);
assert(mesh._cli.profiles.tuning_services == tuning_services + 1);
assert(mesh.primary_radio_services == primary_services + 1);
assert(mesh.tracker_sent && mesh.tracker_reply_until == uint32_t(mesh.now_ms + 20000));
// The dispatcher owns and frees the original packet after this callback.
mesh.pool.in_flight = nullptr; mesh.releasePacket(packet);
@@ -640,6 +646,7 @@ static void gpsAndMaintenance() {
{ SensorMesh mesh; configure(mesh); queueCheck(mesh); transmitted(mesh); assert(response(mesh, Safe));
bool* inhibitors[] = {&mesh.board.usb, &mesh.board.ota, &mesh.board.test, &mesh.temporary,
&mesh.pending_ota, &mesh.dual, &mesh.saved_radio_apply_pending, &mesh._cli.active,
&mesh._cli.pending_radio_settings,
&mesh.queue_wake, &mesh.retry_wake, &mesh::test_logging_watchdog};
for (bool* condition : inhibitors) {
*condition = true; assert(mesh.trackerNeedsRadio()); mesh.serviceTracker();