Files
HaloKeymind/optional_screens/index.html
T
2026-10-22 19:30:39 +00:00

2636 lines
49 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/optional_screens/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Optional screens - 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/notification_builder.css?v=20261006-channel9">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css?v=20261013-pick-first-1">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/management_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
<link rel="stylesheet" href="../_stylesheets/preset_test.css?v=20260923-2">
<link rel="stylesheet" href="../_stylesheets/esp32_partition_catalog.css?v=20261001-1">
<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="#optional-screens" 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">
Optional screens
</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">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Firmware and tools
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Firmware and tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<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="../notifications/" class="md-nav__link">
<span class="md-ellipsis">
Notifications
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../preset_test/" class="md-nav__link">
<span class="md-ellipsis">
Preset test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../filter_tool/" class="md-nav__link">
<span class="md-ellipsis">
Filter tool
</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="../management_decoder/" class="md-nav__link">
<span class="md-ellipsis">
Management decoder
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Documentation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
<span class="md-ellipsis">
Getting started and features
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Getting started and features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
Faq
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_profiles/" class="md-nav__link">
<span class="md-ellipsis">
Full profiles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../role_feature_switches/" class="md-nav__link">
<span class="md-ellipsis">
Role feature switches
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_features/" class="md-nav__link">
<span class="md-ellipsis">
Full companion features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_radio_full/" class="md-nav__link">
<span class="md-ellipsis">
Companion radio full
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_usb_switcher/" class="md-nav__link">
<span class="md-ellipsis">
Full companion usb switcher
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_offline_queue/" class="md-nav__link">
<span class="md-ellipsis">
Companion offline queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../halo_keymind_settings/" class="md-nav__link">
<span class="md-ellipsis">
Halo keymind settings
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2" id="__nav_3_2_label" tabindex="0">
<span class="md-ellipsis">
Firmware updates and partitions
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Firmware updates and partitions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../upgrading_1.17.1.8_to_1.17.1.9/" class="md-nav__link">
<span class="md-ellipsis">
Upgrading 1.17.1.8 to 1.17.1.9
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_user_guide/" class="md-nav__link">
<span class="md-ellipsis">
Ota user guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_easy/" class="md-nav__link">
<span class="md-ellipsis">
Ota easy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lora_ota_automation/" class="md-nav__link">
<span class="md-ellipsis">
Lora ota automation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
<span class="md-ellipsis">
Ota nrf52 bootloader update
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_qspi/" class="md-nav__link">
<span class="md-ellipsis">
Ota nrf52 qspi
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
<span class="md-ellipsis">
Ota meshtower v2 sdcard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../esp32_partition_catalog/" class="md-nav__link">
<span class="md-ellipsis">
Esp32 partition catalog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../esp32_wifi_partition_migration/" class="md-nav__link">
<span class="md-ellipsis">
Esp32 wifi partition migration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../heltec_v4_wifi_partition_migration/" class="md-nav__link">
<span class="md-ellipsis">
Heltec v4 wifi partition migration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../host_cli_service/" class="md-nav__link">
<span class="md-ellipsis">
Host cli service
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0">
<span class="md-ellipsis">
Radio, networking, and power
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Radio, networking, and power
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../radio_profiles/" class="md-nav__link">
<span class="md-ellipsis">
Radio profiles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../fleet_management/" class="md-nav__link">
<span class="md-ellipsis">
Private fleet management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../room_services/" class="md-nav__link">
<span class="md-ellipsis">
Room services
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../carrier_wave/" class="md-nav__link">
<span class="md-ellipsis">
Carrier wave
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../espnow_bridge_setup/" class="md-nav__link">
<span class="md-ellipsis">
Espnow bridge setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rs232_bridge_setup/" class="md-nav__link">
<span class="md-ellipsis">
Rs232 bridge setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../udp_bridge_setup/" class="md-nav__link">
<span class="md-ellipsis">
Udp bridge setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../WiFi/" class="md-nav__link">
<span class="md-ellipsis">
WiFi
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
<span class="md-ellipsis">
Flood filtering
</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="../companion_lost_reply/" class="md-nav__link">
<span class="md-ellipsis">
Companion lost reply
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sensor_tracker/" class="md-nav__link">
<span class="md-ellipsis">
Sensor tracker
</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>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_4" >
<label class="md-nav__link" for="__nav_3_4" id="__nav_3_4_label" tabindex="0">
<span class="md-ellipsis">
CLI and protocol reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_4">
<span class="md-nav__icon md-icon"></span>
CLI and protocol reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<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_build_matrix/" class="md-nav__link">
<span class="md-ellipsis">
Cli build matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_command_availability/" class="md-nav__link">
<span class="md-ellipsis">
Cli command availability
</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="../companion_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Companion protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../kiss_modem_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Kiss modem protocol
</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="../payloads/" class="md-nav__link">
<span class="md-ellipsis">
Payloads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Ota protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../management_reports/" class="md-nav__link">
<span class="md-ellipsis">
Management reports
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stats_binary_frames/" class="md-nav__link">
<span class="md-ellipsis">
Stats binary frames
</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="../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
Qr codes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../docs/" class="md-nav__link">
<span class="md-ellipsis">
Docs
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../research/" class="md-nav__link">
<span class="md-ellipsis">
Research
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_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_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Releases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Current release
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Current release
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../releases/1.17.1.9/" class="md-nav__link">
<span class="md-ellipsis">
1.17.1.9 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releases/1.17.1.8/" class="md-nav__link">
<span class="md-ellipsis">
1.17.1.8 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../test-results/" class="md-nav__link">
<span class="md-ellipsis">
Test Results
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../old-releases/" class="md-nav__link">
<span class="md-ellipsis">
Old Releases
</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="#manufacturer-confirmed-optional-screens" class="md-nav__link">
<span class="md-ellipsis">
Manufacturer-confirmed optional screens
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#integral-screens" class="md-nav__link">
<span class="md-ellipsis">
Integral screens
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#validation" class="md-nav__link">
<span class="md-ellipsis">
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/optional_screens.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>
<!-- meshcore-hosted-doc-link:start -->
<p class="meshcore-hosted-doc-link"><a href="https://mikecarper.github.io/MeshCore/optional_screens/">View this page on MeshCore Docs</a>.</p>
<!-- meshcore-hosted-doc-link:end -->
<h1 id="optional-screens">Optional screens</h1>
<p>Use the normal display-capable firmware for your exact board and role. When
automatic detection is included, that image starts the supported screen if
it responds, or continues headless if it is absent. There is no screen-presence
setting. Power the board off before attaching or removing an optional screen.</p>
<p>The <a href="../firmware_picker/">firmware picker</a> describes automatic screen detection
only when the selected application has been verified to contain it. Previously
published firmware retains its original behavior. These additions become
available as new firmware is built and qualified; changing the picker does not
add detection to an older download.</p>
<h2 id="manufacturer-confirmed-optional-screens">Manufacturer-confirmed optional screens</h2>
<table>
<thead>
<tr>
<th>Hardware</th>
<th>Manufacturer evidence</th>
<th>Firmware behavior</th>
</tr>
</thead>
<tbody>
<tr>
<td>Heltec T114</td>
<td><a href="https://heltec.org/project/mesh-node-t114/">Heltec</a> offers the optional stock screen.</td>
<td>Automatic ST7789 detection; see the <a href="../heltec_t114/">T114 guide</a>.</td>
</tr>
<tr>
<td>Heltec RC32 with T108</td>
<td>The <a href="https://heltec.org/project/t108/">T108</a> is a separate pin-header display module. The <a href="https://github.com/HelTecAutomation/RadioCore_Library/blob/45f20ff79f66d84022497040fda7cb7d0824639b/examples/NV3001B_Display/README.md">manufacturer example</a> documents its pins and power controls.</td>
<td>New display-capable images detect the NV3001B panel. Legacy <code>without_display</code> targets remain headless compatibility builds.</td>
</tr>
<tr>
<td>Heltec Wireless Tracker V1/V1.1</td>
<td>The <a href="https://old.heltec.org/project/wireless-tracker/">manufacturer listing</a> explicitly offers Screen Yes/No.</td>
<td>New display-capable images detect the ST7735 panel. Its absence releases only the display's power claim; GPS retains its own claim on the shared supply.</td>
</tr>
<tr>
<td>Heltec V4 R8 Expansion Kit</td>
<td>The <a href="https://heltec.org/project/v4-r8-ex/">manufacturer kit</a> offers front-panel configurations; its V2 expansion schematic connects the display's separate return line.</td>
<td>New R8 TFT images detect the panel through the documented MISO pin. Existing touch reset and backlight-only sleep/wake behavior are retained.</td>
</tr>
<tr>
<td>Heltec V4/V4 R8 OLED</td>
<td>The <a href="https://heltec.org/project/wifi-lora-32-v4/">manufacturer listing</a> offers OLED and No Display configurations.</td>
<td>Existing SSD1306 images already check whether the OLED responds.</td>
</tr>
<tr>
<td>RAK WisBlock</td>
<td>The <a href="https://downloads.rakwireless.com/Meshtastic/Quick%20Start%20Guide_WisMesh%20RAK4631%20Starter%20Kit.pdf">RAK4631 kit guide</a> labels the RAK1921 OLED optional.</td>
<td>Display-capable RAK4631 and RAK3401 images check presence and detect SSD1306 or SH1106 controllers. New images also provide a saved controller choice; see below.</td>
</tr>
<tr>
<td>iKoka Stick and Handheld</td>
<td>The designer documents an <a href="https://github.com/ndoo/ikoka-stick-meshtastic-device#oled-display-optional">optional Stick OLED</a> and <a href="https://github.com/ndoo/ikoka-handheld-meshtastic-device#oled-display-optional">optional Handheld OLED</a>.</td>
<td>Existing display-capable images already check presence. Handheld Companion supports the screen; currently headless infrastructure recipes remain headless.</td>
</tr>
<tr>
<td>Original LilyGo T-Beam</td>
<td><a href="https://lilygo.cc/products/t-beam-v1-1-esp32-lora-module">LilyGo</a> offers soldered/non-soldered OLED configurations.</td>
<td>Existing display-capable SSD1306 images already check presence.</td>
</tr>
<tr>
<td>XIAO ESP32-S3 with Wio-SX1262</td>
<td><a href="https://wiki.seeedstudio.com/wio_sx1262_with_xiao_esp32s3_kit/#recommended-accessories">Seeed</a> lists the expansion board as an accessory for adding screens and sensors.</td>
<td>Existing display-capable Companion images already check presence.</td>
</tr>
<tr>
<td>Muzi Base Uno/Duo with SuperIO</td>
<td><a href="https://muzi.works/products/super-io">SuperIO</a> adds the OLED, GPS, buttons and buzzer to the matching Base radio.</td>
<td>New Companion images probe the SH1107 display, leave its 12 V supply off when absent, and discover GPS independently. Uno and Duo retain their different radio drivers.</td>
</tr>
<tr>
<td>LilyGo T-Echo Lite core/display assembly</td>
<td><a href="https://lilygo.cc/en-us/products/t-echo-lite">LilyGo</a> documents the split core/base design.</td>
<td>New Companion images check SSD1681 status readback before e-paper initialization and continue headless when the panel does not respond. The old non-shell target names remain compatibility recipes.</td>
</tr>
</tbody>
</table>
<p>The older V4 TFT expansion configuration is also optional, but its current
recipe has no verified panel readback connection. Detection is not enabled for
that wiring. A touchscreen acknowledgement alone does not establish that the
LCD responds. The V4 R8 TFT and older V4 TFT pin mappings are distinct.</p>
<p>RAK4631 and RAK3401 images with OLED controller detection support
<code>set display.controller auto</code>, <code>ssd1306</code> or <code>sh1106</code> in all display-enabled
roles. Keep <code>auto</code> for normal use; choose the panel's controller explicitly if
detection gives shifted or wrapped pixels. The choice is saved and applies
after restarting the node. <code>get display.controller</code> shows the configured and
active choices and any pending restart. With no saved choice, automatic
detection or an existing build-time override supplies the default; saved
<code>auto</code> takes precedence over that override. Normal controller selection does
not require custom firmware. See the <a href="../cli_commands/#select-rak-oled-controller">controller commands</a>.</p>
<p>New R8 TFT images support saved <code>display.rotation</code> values of <code>0</code>, <code>90</code>, <code>180</code>
and <code>270</code>, including portrait/landscape dashboard changes without reflashing.
The stock R8 expansion board has no accelerometer for automatic orientation.
See the <a href="../cli_commands/#set-display-rotation">rotation commands</a>.</p>
<p>The <a href="../test-results/firmware_variant_consolidation/">variant consolidation validation</a>
records the ten qualified packages, software checks and remaining physical tests
for R8 rotation, Muzi SuperIO and T-Echo Lite detection.</p>
<p>Full Wireless Tracker repeaters retain the board's 50-neighbor capacity, as
the V1.1 and V2 Full profiles already do. This preserves RAM for the screen,
GPS, MQTT and update services; the RAM admission limits remain unchanged.</p>
<p>The R8 readback route is documented in Heltec's
<a href="https://resource.heltec.cn/download/WiFi_LoRa_32_Expansion_Kit-V2/schematic/Expansion_board_V2.03.pdf">Expansion Kit V2.03 schematic</a>.
Tracker V1 wiring is documented in the
<a href="https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1/HTIT-Tracker_V0.5.pdf">V1.1 schematic</a>.</p>
<p>Screen presence does not establish controller type, dimensions, physical
orientation, or board revision. Continue choosing the exact hardware profile.
Use USB when changing an old firmware target name; a different target's LoRa
update package is not interchangeable. Saved identity and settings do not need
to be erased for screen detection.</p>
<h2 id="integral-screens">Integral screens</h2>
<p>Manufacturer documentation identifies built-in screens on the
<a href="https://lilygo.cc/products/t-echo-card">LilyGo T-Echo Card</a>,
<a href="https://wiki.heltec.org/docs/devices/open-source-hardware/esp32-series/vision-master/vison-master-t190/">Heltec T190</a>,
<a href="https://heltec.org/project/mesh-node-t1/">T1</a>,
<a href="https://heltec.org/project/t096/">T096</a>,
<a href="https://heltec.org/project/wireless-tracker-v2/">Wireless Tracker V2</a>,
<a href="https://www.elecrow.com/wiki/ThinkNode_M9_MeshCore_Communication_Terminal_with_Full_Keyboard.html">ThinkNode M9</a>
and <a href="https://wiki.lilygo.cc/products/t-deck-series/t-deck/">T-Deck</a>.
No new optional-screen detection is enabled for these boards. In particular,
the T190's optional module is its LoRa radio, not its screen.</p>
<h2 id="validation">Validation</h2>
<p>The new probes run before display SPI initialization and framebuffer
allocation, with the backlight off. Bounded repeated reads under opposite
pull directions reject floating, stuck and unstable return lines. An absent
screen stays disabled until reboot; later drawing or wake requests cannot
power it back up. Shared supplies retain other peripherals' ownership.</p>
<p>Native tests cover controller replies, timing, pin turnaround, power ownership,
headless behavior, rendering, sleep/wake, and exclusions for integral screens.
Release checks require the detection marker in the uploadable application,
the exact resolved board/driver flags and the matching source commit before
the picker can advertise detection.</p>
<table>
<thead>
<tr>
<th>Check</th>
<th>Result</th>
</tr>
</thead>
<tbody>
<tr>
<td>Native detection, rendering, power and headless regressions</td>
<td>PASS, 31 test methods, including 12 new detection methods with sanitizers and negative controls</td>
</tr>
<tr>
<td>Recipe, release-proof, controls and offline-picker regressions</td>
<td>PASS, 42 test methods</td>
</tr>
<tr>
<td>Resolved PlatformIO configuration</td>
<td>PASS, 31 optional-screen environments across the three hardware families; integral-screen recipes excluded</td>
</tr>
<tr>
<td>Picker JavaScript regressions</td>
<td>PASS, 4 suites</td>
</tr>
<tr>
<td>Complete build-profile selection suite</td>
<td>PASS</td>
</tr>
<tr>
<td>Hosted documentation links</td>
<td>PASS, 7 test methods</td>
</tr>
<tr>
<td>Packaged ESP32 firmware smoke builds</td>
<td>PASS, RC32 Full Companion, Tracker V1 Full Repeater/MQTT, Tracker V1.1 Full Repeater/MQTT, and V4 R8 TFT Full Companion</td>
</tr>
</tbody>
</table>
<p>The qualified smoke packages use firmware source
<a href="https://github.com/mikecarper/MeshCore/commit/8268befbdcdc3572b42f99ac0dee2a19ae20f02f"><code>8268befbd</code></a>.
All four uploadable applications contain their board-specific detection marker
and matching firmware/source version. Their bound package hashes and generated
picker controls pass verification. RAM headroom after the complete modeled
allocation and transient margin is 68,672 bytes for RC32, 1,942 for Tracker V1,
4,054 for Tracker V1.1, and 66,528 for V4 R8 TFT. These are build-time admission
results, not measurements of physical runtime load.</p>
<p>Physical verification on RC32, Tracker V1 and V4 R8 with and without their
manufacturer-supported screen has not been performed. Hardware qualification
requires cold USB/battery boots, screen sleep/wake, headless input, normal radio
transmit/receive, and GPS or touch operation where fitted.</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/hosted_doc_links.js?v=20261007-1"></script>
<script src="../_javascript/notification_builder.js?v=20261006-channel9"></script>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="../_javascript/firmware_picker.js?v=20261018-variant-consolidation-1"></script>
<script src="../_javascript/telemetry_decoder.js?v=20261007-hosted-form"></script>
<script src="../_javascript/management_decoder.js"></script>
<script src="../_javascript/filter_tool.js?v=20261002-hashbytes-2plus"></script>
<script src="../_javascript/preset_test.js?v=20260923-2"></script>
<script src="../_javascript/esp32_partition_catalog.js?v=20261001-1"></script>
</body>
</html>