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

3401 lines
56 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/radio_profiles_validation/">
<link rel="prev" href="../radio_profiles/">
<link rel="next" href="../radio_receive_calibration/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Dual-profile receive validation - 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="#dual-profile-receive-validation" 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">
Dual-profile receive validation
</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">
<a href="../four_fixed_tx_single_pass_validation/" class="md-nav__link">
<span class="md-ellipsis">
Four fixed transmitters / fast single-pass receiver
</span>
</a>
</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 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">
Dual-profile receive validation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Dual-profile receive validation
</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="#method-and-limits" class="md-nav__link">
<span class="md-ellipsis">
Method and limits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#five-symbol-baseline" class="md-nav__link">
<span class="md-ellipsis">
Five-symbol baseline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fractional-symbol-tuning" class="md-nav__link">
<span class="md-ellipsis">
Fractional-symbol tuning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shorter-fast-preambles" class="md-nav__link">
<span class="md-ellipsis">
Shorter fast preambles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#selected-bench-baseline-48-slow-symbols" class="md-nav__link">
<span class="md-ellipsis">
Selected bench baseline: 4.8 slow symbols
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#transmit-policy" class="md-nav__link">
<span class="md-ellipsis">
Transmit policy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ota-discovery-while-retaining-the-main-channel" class="md-nav__link">
<span class="md-ellipsis">
OTA discovery while retaining the main channel
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#software-coverage" class="md-nav__link">
<span class="md-ellipsis">
Software coverage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#hardware-restored-after-validation" class="md-nav__link">
<span class="md-ellipsis">
Hardware restored after validation
</span>
</a>
</li>
</ul>
</nav>
</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="#method-and-limits" class="md-nav__link">
<span class="md-ellipsis">
Method and limits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#five-symbol-baseline" class="md-nav__link">
<span class="md-ellipsis">
Five-symbol baseline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fractional-symbol-tuning" class="md-nav__link">
<span class="md-ellipsis">
Fractional-symbol tuning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shorter-fast-preambles" class="md-nav__link">
<span class="md-ellipsis">
Shorter fast preambles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#selected-bench-baseline-48-slow-symbols" class="md-nav__link">
<span class="md-ellipsis">
Selected bench baseline: 4.8 slow symbols
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#transmit-policy" class="md-nav__link">
<span class="md-ellipsis">
Transmit policy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ota-discovery-while-retaining-the-main-channel" class="md-nav__link">
<span class="md-ellipsis">
OTA discovery while retaining the main channel
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#software-coverage" class="md-nav__link">
<span class="md-ellipsis">
Software coverage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#hardware-restored-after-validation" class="md-nav__link">
<span class="md-ellipsis">
Hardware restored after validation
</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/radio_profiles_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="dual-profile-receive-validation">Dual-profile receive validation</h1>
<p>These measurements exercise the production two-profile implementation on one
SX1262 transceiver, using a Heltec V4 repeater as receiver and a XIAO ESP32-S3
with a Wio LoRa module as transmitter. They follow the dedicated
<a href="../mixed_scan_validation/">mixed-bandwidth scan experiment</a>.</p>
<p>Counts, diagnostic replies and firmware/source hashes are in
<a href="../tools/hil/radio_profiles_results.json">radio_profiles_results.json</a>.</p>
<p>The primary profile is 909.5 MHz, SF7, 62.5 kHz, CR 4/5, preamble 32.
The secondary is 910.5 MHz, 500 kHz, CR 4/5, with SF9, SF8 or SF7.
Scanning uses normal RX, starts with the slower profile, and reserves two slow
visits per slow preamble. Transmitters must use the corresponding preamble too.</p>
<h2 id="method-and-limits">Method and limits</h2>
<p>The transmitter sends MeshCore adverts at varied intervals. The receiver's
per-profile MeshCore RX counters are compared with the transmitter's completed
TX counters before and after each run. Initial OTA announcements can add packets
beyond the manually requested adverts; the table includes those transmissions.
These are aggregate counters, not sequence-matched payload captures.</p>
<p>Runs use one transmitting profile at a time and a strong signal. They do not
measure simultaneous traffic, weak-signal reception, interference or months of
uptime. A single transceiver remains unavailable to the other profile while
receiving or transmitting a packet. A clean finite run is evidence for a timing
choice, not a guarantee that it cannot drop packets.</p>
<h2 id="five-symbol-baseline">Five-symbol baseline</h2>
<p>Slow visits were 10.240 ms and fast visits 6.528 ms, plus actual switching time.
The longest observed profile switch was 4.416 ms; no switch failures were reported.</p>
<table>
<thead>
<tr>
<th>Fast profile</th>
<th style="text-align: right;">Fast preamble</th>
<th style="text-align: right;">Fast RX / TX</th>
<th style="text-align: right;">Slow RX / TX</th>
</tr>
</thead>
<tbody>
<tr>
<td>SF9 / 500</td>
<td style="text-align: right;">48</td>
<td style="text-align: right;">54 / 54</td>
<td style="text-align: right;">30 / 30</td>
</tr>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">72</td>
<td style="text-align: right;">49 / 50</td>
<td style="text-align: right;">—</td>
</tr>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">80</td>
<td style="text-align: right;">49 / 50</td>
<td style="text-align: right;">—</td>
</tr>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">88</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">30 / 30</td>
</tr>
<tr>
<td>SF7 / 500</td>
<td style="text-align: right;">120</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">30 / 30</td>
</tr>
</tbody>
</table>
<p>The SF8 automatic preamble retains a measured floor of 88 symbols. Automatically
selected preambles always round up in steps of eight.</p>
<h2 id="fractional-symbol-tuning">Fractional-symbol tuning</h2>
<p>The initial sweep started at 4.2 slow symbols, with an increase of 0.1 planned
for any slow-channel loss. That first sweep passed all three fast settings.
Each completed run used 50 requested adverts per profile. The SF8 fast run was
interrupted to check SF9 preamble 32, then restarted; only its completed run is
included below.</p>
<table>
<thead>
<tr>
<th style="text-align: right;">Slow symbols</th>
<th>Fast profile</th>
<th style="text-align: right;">Fast preamble</th>
<th style="text-align: right;">Fast RX / TX</th>
<th style="text-align: right;">Slow RX / TX</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;">4.2</td>
<td>SF9 / 500</td>
<td style="text-align: right;">48</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">50 / 50</td>
</tr>
<tr>
<td style="text-align: right;">4.2</td>
<td>SF9 / 500</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">50 / 50</td>
</tr>
<tr>
<td style="text-align: right;">4.2</td>
<td>SF8 / 500</td>
<td style="text-align: right;">88</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">50 / 50</td>
</tr>
<tr>
<td style="text-align: right;">4.2</td>
<td>SF7 / 500</td>
<td style="text-align: right;">120</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">50 / 50</td>
</tr>
</tbody>
</table>
<p>The four completed pairings received 200/200 packets on the slower channel and
200/200 on the faster channel. No switch failures were reported; the longest
measured switch during the 4.2-symbol sweep was 4.407 ms.</p>
<p>The explicit SF9 preamble-32 check uses the same 8.602 ms slow and 8.166 ms fast
windows as the preamble-48 check. Only the fast transmitter's preamble changes.
The automatic SF9 calculation still reserves a 48-symbol preamble for the
configured switching and loop-jitter budgets.</p>
<h2 id="shorter-fast-preambles">Shorter fast preambles</h2>
<p>The follow-up starts with preamble 48 on both fast settings. Each miss advances
the next candidate by eight symbols. The receive-window budgets stay at 4.2
slow symbols and the same remaining fast-channel time.</p>
<table>
<thead>
<tr>
<th>Fast profile</th>
<th style="text-align: right;">Preamble</th>
<th style="text-align: right;">Fast RX / TX</th>
</tr>
</thead>
<tbody>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">48</td>
<td style="text-align: right;">49 / 50</td>
</tr>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">56</td>
<td style="text-align: right;">50 / 50</td>
</tr>
<tr>
<td>SF7 / 500</td>
<td style="text-align: right;">48</td>
<td style="text-align: right;">42 / 50</td>
</tr>
<tr>
<td>SF7 / 500</td>
<td style="text-align: right;">56</td>
<td style="text-align: right;">41 / 50</td>
</tr>
<tr>
<td>SF7 / 500</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">45 / 50</td>
</tr>
<tr>
<td>SF7 / 500</td>
<td style="text-align: right;">72</td>
<td style="text-align: right;">50 / 50</td>
</tr>
</tbody>
</table>
<p>The slower channel passed 50/50 paired with SF8/56, but then received <strong>49/50</strong>
paired with SF7/72. Across the completed 4.2-symbol slow-channel runs, that is
299/300. This later miss invalidated the provisional 4.2-symbol choice and
triggered the next headroom test at 4.3 symbols. Fast-preamble baselines carry
forward as 32 for SF9, 56 for SF8 and 72 for SF7, advancing by eight on a miss.</p>
<p>At 4.3 symbols, the SF9/32 pairing received 100/100 slow packets and 50/50 fast
packets. The next SF8/56 pairing received only 42/50 slow packets, so that
candidate also failed. A control run with scanning disabled received 50/50 on
the slow channel. At 4.4, SF8/56 passed 100/100 slow and 50/50 fast, but the
SF7/72 pairing then received 49/50 slow packets.</p>
<p>At 4.5, the SF7 pairing passed 100/100 slow packets. Fast preamble 72 received
47/50, so the next baseline increased to 80 and passed 50/50. The following
SF8/56 slow run received 49/50, triggering 4.6 symbols. Baselines now carry
forward as SF9/32, SF8/56 and SF7/80.</p>
<p>At 4.6, both SF8/56 and SF7/80 passed 100/100 slow packets and 50/50 fast
packets. The following SF9/32 slow run received 49/50, triggering 4.7 symbols.
There were no switch failures; the longest observed switch was 4.414 ms.</p>
<p>At 4.7, the SF9/32 slow run passed its first 50 packets but received 99/100
over the full run. This triggered 4.8 symbols, with the same fast preamble
baselines. No fast-channel run was started for the 4.7 candidate.</p>
<h2 id="selected-bench-baseline-48-slow-symbols">Selected bench baseline: 4.8 slow symbols</h2>
<p>The 4.8-symbol sweep passed all three slow-channel checks, totaling 300/300.
Slow visits are 9.831 ms and fast visits 6.937 ms, plus actual switching time.
The longest measured switch was 4.491 ms, with no switch failures.</p>
<table>
<thead>
<tr>
<th>Fast profile</th>
<th style="text-align: right;">Fast preamble</th>
<th style="text-align: right;">Fast RX / TX</th>
<th style="text-align: right;">Slow RX / TX</th>
</tr>
</thead>
<tbody>
<tr>
<td>SF9 / 500</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">100 / 100</td>
</tr>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">56</td>
<td style="text-align: right;">49 / 50</td>
<td style="text-align: right;">100 / 100</td>
</tr>
<tr>
<td>SF8 / 500</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">—</td>
</tr>
<tr>
<td>SF7 / 500</td>
<td style="text-align: right;">80</td>
<td style="text-align: right;">50 / 50</td>
<td style="text-align: right;">100 / 100</td>
</tr>
</tbody>
</table>
<p>The SF8 miss advanced its baseline from 56 to 64, exactly eight symbols. Its
slow-channel check preceded that increase; changing the fast preamble leaves
the idle receive-window calculation unchanged. The final fast-channel attempts
received 150/150, using explicit preambles <strong>32 / 64 / 80</strong> for SF9 / SF8 / SF7.
These become the starting values for further tests, increasing by eight on a
fast-channel miss. A slow-channel miss instead advances the listen window by
0.1 symbol.</p>
<p>The production automatic preambles remain <strong>48 / 88 / 120</strong>, retaining the
switching, loop-jitter and acquisition budgets. The shorter explicit values are
bench results under the conditions above, not a guarantee for other boards or
traffic patterns.</p>
<h2 id="transmit-policy">Transmit policy</h2>
<p>Hardware checks send three zero-hop adverts from the V4 with the XIAO listening
on profile 2. OTA startup traffic is allowed to settle before taking the counter
snapshots. The completed cases are:</p>
<table>
<thead>
<tr>
<th>V4 profiles and policy</th>
<th style="text-align: right;">TX on primary / secondary</th>
<th style="text-align: right;">Received by XIAO</th>
</tr>
</thead>
<tbody>
<tr>
<td>Permanent / permanent, <code>auto</code></td>
<td style="text-align: right;">3 / 3</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>Permanent / permanent, <code>off</code></td>
<td style="text-align: right;">3 / 0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td>Permanent / temporary, <code>auto</code></td>
<td style="text-align: right;">3 / 0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td>Permanent / temporary, <code>on</code></td>
<td style="text-align: right;">3 / 3</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>Secondary RX only, <code>on</code></td>
<td style="text-align: right;">3 / 0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td>Temporary / temporary, <code>auto</code></td>
<td style="text-align: right;">3 / 3</td>
<td style="text-align: right;">3</td>
</tr>
</tbody>
</table>
<p>A separate isolation check issued three explicit OTA announce commands with
normal <code>radio</code>, RX-only <code>tempradio2</code> and <code>radio2.cross auto</code>. The completed TX
counters stayed unchanged on both profiles (0 / 0), confirming that locally
generated OTA traffic does not fall back to the normal channel in that mode.</p>
<p>Turning <code>radio2</code> off stopped scanning. A one-minute <code>tempradio2</code> session also
returned to one profile on expiry. Rebooting with a saved SF8 RX profile and an
active temporary SF9 RX/TX profile cleared the temporary session and restored
the saved SF8 profile, including its automatic 88-symbol preamble.</p>
<h2 id="ota-discovery-while-retaining-the-main-channel">OTA discovery while retaining the main channel</h2>
<p>Both boards ran normal SF7 / 62.5 kHz on the primary and temporary SF8 / 500 kHz
RX/TX on the secondary, using <code>radio2.cross auto</code> and automatic preambles 32/88.
The XIAO discovered the V4's firmware catalogue over profile 2, and both boards
recorded received and transmitted OTA packets there. Ten V4 zero-hop adverts
then arrived on the XIAO's primary profile (10/10), with both temporary second
profiles still active. The XIAO reported no switch failures and a longest switch
of 4.547 ms during this check.</p>
<p>This hardware check covers discovery, bidirectional OTA traffic and concurrent
availability of the main channel between packets. It does not perform a complete
firmware transfer or install. Byte-exact transfer validation is provided by the
shared OTA software tests described below.</p>
<h2 id="software-coverage">Software coverage</h2>
<p>Native tests cover identical-packet fanout, separate retry ownership and coding
rates, channel-busy backoff, generation changes, temporary-session isolation,
deferred replies and stale-packet removal. Tests using the production CLI cover
parsing, persistence failures, schedules, expiry and clock rollover. A physical
radio mock exercises the production scan transitions, pending RX interrupts,
RX power-saving restoration and failed profile switches.</p>
<p>The full native suite passed 1,422 cases after the RX-only OTA isolation fix;
all eight KISS modem tests also passed. Subsequent timing changes through 4.8
symbols passed the 63-case retry/profile suite and production CLI and scan
harnesses. Shared OTA transfer tests passed byte-exact checks with
AddressSanitizer and UndefinedBehaviorSanitizer for ESP32 and nRF52 variants.</p>
<p>Build coverage includes the Heltec V4 repeater, room server, sensor and terminal
chat, the Full XIAO Companion, and the nRF52 T1000-E repeater. The nRF52 result
is a build check; these receive measurements use the ESP32/SX1262 boards above.</p>
<h2 id="hardware-restored-after-validation">Hardware restored after validation</h2>
<p>Both boards were returned to their original B soak images after the checks:
<code>v1.17.1-soak-v4-B</code> and <code>v1.17.1-soak-xiao-B</code>. The V4 retained 909.5 MHz,
SF7 / 62.5 kHz, CR 4/5 and TX 0; the XIAO retained 910.525 MHz with the same
modulation and TX 22. Both reconnected to Wi-Fi and their custom MQTT service.
The soak logs resumed under <code>B-post-radio2-soak</code>. These restored images are the
earlier memory-soak firmware; the new dual-profile code is validated by the
finite tests above, not by a months-long uptime run.
The Pi's soak service and Indicator telemetry were also healthy after restoration.</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>