Files
HaloKeymind/four_fixed_tx_single_pass_validation/index.html
T
2026-09-15 05:34:40 +00:00

3262 lines
54 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Documentation for the open source MeshCore firmware">
<link rel="canonical" href="https://mikecarper.github.io/MeshCore/four_fixed_tx_single_pass_validation/">
<link rel="prev" href="../four_fixed_tx_dwell_validation/">
<link rel="next" href="../full_companion_features/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Four fixed transmitters / fast single-pass receiver - MeshCore Docs</title>
<link rel="stylesheet" href="../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#four-fixed-transmitters-fast-single-pass-receiver" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="MeshCore Docs" class="md-header__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../_assets/meshcore.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
MeshCore Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Four fixed transmitters / fast single-pass receiver
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
mikecarper/MeshCore
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="MeshCore Docs" class="md-nav__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../_assets/meshcore.svg" alt="logo">
</a>
MeshCore Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
mikecarper/MeshCore
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../WiFi/" class="md-nav__link">
<span class="md-ellipsis">
WiFi and MQTT by Firmware Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cad_scan_validation/" class="md-nav__link">
<span class="md-ellipsis">
SX1262 channel-scanning hardware results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../carrier_wave/" class="md-nav__link">
<span class="md-ellipsis">
Carrier-wave RF checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../carrier_wave_validation/" class="md-nav__link">
<span class="md-ellipsis">
CW and CW2 validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_build_matrix/" class="md-nav__link">
<span class="md-ellipsis">
CLI Availability by Firmware Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_command_availability/" class="md-nav__link">
<span class="md-ellipsis">
CLI Command Availability Matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_commands/" class="md-nav__link">
<span class="md-ellipsis">
CLI Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_settings_audit/" class="md-nav__link">
<span class="md-ellipsis">
CLI setting dispatch audit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_contact_cache/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion contact caches
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_contact_cache_results/" class="md-nav__link">
<span class="md-ellipsis">
Contact-cache and NimBLE RAM qualification
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_offline_queue/" class="md-nav__link">
<span class="md-ellipsis">
Companion Offline Message Queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Companion Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_radio_full/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_usb_ascii_validation/" class="md-nav__link">
<span class="md-ellipsis">
USB Companion ASCII default validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_usb_client_validation/" class="md-nav__link">
<span class="md-ellipsis">
USB Companion client compatibility
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docs/" class="md-nav__link">
<span class="md-ellipsis">
Local Documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../double_frequency_v4_validation/" class="md-nav__link">
<span class="md-ellipsis">
Double center-frequency write: V4 transmitter / XIAO receiver
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../esp32_memory_budget/" class="md-nav__link">
<span class="md-ellipsis">
Classic ESP32 image memory budget
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../espnow_bridge_setup/" class="md-nav__link">
<span class="md-ellipsis">
ESP-NOW bridge: simple setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
Frequently Asked Questions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../filter_tool/" class="md-nav__link">
<span class="md-ellipsis">
Filter policy playground
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firmware_memory_budget/" class="md-nav__link">
<span class="md-ellipsis">
Firmware memory checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
<span class="md-ellipsis">
Flood Filtering and Moderation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../four_fixed_tx_dwell_validation/" class="md-nav__link">
<span class="md-ellipsis">
Four fixed transmitters: longer dwell repeats
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Four fixed transmitters / fast single-pass receiver
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Four fixed transmitters / fast single-pass receiver
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#result" class="md-nav__link">
<span class="md-ellipsis">
Result
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#switching-timing-and-command-evidence" class="md-nav__link">
<span class="md-ellipsis">
Switching timing and command evidence
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#method-and-fixture" class="md-nav__link">
<span class="md-ellipsis">
Method and fixture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#remaining-losses-and-interpretation" class="md-nav__link">
<span class="md-ellipsis">
Remaining losses and interpretation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#capture-integrity-and-post-run-validation" class="md-nav__link">
<span class="md-ellipsis">
Capture integrity and post-run validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-deployment-and-final-state" class="md-nav__link">
<span class="md-ellipsis">
Build, deployment and final state
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../full_companion_features/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion: turn features on and off
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_usb_switcher/" class="md-nav__link">
<span class="md-ellipsis">
Companion USB CLI and binary switcher
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_usb_logging_validation/" class="md-nav__link">
<span class="md-ellipsis">
Full USB logging repair — 1.17.1.6
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gps_tracking/" class="md-nav__link">
<span class="md-ellipsis">
GPS Tracking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../halo_keymind_settings/" class="md-nav__link">
<span class="md-ellipsis">
Halo and Keymind Branch Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware_validation_bluetooth_stealth_2026-09-07/" class="md-nav__link">
<span class="md-ellipsis">
XIAO Bluetooth stealth hardware validation - 2026-09-07
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware_validation_checklist/" class="md-nav__link">
<span class="md-ellipsis">
Hardware validation checklist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../home_text_spacing/" class="md-nav__link">
<span class="md-ellipsis">
Home-screen text spacing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../host_cli_service/" class="md-nav__link">
<span class="md-ellipsis">
LoRa CLI Host Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../kiss_modem_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore KISS Modem Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lora_ota_automation/" class="md-nav__link">
<span class="md-ellipsis">
Scripted LoRa OTA from start to finish
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mbedtls-tls-footprint/" class="md-nav__link">
<span class="md-ellipsis">
Shrinking the per-connection TLS footprint on non-PSRAM observers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mixed_scan_validation/" class="md-nav__link">
<span class="md-ellipsis">
Mixed-bandwidth two-channel reception test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mixed_sf_bw_validation/" class="md-nav__link">
<span class="md-ellipsis">
Equal-symbol-time mixed SF/BW, four-channel test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nimble_companion_trial/" class="md-nav__link">
<span class="md-ellipsis">
ESP32-S3 NimBLE Full Companion trial
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nimble_companion_trial_results/" class="md-nav__link">
<span class="md-ellipsis">
ESP32-S3 NimBLE trial results, 2026-09-08
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52-usb-ready-fix/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 USB READY hang
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52_companion_storage_recovery/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 Companion automatic ExtraFS recovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52_power_management/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 Power Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../number_allocations/" class="md-nav__link">
<span class="md-ellipsis">
Number Allocations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_easy/" class="md-nav__link">
<span class="md-ellipsis">
Easy firmware updates over LoRa
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
<span class="md-ellipsis">
MeshTower V2 microSD LoRa OTA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 bootloader updates over LoRa
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_qspi/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 repeater LoRa OTA with external QSPI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore OTA - .mota container &amp; LoRa protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_user_guide/" class="md-nav__link">
<span class="md-ellipsis">
Updating your node over the air (OTA) - user guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../packet_format/" class="md-nav__link">
<span class="md-ellipsis">
Packet Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pair_4p6_300us_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF7/62.5 + SF8/500: 4.6 slow chirps, 0.3 ms reserve
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pair_preamble32_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF7/62.5 + SF8/500, fast switching and preamble 32
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../payloads/" class="md-nav__link">
<span class="md-ellipsis">
Payload Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pr7_review_validation/" class="md-nav__link">
<span class="md-ellipsis">
PR #7 review and validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../preamble_detection_investigation/" class="md-nav__link">
<span class="md-ellipsis">
Off-channel preamble investigation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
QR Codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_chirp_math_validation/" class="md-nav__link">
<span class="md-ellipsis">
Shared radio/radio2 chirp timing and preamble warnings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_dwell_policy_validation/" class="md-nav__link">
<span class="md-ellipsis">
Automatic dwell policy: 4.6 chirps on both profiles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_profile_switch_validation/" class="md-nav__link">
<span class="md-ellipsis">
SX1262 profile-switch validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_profiles/" class="md-nav__link">
<span class="md-ellipsis">
Two LoRa profiles on one radio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_profiles_validation/" class="md-nav__link">
<span class="md-ellipsis">
Dual-profile receive validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_receive_calibration/" class="md-nav__link">
<span class="md-ellipsis">
Radio receive calibration and recovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rak3401_mota_chain/" class="md-nav__link">
<span class="md-ellipsis">
RAK3401 1W repeater compact LoRa update chain
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../role_feature_switches/" class="md-nav__link">
<span class="md-ellipsis">
Feature switches by role — 1.17.1.5 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../s3_memory_soak_validation/" class="md-nav__link">
<span class="md-ellipsis">
ESP32-S3 OTA memory experiment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../separated_radio_modulation_cache_validation/" class="md-nav__link">
<span class="md-ellipsis">
Separated radios, normal XIAO RX gain, and unchanged-modulation timing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_10_vs_100hz_full_sample_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125 full samples: 10 Hz versus 100 Hz first-pass detour
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_10hz_cr_detour_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125: tiny first-pass frequency offset and coding-rate detour
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_full_retune_twice_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125: apply the full radio settings twice per hop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_nrf52_double_write_settling_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10 / 125 kHz, XIAO nRF52 TX, double write, 1 ms delay grid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_rollback_failure_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125 rollback and wider-spacing failure isolation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf125_settling_limits_validation/" class="md-nav__link">
<span class="md-ellipsis">
Descending SF10..SF5 / 125 kHz settling limits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf5_250_dwell_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF5 / 250 kHz: four-channel dwell sweep
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf6_125_settling_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF6/125 four-channel post-switch settling sweep
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf6_5p1_trace_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF6 / 125 kHz: four channels at 5.1 chirps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf6_channel_scan_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF6 / 125 kHz channel-count test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf8_5p1_trace_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF8 / 125 kHz: four-channel comparison at 5.1 chirps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../spiffs_regular_file_reads/" class="md-nav__link">
<span class="md-ellipsis">
SPIFFS regular-file reads and login replay state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stats_binary_frames/" class="md-nav__link">
<span class="md-ellipsis">
Stats Binary Frame Structures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../telemetry_decoder/" class="md-nav__link">
<span class="md-ellipsis">
Telemetry decoder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../terminal_chat_cli/" class="md-nav__link">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usb_serial_backpressure/" class="md-nav__link">
<span class="md-ellipsis">
Native USB backpressure and radio liveness
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../v4_pixel5_font_trial/" class="md-nav__link">
<span class="md-ellipsis">
Small-screen message fonts
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_88" >
<label class="md-nav__link" for="__nav_88" id="__nav_88_label" tabindex="0">
<span class="md-ellipsis">
Releases
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_88_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_88">
<span class="md-nav__icon md-icon"></span>
Releases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../releases/1.17.1.5-doc-audit/" class="md-nav__link">
<span class="md-ellipsis">
Markdown audit — 1.17.1.5 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releases/1.17.1.5/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore 1.17.1.5 Dev - USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releases/1.17.1.6/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore 1.17.1.6 Dev - USA Cascade
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#result" class="md-nav__link">
<span class="md-ellipsis">
Result
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#switching-timing-and-command-evidence" class="md-nav__link">
<span class="md-ellipsis">
Switching timing and command evidence
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#method-and-fixture" class="md-nav__link">
<span class="md-ellipsis">
Method and fixture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#remaining-losses-and-interpretation" class="md-nav__link">
<span class="md-ellipsis">
Remaining losses and interpretation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#capture-integrity-and-post-run-validation" class="md-nav__link">
<span class="md-ellipsis">
Capture integrity and post-run validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-deployment-and-final-state" class="md-nav__link">
<span class="md-ellipsis">
Build, deployment and final state
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/mikecarper/MeshCore/edit/keymindCascade/docs/four_fixed_tx_single_pass_validation.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<h1 id="four-fixed-transmitters-fast-single-pass-receiver">Four fixed transmitters / fast single-pass receiver</h1>
<h2 id="result">Result</h2>
<p>MercerMesh Pi bench run, started <strong>2026-09-14 22:18:49 UTC</strong> (15:18:49 PDT):
four physically separate, fixed-channel transmitters and the Heltec V4 receiver.
The full stationary controls passed <strong>400/400</strong>. The subsequent four-channel
scan received <strong>392/400 correctly (98%)</strong>, with <strong>8 timeouts (2%)</strong> and <strong>zero
wrong-channel payloads</strong>. No RF retries were used.</p>
<table>
<thead>
<tr>
<th>TX / assigned channel</th>
<th style="text-align: right;">Frequency (MHz)</th>
<th style="text-align: right;">Fixed-RX control</th>
<th style="text-align: right;">Scanning RX</th>
<th style="text-align: right;">Scan mean RSSI (dBm)</th>
<th style="text-align: right;">Scan mean SNR (dB)</th>
</tr>
</thead>
<tbody>
<tr>
<td>RAK4631 / 0</td>
<td style="text-align: right;">909.5</td>
<td style="text-align: right;">100/100</td>
<td style="text-align: right;">96/100</td>
<td style="text-align: right;">-20.69</td>
<td style="text-align: right;">+8.63</td>
</tr>
<tr>
<td>Heltec T096 / 1</td>
<td style="text-align: right;">910.5</td>
<td style="text-align: right;">100/100</td>
<td style="text-align: right;">98/100</td>
<td style="text-align: right;">-3.84</td>
<td style="text-align: right;">+8.45</td>
</tr>
<tr>
<td>Heltec MeshTower V2 / 2</td>
<td style="text-align: right;">911.5</td>
<td style="text-align: right;">100/100</td>
<td style="text-align: right;">100/100</td>
<td style="text-align: right;">-45.48</td>
<td style="text-align: right;">+8.41</td>
</tr>
<tr>
<td>Seeed T1000-E (LR1110) / 3</td>
<td style="text-align: right;">912.5</td>
<td style="text-align: right;">100/100</td>
<td style="text-align: right;">98/100</td>
<td style="text-align: right;">-18.27</td>
<td style="text-align: right;">+8.51</td>
</tr>
</tbody>
</table>
<p>RSSI/SNR describe received packets only. Each transmitter sent 200 unique
packets across its baseline and scan. All 800 transmit calls returned success,
with zero frequency or modulation commands during those packet calls. There
were zero recovered/replayed USB responses in the packet records.</p>
<h2 id="switching-timing-and-command-evidence">Switching timing and command evidence</h2>
<table>
<thead>
<tr>
<th>Hop population</th>
<th style="text-align: right;">Count</th>
<th style="text-align: right;">Minimum (us)</th>
<th style="text-align: right;">Mean (us)</th>
<th style="text-align: right;">Maximum (us)</th>
</tr>
</thead>
<tbody>
<tr>
<td>All single-pass switches</td>
<td style="text-align: right;">7,206</td>
<td style="text-align: right;">429</td>
<td style="text-align: right;">513.980</td>
<td style="text-align: right;">801</td>
</tr>
<tr>
<td>Cached modulation; no 0x8B</td>
<td style="text-align: right;">6,814</td>
<td style="text-align: right;">429</td>
<td style="text-align: right;">498.602</td>
<td style="text-align: right;">686</td>
</tr>
<tr>
<td>Modulation cache refresh</td>
<td style="text-align: right;">392</td>
<td style="text-align: right;">763</td>
<td style="text-align: right;">781.291</td>
<td style="text-align: right;">801</td>
</tr>
</tbody>
</table>
<p>The receiver recorded exactly <strong>7,206 frequency commands and 7,206 optimized
RX resumes</strong>: one frequency write and one resume per hop. Second-pass count
was zero. Duplicate frequency writes, frequency/CR detours and added settling
were disabled. Warm XOSC, bulk 8 MHz SPI and cached modulation were enabled.</p>
<p>The average switch was <strong>0.514 ms</strong>, but not every switch was below 0.6 ms.
After each received packet, ordinary RX staging invalidates the modulation
cache; the next hop refreshes it. Subsequent unchanged hops omit 0x8B.
The 392 refreshes match the 392 received packets. The source path is
<code>RadioLibWrapper::recvRaw()</code> -&gt; <code>startRecv()</code> / <code>startReceiveMode()</code> -&gt;
<code>PhysicalLayer::startReceive()</code> -&gt; <code>CustomSX1262::stageMode()</code> -&gt;
<code>SX1262ProfileSwitchState::invalidate()</code>. No production cache-invalidation
behavior was changed for this test.</p>
<p>Mean switch-plus-settling-instrumentation time was 515.698 us, maximum 803 us.
The settling measurement averaged 1.718 us of timer/measurement overhead;
the configured settling delay was zero. The idle four-channel sweep averaged
169.135 ms (maximum 170.470 ms), versus 262.144 ms for the 32-symbol preamble.
Packet-held visits include reception/guard time and are not idle sweep timings.
The <code>deferred</code> counter counts guard-loop deferrals, not lost packets.</p>
<h2 id="method-and-fixture">Method and fixture</h2>
<ul>
<li>SF10 / 125 kHz / CR4/5; 32-symbol preamble; synthetic 16-byte CHS1 packets.</li>
<li>Four channels spaced 1 MHz apart; 5.1-symbol RX visits (41,780 us).</li>
<li>Each physical transmitter was configured once and remained on its assigned
frequency throughout both the controls and scanning.</li>
<li>Receiver was reinitialized for each fixed-channel control and once before
the scan. All 100 control packets per transmitter were retained.</li>
<li>Scan used 100 packets per channel, randomized channel order and arrival
pauses (seed 606125). Transmissions were staggered, not concurrent.</li>
<li>Each expected packet had a 10-second scan timeout. Misses did not stop the
run, restart the scanner, force it onto the TX channel or trigger a retry.</li>
<li>SX1262 normal RX gain was verified as register 0x94. The V4's external
KCT8103L front end remains distinct from the chip's boosted-gain setting.</li>
<li>Requested TX power was -9 dBm at each radio chip. The Heltec TX boards have
external PA paths, held in TX mode by this HIL firmware; these are <strong>not
calibrated equal antenna-port powers</strong>.</li>
<li>High-rate channel trace was disabled; command counters and timing remained
enabled. Gateway services remained running, so unrelated RF was not excluded.</li>
</ul>
<table>
<thead>
<tr>
<th>Role</th>
<th>Hardware serial / MAC</th>
<th>Pi USB topology</th>
</tr>
</thead>
<tbody>
<tr>
<td>TX0 RAK4631</td>
<td>9AB3B64C641BA927</td>
<td>1-1.3.1</td>
</tr>
<tr>
<td>TX1 Heltec T096</td>
<td>651F8E496197F882</td>
<td>1-1.2.3</td>
</tr>
<tr>
<td>TX2 Heltec MeshTower V2</td>
<td>9352162A72082314</td>
<td>1-1.2.2</td>
</tr>
<tr>
<td>TX3 Seeed T1000-E LR1110</td>
<td>34A9141999729D5D</td>
<td>1-1.2.1</td>
</tr>
<tr>
<td>RX Heltec V4</td>
<td>44:1B:F6:69:CF:98</td>
<td>1-1.3.3</td>
</tr>
</tbody>
</table>
<p>Board selection checked serial plus topology, not transient tty names or CDC
interface count. The RAK3401 gateway, serial 0B81C9C68D8D01B4, was excluded.
The earlier local XIAO radios were not modified during this run.</p>
<h2 id="remaining-losses-and-interpretation">Remaining losses and interpretation</h2>
<p>Timeouts occurred at overall scan attempts 10, 14, 55, 65, 145, 299, 304 and
384. Thus they were not confined to startup. Each timeout reported RX mode 1
and zero device errors; TX calls returned success and still reported no
configuration writes. Final RX failure, RX-mode, cache and receive-error
counters were all zero.</p>
<p>The wrong-channel behavior did <strong>not</strong> reproduce in this configuration.
The remaining misses do not require a transmitter that retunes between packets.
However, this is not a controlled A/B against the earlier XIAO setup: the RX
board, TX boards/chips, antennas and geometry changed. These results do not
prove that the earlier transmitter was faulty or establish the cause of the
eight remaining losses.</p>
<p>Several received signals were very strong, particularly the T096 at about
-4 dBm. The weakest link, MeshTower V2 at about -45 dBm, passed 100/100 while
scanning. That makes a controlled spacing/attenuation comparison worth
considering, but this sample does not prove receiver overload. The observed
98% is a finite bench result, not a reliability guarantee or sensitivity test.</p>
<h2 id="capture-integrity-and-post-run-validation">Capture integrity and post-run validation</h2>
<p>All 400 scan probes finished and final radio telemetry was returned. The
original host checker then rejected that telemetry because it incorrectly
required zero modulation writes over the entire run, including post-packet
RX staging. Its raw capture therefore remains <code>complete: false</code>, with final
status preserved verbatim inside its error string. The normal <code>sender_final</code>
collector step did not run. <strong>The raw failure record was not rewritten.</strong></p>
<p>Source review established the cache-refresh behavior above. The host checker
now validates modulation writes against the measured refresh-hop count, checks
that cached plus refresh hops equal total hops, and still requires single
frequency writes, single fast resumes, zero added delay and the other policies.
It also saves final telemetry before checking it, so future failures retain
that structured record.</p>
<p>Separate offline validation parsed the saved telemetry, checked the full
400-probe scan and all four 100-probe controls, verified 800 unique sequences,
and checked every transmitter's packet counter from 1 through 200 and its
zero-retune acknowledgments. A capture regression additionally checks that
each TX/RX response ID matches its probe and every accepted payload/channel
matches the assigned channel. No radio was rerun to replace the failed host
assertion. The derived summary explicitly reports
<code>original_collector_complete: false</code> and <code>post_run_validation_passed: true</code>.</p>
<p>Evidence files:</p>
<ul>
<li><a href="../tools/hil/profile_four_tx_sf10_single_results.json">Immutable raw capture</a></li>
<li><a href="../tools/hil/profile_four_tx_sf10_single_validated.json">Independently validated summary</a></li>
<li><a href="../tools/hil/profile_four_tx_sf10_single_deployment.json">Deployment record</a></li>
<li><a href="../tools/hil/profile_four_tx_sf10_single_manifest.json">Build manifest</a></li>
<li><a href="../tools/hil/profile_four_tx_sf10_single_cleanup.json">Verified idle/service state</a></li>
</ul>
<p>Raw capture SHA-256:
<code>42de3ac0c335b2c59f35c1cab217a01ef242c9f2e7b0010c8000a908a59232e6</code>.
Derived summary SHA-256:
<code>316bd551eb7306dfc576f4b88ad23e82cb1d701481d1e022067c961806d31bfe</code>.</p>
<h2 id="build-deployment-and-final-state">Build, deployment and final state</h2>
<p>Built from the dirty <code>keymindCascade</code> worktree based on
<code>2b5a6f209835f0f67ed73fee78d36447a4566ce6</code>. This is not a claim that HEAD
alone reproduces the images. The manifest records image and HIL-source hashes.
All five PlatformIO builds succeeded and ran sequentially.</p>
<p>After the host-checker correction, 25 focused unit/regression tests passed,
including the preserved-capture check. <code>git diff --check</code> passed; its only
warning concerned a pre-existing CRLF conversion in <code>MyMesh.cpp</code>.</p>
<p>RadioLib was pinned to <code>187ef24791c3d844939b2be13a68bd890bd04e4c</code> (7.7.1).
The nRF framework was <code>d5413016</code> (1.10701.0); the ESP build used platform
6.11.0 / Arduino 2.0.17. The first three nRF targets retained S140 6.1.1
(FWID 0xB6, app base 0x26000); T1000-E retained S140 7.3.0 (FWID 0x123,
app base 0x27000). nRF DFU packages were application-only, with their matching
SoftDevice requirements intact. No nRF bootloader/SoftDevice replacement or
cross-board override was used. Runtime FWID and application base were verified.</p>
<p>V4 received the normal ESP bootloader, partition table, boot_app0 and HIL app
at 0x0, 0x8000, 0xE000 and 0x10000, respectively, with esptool hash checks.
No whole-flash bulk erase was issued. No backup was requested for these
authorized bench deployments.</p>
<p>The initial bundle's collector/deployer hashes are not the final scripts used:
the actual run used <code>profile_four_tx_v2.py</code> with SHA-256
<code>b762e412636076902174c76b71961cc8ab3059c2b6de3dd3b4123bafcb06545c</code>
(startup-greeting fix, original strict final assertion), and deployment used
<code>profile_four_tx_deploy_v3.py</code> with SHA-256
<code>8a660788e0215e6ac1aece0a5d033521f9f376c9e51c00e760e918ebfd72cca1</code>.
The current local collector includes the later validation correction; firmware
images were not changed after the run. Remote evidence remains under
<code>/home/mikec/hwtest/runs/four-tx-sf10-20260914</code>.</p>
<p>All five radios were subsequently rebooted and independently verified idle.
All TXs reported unprepared, packet count zero, no failure and autonomous TX
disabled; V4 reported scanning inactive and zero hops after reboot. HIL
firmware remains installed. ModemManager was restored active, gateway services
were left active, and the V4 memory-soak service remains inactive because its
firmware is now the bench receiver. No Pi USB hub power cycle was performed.</p>
<p>No commit, push or pull was performed for this test. Unrelated worktree changes
were preserved.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.action.edit", "content.code.copy", "search.highlight", "search.suggest"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
</body>
</html>