docs: publish channels: main api

This commit is contained in:
github-actions[bot] committed 2026-09-19 20:56:26 +00:00
1 parent a6b7477e8d
commit 9586c484f9
88 files changed
+6787 -6439

No files matched your search

File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>DEFAULT</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="-d-e-f-a-u-l-t.html">DEFAULT</a><span class="token operator">: </span><a href="../index.html">ChannelOption</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L510">source</a>)</span></span></div><p class="paragraph">The default channel option for new configurations.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="-d-e-f-a-u-l-t.html">DEFAULT</a><span class="token operator">: </span><a href="../index.html">ChannelOption</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L513">source</a>)</span></span></div><p class="paragraph">The default channel option for new configurations.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>from</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="from.html"><span class="token function">from</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">modemPreset<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="token operator">?</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="../index.html">ChannelOption</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L513">source</a>)</span></span></div><p class="paragraph">Finds the ChannelOption corresponding to the given ModemPreset. Returns null if no match is found.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="from.html"><span class="token function">from</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">modemPreset<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="token operator">?</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="../index.html">ChannelOption</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L516">source</a>)</span></span></div><p class="paragraph">Finds the ChannelOption corresponding to the given ModemPreset. Returns null if no match is found.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -93,7 +93,7 @@
<div class="breadcrumbs"><a href="../../../index.html">core-model</a><span class="delimiter">/</span><a href="../../index.html">org.meshtastic.core.model</a><span class="delimiter">/</span><a href="../index.html">ChannelOption</a><span class="delimiter">/</span><span class="current">Companion</span></div>
<div class="cover ">
<h1 class="cover"><span><span>Companion</span></span></h1>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">object </span><a href="index.html">Companion</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L499">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">object </span><a href="index.html">Companion</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L502">source</a>)</span></span></div></div></div>
</div>
<div class="tabbedcontent">
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="CONSTRUCTOR,TYPE,PROPERTY,FUNCTION">Members</button></div>
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>bandwidth</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="bandwidth.html">bandwidth</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L462">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="bandwidth.html">bandwidth</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L465">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>entries</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="entries.html">entries</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.enums/-enum-entries/index.html">EnumEntries</a><span class="token operator">&lt;</span><a href="index.html">ChannelOption</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L460">source</a>)</span></span></div><p class="paragraph">Returns a representation of an immutable list of all enum entries, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the enum entries.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="entries.html">entries</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.enums/-enum-entries/index.html">EnumEntries</a><span class="token operator">&lt;</span><a href="index.html">ChannelOption</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L463">source</a>)</span></span></div><p class="paragraph">Returns a representation of an immutable list of all enum entries, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the enum entries.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -93,7 +93,7 @@
<div class="breadcrumbs"><a href="../../index.html">core-model</a><span class="delimiter">/</span><a href="../index.html">org.meshtastic.core.model</a><span class="delimiter">/</span><span class="current">ChannelOption</span></div>
<div class="cover ">
<h1 class="cover"><span>Channel</span><wbr><span><span>Option</span></span></h1>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">enum </span><a href="index.html">ChannelOption</a> : <a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-enum/index.html">Enum</a><span class="token operator">&lt;</span><a href="index.html">ChannelOption</a><span class="token operator">&gt; </span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L460">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">enum </span><a href="index.html">ChannelOption</a> : <a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-enum/index.html">Enum</a><span class="token operator">&lt;</span><a href="index.html">ChannelOption</a><span class="token operator">&gt; </span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L463">source</a>)</span></span></div></div></div>
</div>
<div class="tabbedcontent">
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="CONSTRUCTOR,TYPE,PROPERTY,FUNCTION">Members</button><button class="section-tab" data-togglable="ENTRY">Entries</button></div>
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>min</span><wbr><span><span>Firmware</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="min-firmware.html">minFirmware</a><span class="token operator">: </span><a href="../-device-version/index.html">DeviceVersion</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L464">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="min-firmware.html">minFirmware</a><span class="token operator">: </span><a href="../-device-version/index.html">DeviceVersion</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L467">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>modem</span><wbr><span><span>Preset</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="modem-preset.html">modemPreset</a><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L461">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="modem-preset.html">modemPreset</a><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L464">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>snr</span><wbr><span><span>Limit</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="snr-limit.html">snrLimit</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L496">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="snr-limit.html">snrLimit</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L499">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>spreading</span><wbr><span><span>Factor</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="spreading-factor.html">spreadingFactor</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html">Int</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L463">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="spreading-factor.html">spreadingFactor</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html">Int</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L466">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>value</span><wbr><span><span>Of</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="value-of.html"><span class="token function">valueOf</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">value<span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="index.html">ChannelOption</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L460">source</a>)</span></span></div><p class="paragraph">Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)</p><h4 class="tableheader">Throws</h4><div class="table"><div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain"><div class="main-subrow keyValue "><div class=""><span class="inline-flex"><div><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html"><span>kotlin.</span><wbr><span>Illegal</span><wbr><span>Argument</span><wbr><span><span>Exception</span></span></a></div></span></div><div><div class="title"><p class="paragraph">if this enum type has no constant with the specified name</p></div></div></div></div></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="value-of.html"><span class="token function">valueOf</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">value<span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="index.html">ChannelOption</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L463">source</a>)</span></span></div><p class="paragraph">Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)</p><h4 class="tableheader">Throws</h4><div class="table"><div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain"><div class="main-subrow keyValue "><div class=""><span class="inline-flex"><div><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html"><span>kotlin.</span><wbr><span>Illegal</span><wbr><span>Argument</span><wbr><span><span>Exception</span></span></a></div></span></div><div><div class="title"><p class="paragraph">if this enum type has no constant with the specified name</p></div></div></div></div></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>values</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="values.html"><span class="token function">values</span></a><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html">Array</a><span class="token operator">&lt;</span><a href="index.html">ChannelOption</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L460">source</a>)</span></span></div><p class="paragraph">Returns an array containing the constants of this enum type, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the constants.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="values.html"><span class="token function">values</span></a><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html">Array</a><span class="token operator">&lt;</span><a href="index.html">ChannelOption</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L463">source</a>)</span></span></div><p class="paragraph">Returns an array containing the constants of this enum type, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the constants.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>from</span><wbr><span>Region</span><wbr><span><span>Code</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="from-region-code.html"><span class="token function">fromRegionCode</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">regionCode<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="../index.html">RegionInfo</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L456">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="from-region-code.html"><span class="token function">fromRegionCode</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">regionCode<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="../index.html">RegionInfo</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L459">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -93,7 +93,7 @@
<div class="breadcrumbs"><a href="../../../index.html">core-model</a><span class="delimiter">/</span><a href="../../index.html">org.meshtastic.core.model</a><span class="delimiter">/</span><a href="../index.html">RegionInfo</a><span class="delimiter">/</span><span class="current">Companion</span></div>
<div class="cover ">
<h1 class="cover"><span><span>Companion</span></span></h1>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">object </span><a href="index.html">Companion</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L455">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">object </span><a href="index.html">Companion</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L458">source</a>)</span></span></div></div></div>
</div>
<div class="tabbedcontent">
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="CONSTRUCTOR,TYPE,PROPERTY,FUNCTION">Members</button></div>
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>description</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="description.html">description</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L140">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="description.html">description</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L143">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>entries</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="entries.html">entries</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.enums/-enum-entries/index.html">EnumEntries</a><span class="token operator">&lt;</span><a href="index.html">RegionInfo</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L138">source</a>)</span></span></div><p class="paragraph">Returns a representation of an immutable list of all enum entries, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the enum entries.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="entries.html">entries</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.enums/-enum-entries/index.html">EnumEntries</a><span class="token operator">&lt;</span><a href="index.html">RegionInfo</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L141">source</a>)</span></span></div><p class="paragraph">Returns a representation of an immutable list of all enum entries, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the enum entries.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>freq</span><wbr><span><span>End</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="freq-end.html">freqEnd</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L142">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="freq-end.html">freqEnd</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L145">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>freq</span><wbr><span><span>Start</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="freq-start.html">freqStart</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L141">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="freq-start.html">freqStart</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L144">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -93,7 +93,7 @@
<div class="breadcrumbs"><a href="../../index.html">core-model</a><span class="delimiter">/</span><a href="../index.html">org.meshtastic.core.model</a><span class="delimiter">/</span><span class="current">RegionInfo</span></div>
<div class="cover ">
<h1 class="cover"><span>Region</span><wbr><span><span>Info</span></span></h1>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">enum </span><a href="index.html">RegionInfo</a> : <a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-enum/index.html">Enum</a><span class="token operator">&lt;</span><a href="index.html">RegionInfo</a><span class="token operator">&gt; </span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L138">source</a>)</span></span></div><p class="paragraph">Regulatory regions for radio usage</p><h4 class="tableheader">See also</h4><div class="table"><div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain"><div class="main-subrow keyValue "><div class=""><span class="inline-flex"><div></div></span></div><div><div class="title"><p class="paragraph"><a href="https://lora-alliance.org/wp-content/uploads/2020/11/lorawan_regional_parameters_v1.0.3reva_0.pdf">LoRaWAN Regional Parameters</a></p></div></div></div></div></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">enum </span><a href="index.html">RegionInfo</a> : <a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-enum/index.html">Enum</a><span class="token operator">&lt;</span><a href="index.html">RegionInfo</a><span class="token operator">&gt; </span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L141">source</a>)</span></span></div><p class="paragraph">Regulatory regions for radio usage</p><h4 class="tableheader">See also</h4><div class="table"><div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain"><div class="main-subrow keyValue "><div class=""><span class="inline-flex"><div></div></span></div><div><div class="title"><p class="paragraph"><a href="https://lora-alliance.org/wp-content/uploads/2020/11/lorawan_regional_parameters_v1.0.3reva_0.pdf">LoRaWAN Regional Parameters</a></p></div></div></div></div></div></div></div>
</div>
<div class="tabbedcontent">
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="CONSTRUCTOR,TYPE,PROPERTY,FUNCTION">Members</button><button class="section-tab" data-togglable="ENTRY">Entries</button></div>
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>min</span><wbr><span><span>Firmware</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="min-firmware.html">minFirmware</a><span class="token operator">: </span><a href="../-device-version/index.html">DeviceVersion</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L147">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="min-firmware.html">minFirmware</a><span class="token operator">: </span><a href="../-device-version/index.html">DeviceVersion</a><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L150">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>override</span><wbr><span><span>Slot</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="override-slot.html">overrideSlot</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html">Int</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L146">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="override-slot.html">overrideSlot</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html">Int</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L149">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>padding</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="padding.html">padding</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L145">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="padding.html">padding</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L148">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>region</span><wbr><span><span>Code</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="region-code.html">regionCode</a><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L139">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="region-code.html">regionCode</a><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L142">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>spacing</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="spacing.html">spacing</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L144">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="spacing.html">spacing</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-float/index.html">Float</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L147">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>value</span><wbr><span><span>Of</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="value-of.html"><span class="token function">valueOf</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">value<span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="index.html">RegionInfo</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L138">source</a>)</span></span></div><p class="paragraph">Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)</p><h4 class="tableheader">Throws</h4><div class="table"><div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain"><div class="main-subrow keyValue "><div class=""><span class="inline-flex"><div><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html"><span>kotlin.</span><wbr><span>Illegal</span><wbr><span>Argument</span><wbr><span><span>Exception</span></span></a></div></span></div><div><div class="title"><p class="paragraph">if this enum type has no constant with the specified name</p></div></div></div></div></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="value-of.html"><span class="token function">valueOf</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">value<span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a></span></span><span class="token punctuation">)</span><span class="token operator">: </span><a href="index.html">RegionInfo</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L141">source</a>)</span></span></div><p class="paragraph">Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)</p><h4 class="tableheader">Throws</h4><div class="table"><div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain"><div class="main-subrow keyValue "><div class=""><span class="inline-flex"><div><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html"><span>kotlin.</span><wbr><span>Illegal</span><wbr><span>Argument</span><wbr><span><span>Exception</span></span></a></div></span></div><div><div class="title"><p class="paragraph">if this enum type has no constant with the specified name</p></div></div></div></div></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span><span>values</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="values.html"><span class="token function">values</span></a><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html">Array</a><span class="token operator">&lt;</span><a href="index.html">RegionInfo</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L138">source</a>)</span></span></div><p class="paragraph">Returns an array containing the constants of this enum type, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the constants.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="values.html"><span class="token function">values</span></a><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html">Array</a><span class="token operator">&lt;</span><a href="index.html">RegionInfo</a><span class="token operator">&gt;</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L141">source</a>)</span></span></div><p class="paragraph">Returns an array containing the constants of this enum type, in the order they're declared.</p><p class="paragraph">This method may be used to iterate over the constants.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>wide</span><wbr><span><span>Lora</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="wide-lora.html">wideLora</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html">Boolean</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L143">source</a>)</span></span></div></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">val </span><a href="wide-lora.html">wideLora</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html">Boolean</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/ChannelOption.kt#L146">source</a>)</span></span></div></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>default</span><wbr><span>Preset</span><wbr><span><span>For</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="default-preset-for.html"><span class="token function">defaultPresetFor</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">region<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/RegionPresetConstraint.kt#L117">source</a>)</span></span></div><p class="paragraph">The app's preferred default preset for <a href="default-preset-for.html">region</a>, or <code class="lang-kotlin">null</code> when it has no region-specific default and the caller should fall back to <a href="-channel-option/-companion/-d-e-f-a-u-l-t.html">ChannelOption.DEFAULT</a> / the current preset.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><a href="default-preset-for.html"><span class="token function">defaultPresetFor</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">region<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/RegionPresetConstraint.kt#L118">source</a>)</span></span></div><p class="paragraph">The app's preferred default preset for <a href="default-preset-for.html">region</a>, or <code class="lang-kotlin">null</code> when it has no region-specific default and the caller should fall back to <a href="-channel-option/-companion/-d-e-f-a-u-l-t.html">ChannelOption.DEFAULT</a> / the current preset.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
@@ -0,0 +1,117 @@
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8">
<title>firstSetupDefaultFor</title>
<link href="../../../images/logo-icon.svg" rel="icon" type="image/svg"><script>var pathToRoot = "../../../";</script>
<script>document.documentElement.classList.replace("no-js", "js");</script>
<script>const storage = localStorage.getItem("dokka-dark-mode")
if (storage == null) {
const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
if (osDarkSchemePreferred === true) {
document.getElementsByTagName("html")[0].classList.add("theme-dark")
}
} else {
const savedDarkMode = JSON.parse(storage)
if (savedDarkMode === true) {
document.getElementsByTagName("html")[0].classList.add("theme-dark")
}
}
</script>
<script type="text/javascript" src="../../../scripts/sourceset_dependencies.js" async></script>
<link href="../../../styles/style.css" rel="Stylesheet">
<link href="../../../styles/main.css" rel="Stylesheet">
<link href="../../../styles/prism.css" rel="Stylesheet">
<link href="../../../styles/logo-styles.css" rel="Stylesheet">
<link href="../../../ui-kit/ui-kit.min.css" rel="Stylesheet">
<script type="text/javascript" src="../../../scripts/safe-local-storage_blocking.js"></script>
<script type="text/javascript" src="../../../scripts/navigation-loader.js" async></script>
<script type="text/javascript" src="../../../scripts/platform-content-handler.js" async></script>
<script type="text/javascript" src="../../../scripts/main.js" defer></script>
<script type="text/javascript" src="../../../scripts/prism.js" async></script>
<script type="text/javascript" src="../../../ui-kit/ui-kit.min.js" defer></script></head>
<body>
<div class="root">
<header class="navigation theme-dark" id="navigation-wrapper" role="banner">
<a class="library-name--link" href="../../../index.html" tabindex="1">
Meshtastic App
</a> <button class="navigation-controls--btn navigation-controls--btn_toc ui-kit_mobile-only" id="toc-toggle" type="button">Toggle table of contents
</button>
<div class="navigation-controls--break ui-kit_mobile-only"></div>
<div class="library-version" id="library-version">
</div>
<div class="navigation-controls">
<ul class="filter-section filter-section_loading" id="filter-section" aria-label="Target filter">
<button class="platform-tag platform-selector common-like" data-active="" aria-pressed="true" data-filter=":core:model/commonMain">common</button>
<div class="dropdown filter-section--dropdown" data-role="dropdown" id="filter-section-dropdown">
<button class="button button_dropdown filter-section--dropdown-toggle" role="combobox" data-role="dropdown-toggle" aria-controls="platform-tags-listbox" aria-haspopup="listbox" aria-expanded="false" aria-label="Toggle source sets"></button>
<ul role="listbox" id="platform-tags-listbox" class="dropdown--list" data-role="dropdown-listbox" aria-label="Target filter">
<div class="dropdown--header"><span>Target filter</span>
<button class="button" data-role="dropdown-toggle" aria-label="Close target filter">
<i class="ui-kit-icon ui-kit-icon_cross"></i>
</button>
</div>
<li role="option" class="dropdown--option platform-selector-option common-like" tabindex="0">
<label class="checkbox">
<input type="checkbox" class="checkbox--input" id=":core:model/commonMain" data-filter=":core:model/commonMain">
<span class="checkbox--icon"></span>
common
</label>
</li>
</ul>
<div class="dropdown--overlay"></div>
</div>
</ul>
<button class="navigation-controls--btn navigation-controls--btn_theme" id="theme-toggle-button" type="button">Switch theme
</button>
<div class="navigation-controls--btn navigation-controls--btn_search" id="searchBar" role="button">Search in
API
</div>
</div>
</header>
<div id="container">
<nav id="leftColumn" class="sidebar" data-item-type="SECTION" data-item-config="{&quot;defaultSize&quot;: 280, &quot;minSize&quot;: 200, &quot;maxSize&quot;: 400}">
<a class="toc--skip-link" href="#main">Skip to content</a>
<div class="dropdown theme-dark_mobile" data-role="dropdown" id="toc-dropdown">
<ul role="listbox" id="toc-listbox" class="dropdown--list dropdown--list_toc-list" data-role="dropdown-listbox" aria-label="Table of contents">
<div class="dropdown--header">
<span>
Meshtastic App
</span>
<button class="button" data-role="dropdown-toggle" aria-label="Close table of contents">
<i class="ui-kit-icon ui-kit-icon_cross"></i>
</button>
</div>
<div class="sidebar--inner" id="sideMenu"></div>
</ul>
<div class="dropdown--overlay"></div>
</div>
</nav>
<div id="resizer" class="resizer" data-item-type="BAR"></div>
<div id="main" data-item-type="SECTION" role="main">
<div class="main-content" data-page-type="member" id="content" pageids="core-model::org.meshtastic.core.model//firstSetupDefaultFor/org.meshtastic.proto.LoRaRegionPresetMap?#org.meshtastic.proto.Config.LoRaConfig.RegionCode/PointingToDeclaration//394437785">
<div class="breadcrumbs"><a href="../index.html">core-model</a><span class="delimiter">/</span><a href="index.html">org.meshtastic.core.model</a><span class="delimiter">/</span><span class="current">firstSetupDefaultFor</span></div>
<div class="cover ">
<h1 class="cover"><span>first</span><wbr><span>Setup</span><wbr><span>Default</span><wbr><span><span>For</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><span data-unresolved-link="org.meshtastic.proto/LoRaRegionPresetMap///PointingToDeclaration/">LoRaRegionPresetMap</span><span class="token operator">?</span><span class="token punctuation">.</span><a href="first-setup-default-for.html"><span class="token function">firstSetupDefaultFor</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">region<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="token operator">?</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/RegionPresetConstraint.kt#L127">source</a>)</span></span></div><p class="paragraph">The preset a first-ever setup in <a href="first-setup-default-for.html">region</a> should install, or <code class="lang-kotlin">null</code> to leave the choice alone.</p><p class="paragraph">Gated on the firmware map: an unconstrained node is running firmware whose own region chooser installs the region-table default, and overriding it there would make the same node set up from the phone and from its screen disagree. Only a preset the map lists as legal is adopted.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
<a href="#content" id="go-to-top-link" class="footer--button footer--button_go-to-top"></a>
<div class="footer--content">
<div>
<span>Generated by </span>
<a class="footer--link footer--link_external" href="https://github.com/Kotlin/dokka">
Dokka
</a>
<div>© 2026 Copyright</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
@@ -1397,6 +1397,21 @@
</div>
</div>
</div>
<a data-name="-898479644%2FFunctions%2F394437785" anchor-label="firstSetupDefaultFor" id="-898479644%2FFunctions%2F394437785" data-filterable-set=":core:model/commonMain"></a>
<div class="table-row table-row_content" data-togglable="EXTENSION_FUNCTION" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain">
<div class="main-subrow keyValue ">
<div class=""><span class="inline-flex">
<div><a href="first-setup-default-for.html"><span>first</span><wbr><span>Setup</span><wbr><span>Default</span><wbr><span><span>For</span></span></a></div>
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-898479644%2FFunctions%2F394437785"></span>
<div class="copy-popup-wrapper "><span class="copy-popup-icon"></span><span>Link copied to clipboard</span></div>
</span></span></div>
<div>
<div class="title">
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><span data-unresolved-link="org.meshtastic.proto/LoRaRegionPresetMap///PointingToDeclaration/">LoRaRegionPresetMap</span><span class="token operator">?</span><span class="token punctuation">.</span><a href="first-setup-default-for.html"><span class="token function">firstSetupDefaultFor</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">region<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="token operator">?</span></div><div class="brief "><p class="paragraph">The preset a first-ever setup in <a href="first-setup-default-for.html">region</a> should install, or <code class="lang-kotlin">null</code> to leave the choice alone.</p></div></div></div>
</div>
</div>
</div>
</div>
<a data-name="367919123%2FFunctions%2F394437785" anchor-label="getColorFrom" id="367919123%2FFunctions%2F394437785" data-filterable-set=":core:model/commonMain"></a>
<div class="table-row table-row_content" data-filterable-current=":core:model/commonMain" data-filterable-set=":core:model/commonMain">
<div class="main-subrow keyValue ">
@@ -94,7 +94,7 @@
<div class="cover ">
<h1 class="cover"><span>preset</span><wbr><span>For</span><wbr><span>Region</span><wbr><span><span>Change</span></span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><span data-unresolved-link="org.meshtastic.proto/LoRaRegionPresetMap///PointingToDeclaration/">LoRaRegionPresetMap</span><span class="token operator">?</span><span class="token punctuation">.</span><a href="preset-for-region-change.html"><span class="token function">presetForRegionChange</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">previousRegion<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span><span class="token punctuation">, </span></span><span class="parameter ">newRegion<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span><span class="token punctuation">, </span></span><span class="parameter ">current<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/RegionPresetConstraint.kt#L89">source</a>)</span></span></div><p class="paragraph">Returns the modem preset the LoRa form should hold when the region changes from <a href="preset-for-region-change.html">previousRegion</a> to <a href="preset-for-region-change.html">newRegion</a> with <a href="preset-for-region-change.html">current</a> selected.</p><p class="paragraph">Keeps <a href="preset-for-region-change.html">current</a> (legality-repaired via <a href="repair-preset-for.html">repairPresetFor</a>) except at fresh setup: when <a href="preset-for-region-change.html">previousRegion</a> is UNSET and <a href="preset-for-region-change.html">current</a> is the <span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset.LONG_FAST///PointingToDeclaration/{&quot;org.jetbrains.dokka.links.EnumEntryDRIExtra&quot;:{&quot;key&quot;:&quot;org.jetbrains.dokka.links.EnumEntryDRIExtra&quot;}}">ModemPreset.LONG_FAST</span> placeholder a factory-flashed node reports (proto default), the region's advertised default is adopted instead (the firmware map's when present, else the app's built-in default). Any other preset at UNSET was set deliberately (e.g. a vendor build pinning USERPREFS_LORACONFIG_MODEM_PRESET) and is kept.</p><p class="paragraph">A build that pins a preset can also advertise it as an UNSET map entry (firmware #11507), stating outright that the preset is deliberate; that keeps even a pinned LONG_FAST, which the placeholder heuristic alone cannot distinguish.</p></div></div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:model/commonMain"><div class="symbol monospace"><span class="token keyword">fun </span><span data-unresolved-link="org.meshtastic.proto/LoRaRegionPresetMap///PointingToDeclaration/">LoRaRegionPresetMap</span><span class="token operator">?</span><span class="token punctuation">.</span><a href="preset-for-region-change.html"><span class="token function">presetForRegionChange</span></a><span class="token punctuation">(</span><span class="parameters "><span class="parameter ">previousRegion<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span><span class="token punctuation">, </span></span><span class="parameter ">newRegion<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.RegionCode///PointingToDeclaration/">Config.LoRaConfig.RegionCode</span><span class="token punctuation">, </span></span><span class="parameter ">current<span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span></span></span><span class="token punctuation">)</span><span class="token operator">: </span><span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset///PointingToDeclaration/">Config.LoRaConfig.ModemPreset</span><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/model/src/commonMain/kotlin/org/meshtastic/core/model/RegionPresetConstraint.kt#L90">source</a>)</span></span></div><p class="paragraph">Returns the modem preset the LoRa form should hold when the region changes from <a href="preset-for-region-change.html">previousRegion</a> to <a href="preset-for-region-change.html">newRegion</a> with <a href="preset-for-region-change.html">current</a> selected.</p><p class="paragraph">Keeps <a href="preset-for-region-change.html">current</a> (legality-repaired via <a href="repair-preset-for.html">repairPresetFor</a>) except at fresh setup: when <a href="preset-for-region-change.html">previousRegion</a> is UNSET and <a href="preset-for-region-change.html">current</a> is the <span data-unresolved-link="org.meshtastic.proto/Config.LoRaConfig.ModemPreset.LONG_FAST///PointingToDeclaration/{&quot;org.jetbrains.dokka.links.EnumEntryDRIExtra&quot;:{&quot;key&quot;:&quot;org.jetbrains.dokka.links.EnumEntryDRIExtra&quot;}}">ModemPreset.LONG_FAST</span> placeholder a factory-flashed node reports (proto default), a region default is adopted instead: the app's <a href="first-setup-default-for.html">firstSetupDefaultFor</a> where the firmware map confirms it, else the map's own default. Any other preset at UNSET was set deliberately (e.g. a vendor build pinning USERPREFS_LORACONFIG_MODEM_PRESET) and is kept.</p><p class="paragraph">A build that pins a preset can also advertise it as an UNSET map entry (firmware #11507), stating outright that the preset is deliberate; that keeps even a pinned LONG_FAST, which the placeholder heuristic alone cannot distinguish.</p></div></div>
</div>
<div class="footer">
<div class="footer--container">
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -95,7 +95,7 @@
<h1 class="cover"><span>Robolectric</span><wbr><span>Ble</span><wbr><span><span>Bonding</span></span></h1>
<div class="platform-hinted with-platform-tabs" data-platform-hinted="data-platform-hinted">
<div class="platform-bookmarks-row" data-toggle-list="data-toggle-list"><button class="platform-bookmark" data-filterable-current=":core:testing/androidMain" data-filterable-set=":core:testing/androidMain" data-active="" data-toggle=":core:testing/androidMain">android</button></div>
<div class="content sourceset-dependent-content" data-active="" data-togglable=":core:testing/androidMain"><div class="symbol monospace"><span class="token keyword">object </span><a href="index.html">RobolectricBleBonding</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/testing/src/androidMain/kotlin/org/meshtastic/core/testing/RobolectricBleBonding.kt#L44">source</a>)</span></span></div><p class="paragraph">Reusable Robolectric helpers for driving Android Bluetooth bonding logic in <code class="lang-kotlin">androidHostTest</code> source sets.</p><p class="paragraph">These let a unit test exercise the real <code class="lang-kotlin">AndroidBluetoothRepository.bond()</code> (and any future BLE bonding code) without an emulator and without a production seam. They rely on two Robolectric behaviors (verified against Robolectric 4.16.x):</p><ul><li><p class="paragraph"><a href="https://developer.android.com/reference/kotlin/android/bluetooth/BluetoothAdapter.html#getRemoteDevice(kotlin.ByteArray)">android.bluetooth.BluetoothAdapter.getRemoteDevice</a> caches the returned <a href="https://developer.android.com/reference/kotlin/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a> by address in a static map, so the shadow configured here is the <i>same</i> instance production code reads when it calls <code class="lang-kotlin">getRemoteDevice(mac)</code> internally.</p></li><li><p class="paragraph"><span data-unresolved-link="org.robolectric.shadows/ShadowBluetoothDevice/createBond/#/PointingToDeclaration/">ShadowBluetoothDevice.createBond</span> calls <code class="lang-kotlin">checkForBluetoothConnectPermission()</code> first, so tests must call <a href="grant-bluetooth-connect-permission.html">grantBluetoothConnectPermission</a> or <code class="lang-kotlin">createBond()</code> throws <a href="https://developer.android.com/reference/kotlin/java/lang/SecurityException.html">SecurityException</a> instead of returning a value.</p></li></ul><p class="paragraph">Isolation note: because the device cache is static and survives across tests in the same JVM, give each test a distinct MAC so bond-state cannot bleed between tests.</p></div> </div>
<div class="content sourceset-dependent-content" data-active="" data-togglable=":core:testing/androidMain"><div class="symbol monospace"><span class="token keyword">object </span><a href="index.html">RobolectricBleBonding</a><span class="source-link-wrapper"><span class="source-link" data-element-type="source-link">(<a href="https://github.com/meshtastic/Meshtastic-Android/blob/main/core/testing/src/androidMain/kotlin/org/meshtastic/core/testing/RobolectricBleBonding.kt#L44">source</a>)</span></span></div><p class="paragraph">Reusable Robolectric helpers for driving Android Bluetooth bonding logic in <code class="lang-kotlin">androidHostTest</code> source sets.</p><p class="paragraph">These let a unit test exercise the real <code class="lang-kotlin">AndroidBluetoothRepository.bond()</code> (and any future BLE bonding code) without an emulator and without a production seam. They rely on two Robolectric behaviors (verified against Robolectric 4.16.x):</p><ul><li><p class="paragraph"><a href="https://developer.android.com/reference/kotlin/android/bluetooth/BluetoothAdapter.html#getremotedevice">android.bluetooth.BluetoothAdapter.getRemoteDevice</a> caches the returned <a href="https://developer.android.com/reference/kotlin/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a> by address in a static map, so the shadow configured here is the <i>same</i> instance production code reads when it calls <code class="lang-kotlin">getRemoteDevice(mac)</code> internally.</p></li><li><p class="paragraph"><span data-unresolved-link="org.robolectric.shadows/ShadowBluetoothDevice/createBond/#/PointingToDeclaration/">ShadowBluetoothDevice.createBond</span> calls <code class="lang-kotlin">checkForBluetoothConnectPermission()</code> first, so tests must call <a href="grant-bluetooth-connect-permission.html">grantBluetoothConnectPermission</a> or <code class="lang-kotlin">createBond()</code> throws <a href="https://developer.android.com/reference/kotlin/java/lang/SecurityException.html">SecurityException</a> instead of returning a value.</p></li></ul><p class="paragraph">Isolation note: because the device cache is static and survives across tests in the same JVM, give each test a distinct MAC so bond-state cannot bleed between tests.</p></div> </div>
</div>
<div class="tabbedcontent">
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="CONSTRUCTOR,TYPE,PROPERTY,FUNCTION">Members</button></div>
File diff suppressed because it is too large. Load diff
File diff suppressed because one or more lines are too long.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+203 -198
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
Binary file not shown.
@@ -11,11 +11,11 @@
The app uses **Navigation 3** with typed, serializable routes and centralized deep link resolution.
## Route Architecture
## Route architecture
All routes are defined in `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt`.
### Route Hierarchy
### Route hierarchy
```kotlin
interface Route : NavKey // All routes implement NavKey
@@ -39,11 +39,16 @@ sealed interface SettingsRoute : Route {
- Group related routes under a `sealed interface`
- Graph entry points implement both the route interface and `Graph`
## Deep Link Router
## Deep link router
`DeepLinkRouter` in `core/navigation` maps URI deep links to typed backstack lists.
`DeepLinkRouter` in `core/navigation` maps URI deep links to typed backstack lists. Each supported link is a
Navigation 3 `UriDeepLinkMatcher` pattern whose placeholders decode into the target route's fields, wrapped in
`withBackStack` to synthesize the parents.
### URI Format
Patterns are anchored, so a path the patterns don't model returns null rather than falling back to the family
root: `/firmware/anything-else` no longer opens the firmware screen.
### URI format
Both forms resolve through the same `DeepLinkRouter`, so any deep link path works with either scheme:
@@ -59,7 +64,7 @@ For the `https` form to open in-app, each top-level path segment must also be de
`android:pathPrefix` in the `android:autoVerify` intent-filter in `androidApp/src/main/AndroidManifest.xml` —
otherwise the link opens in the browser. Adding a new top-level route therefore takes three steps: add the
segment to `DeepLinkRouter.topLevelPathSegments` (the router refuses to dispatch segments outside that set),
add its `when` branch in `DeepLinkRouter.route()`, and add the matching `pathPrefix` to the manifest.
add its matcher to `DeepLinkRouter.matchers`, and add the matching `pathPrefix` to the manifest.
`DeepLinkManifestConsistencyTest` (androidApp unit tests) checks the manifest against the set, so a missing
manifest entry fails CI.
@@ -67,22 +72,22 @@ manifest entry fails CI.
- The always-current list of top-level segments is `topLevelPathSegments` in
[`DeepLinkRouter`](https://github.com/meshtastic/Meshtastic-Android/blob/main/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt).
- Sub-paths live in the `route()` `when` block plus its helper maps (`settingsSubRoutes`, `nodeDetailSubRoutes`).
- Sub-paths live in the `matchers` list plus its helper maps (`settingsSubRoutes`, `nodeDetailSubRoutes`).
- The class-level KDoc on the `DeepLinkRouter` object lists example mappings, but it's illustrative, not
exhaustive.
- The executable spec is
[`DeepLinkRouterTest.kt`](https://github.com/meshtastic/Meshtastic-Android/blob/main/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt).
- The following table is a snapshot for quick reference — check those two files if it looks out of date.
### Supported Deep Links
### Supported deep links
URI Path | Route | Notes |
----------|-------|-------|
`/connections` | `ConnectionsRoute.Connections(null)` | Connections screen |
`/connections?address={prefixedAddress}` | `ConnectionsRoute.Connections(address)` | Auto-connects to a radio without manual selection — the address uses the app's internal transport-prefixed format: `t192.168.1.1:4403` (TCP), `xAA:BB:CC:DD:EE:FF` (BLE), `s/dev/ttyUSB0` (serial). Intended for scripts/AI tooling driving the app. |
`/connections?address=n` | `ConnectionsRoute.Connections("n")` | Disconnects the current radio instead of connecting (`n` = the internal "no device selected" sentinel). |
`/connections?address={prefixedAddress}` | `ConnectionsRoute.Connections(address)` | Auto-connects to a node without manual selection — the address uses the app's internal transport-prefixed format: `t192.168.1.1:4403` (TCP), `xAA:BB:CC:DD:EE:FF` (BLE), `s/dev/ttyUSB0` (serial). Intended for scripts/AI tooling driving the app. |
`/connections?address=n` | `ConnectionsRoute.Connections("n")` | Disconnects the current node instead of connecting (`n` = the internal "no device selected" sentinel). |
`/wifi-provision` | `WifiProvisionRoute.WifiProvision(null)` | Wi-Fi provisioning screen |
`/wifi-provision?address={mac}` | `WifiProvisionRoute.WifiProvision(mac)` | Provisioning targeting a specific radio MAC |
`/wifi-provision?address={mac}` | `WifiProvisionRoute.WifiProvision(mac)` | Provisioning targeting a specific node MAC |
`/settings` | `SettingsRoute.Settings(null)` | Settings root |
`/settings/helpDocs` | `SettingsRoute.HelpDocs` | Docs browser |
`/settings/helpDocs/{pageId}` | `SettingsRoute.HelpDocPage(pageId)` | Specific doc page |
@@ -102,7 +107,7 @@ manifest entry fails CI.
`/firmware` | `FirmwareRoute.FirmwareGraph` | Firmware screen |
`/firmware/update` | `FirmwareRoute.FirmwareUpdate` | Firmware update flow |
### Backstack Synthesis
### Backstack synthesis
Deep links synthesize a full backstack, not just the target screen:
@@ -117,15 +122,16 @@ listOf(
This ensures the user can navigate "up" correctly.
## Adding a Deep Link
## Adding a deep link
1. Define the typed route in `Routes.kt`.
2. Add the mapping in `DeepLinkRouter.settingsSubRoutes` (or equivalent for other graphs).
2. Add the mapping in `DeepLinkRouter.settingsSubRoutes` (or equivalent for other graphs), and a matcher in
`DeepLinkRouter.matchers` if the path shape is new.
3. Add a test in `DeepLinkRouterTest.kt`.
4. Register the navigation entry in the appropriate feature module.
5. Update the illustrative KDoc list on the `DeepLinkRouter` object (the class-level doc comment, not `route()`'s own KDoc) and the preceding table — both are quick-reference snapshots, not the source of truth. See the Source of Truth list earlier in this page for the authoritative places.
## Navigation Entry Registration
## Navigation entry registration
Each feature module provides entries via an extension function:
Binary file not shown.
+36 -36
View File
@@ -13,18 +13,18 @@ Discovery tools help you understand **how** your mesh network is connected — w
The app offers two complementary approaches:
- **Local Mesh Discovery (Scanner)** — an automated mode that cycles your connected radio through different LoRa presets, listens on each, and ranks which preset performs best at your location.
- **Local Mesh Discovery (Scanner)** — an automated mode that cycles your connected node through different LoRa presets, listens on each, and ranks which preset performs best at your location.
- **Manual exploration** — traceroute, Neighbor Info, and the node list, which you can use at any time to investigate specific paths and topology.
## Local Mesh Discovery (Scanner)
Local Mesh Discovery is a dedicated scanning mode that helps you find the best LoRa modem preset for your location and see which nodes are active on each preset. It cycles your connected radio through one or more presets you choose, dwells on each one — listens for a set time — to collect packets, then analyzes and ranks the results.
Local Mesh Discovery is a dedicated scanning mode that helps you find the best LoRa modem preset for your location and see which nodes are active on each preset. It cycles your connected node through one or more presets you choose, dwells on each one — listens for a set time — to collect packets, then analyzes and ranks the results.
Connect your radio, then open **Settings → Advanced → Local Mesh Discovery**. On Android the **Advanced** section stays grayed out until a radio is connected and the app has finished reading its configuration, and every entry in it is disabled on a managed device. On desktop, Local Mesh Discovery has its own entry on the Settings screen, with no such gate.
Connect your node, then open **Settings → Advanced → Local Mesh Discovery**. On Android the **Advanced** section appears only for a locally connected node, never over remote admin, and stays grayed out until the app has finished reading the node's configuration. On a managed device its entries are disabled, except **Debug Panel**, which reads app-local logs and stays available. On desktop, Local Mesh Discovery has its own entry on the Settings screen, with no such gate.
&gt; ℹ️ **Note:** Discovery temporarily changes your radio's LoRa settings while it scans, then restores your original configuration when it finishes.
&gt; ℹ️ **Note:** Discovery temporarily changes your node's LoRa settings while it scans, then restores your original configuration when it finishes.
### Setting Up a Scan
### Setting up a scan
Before starting, configure these controls:
@@ -32,34 +32,34 @@ Before starting, configure these controls:
---------|-------------|
**LoRa preset picker** | Select one or more presets to scan. Discovery dwells on each selected preset in turn. |
**Dwell time** | Time to listen on each preset. Choose from 1, 5, 15, 30, 45, 60, 90, 120, or 180 minutes. Longer dwell times collect more packets and give a clearer picture, but take longer. |
**Keep screen awake** | Keeps the phone out of Android Doze mode, which would otherwise drop radio packets during a long scan. Recommended — a scan run with it off can under-count what the radio heard. |
**Keep screen awake** | Keeps the display on for the scan. The scan itself holds a CPU wake lock for its whole run and posts a **Scanning LoRa presets…** notification, so it keeps collecting with the screen off or the app in the background. |
The **Start Scan** button stays disabled — with an explanation of why — until the scan can run. Common reasons it's disabled:
- The radio is **not connected**.
- The node is **not connected**.
- **No presets** have been selected to scan.
- The selected preset uses **2.4 GHz**, which your hardware doesn't support.
### Live Progress
### Live progress
While a scan runs, Discovery shows its current stage:
Stage | What's happening |
-------|------------------|
**Preparing scan** | Saving your current configuration and getting ready to scan. |
**Shifting to \&lt;preset\&gt;** | Switching the radio to the next preset to test. |
**Shifting to \&lt;preset\&gt;** | Switching the node to the next preset to test. |
**Reconnecting on \&lt;preset\&gt;** | Re-establishing the connection after the preset change. |
**Dwelling on \&lt;preset\&gt;** | Listening on the current preset to collect packets, with a countdown to the next step. |
**Analyzing results** | Processing the collected packets and ranking the presets. |
**Restoring home preset** | Putting your original LoRa configuration back. |
**Cancelling scan** | You tapped **Stop Scan**; partial results are saved before the original preset is restored. |
**Scan failed: \&lt;reason\&gt;** | The scan could not continue — most often the radio did not come back within a minute of a preset change. The results collected so far are saved, and the original preset is restored automatically. |
**Scan failed: \&lt;reason\&gt;** | The scan could not continue — most often the node didn't come back within a minute of a preset change. The results collected so far are saved, and the original preset is restored automatically. |
![Dwell countdown showing time remaining on the current preset](../../assets/screenshots/discovery_dwell_progress.png)
If a scan is interrupted — the app is closed, or the radio goes away — the app restores your original preset the next time it reconnects to that radio, and tells you it has done so. Reconnect the same radio to let that happen; until you do, the radio stays on whichever preset the scan left it on.
If a scan is interrupted — the app is closed, or the node goes away — the app restores your original preset the next time it reconnects to that node, and tells you it has done so. Reconnect the same node to let that happen; until you do, the node stays on whichever preset the scan left it on.
### Reading the Results
### Reading the results
When the scan completes, Discovery presents a per-preset result card for each preset it tested, plus an overall summary.
@@ -87,28 +87,28 @@ Additional features available from the results:
Mesh Beacon lets nodes invite others to join their mesh. A beaconing node periodically broadcasts an invitation — optionally advertising a channel, region, and modem preset — that nearby nodes can hear even before they share a configuration.
Configure it under **Settings → Module configuration → Mesh Beacon**. The entry appears only on radios running firmware 2.8.0 or newer. A read-only **Region** row at the top of the screen shows the region the beacon advertises: that region, and the preset, are always the ones the radio itself uses, so a beacon cannot invite anyone onto settings your radio is not running.
Configure it under **Settings → Module configuration → Mesh Beacon**. The entry appears only on nodes running firmware 2.8.0 or newer. A read-only **Region** row at the top of the screen shows the region the beacon advertises: that region, and the preset, are always the ones the node itself uses, so a beacon can't invite anyone onto settings your node isn't running.
- **Listen for beacons** — receive invitations broadcast by other nodes.
- **Broadcast a beacon** — periodically advertise this mesh to nearby nodes, with an optional **Beacon message** of up to 100 bytes, a **Broadcast interval** picked from fixed intervals between 1 hour and 72 hours, and an **Offered channel** chosen from your radio's own channels. The offered channel is required, and defaults to your primary channel. Over remote admin the picker offers the primary channel only.
- **Broadcast targets** — optional extra destinations beyond the offered channel. **Add target** appends a row; each row picks a **Channel** and a **Transmit preset**, and **Remove target** deletes it. With no targets, the beacon goes out on the offered channel alone.
- **Broadcast a beacon** — periodically advertise this mesh to nearby nodes, with an optional **Beacon message** of up to 100 bytes, a **Broadcast interval** picked from fixed intervals between 1 hour and 72 hours, and an **Offered channel** chosen from your node's own channels. The offered channel is required, and defaults to your primary channel. Over remote admin the picker offers the primary channel only.
- **Broadcast targets** — where the beacon actually transmits. The list always holds at least one row: the first is the beacon's own transmission, not an extra. Each row picks a **Channel** and a **Transmit preset**. **Add target** appends a row, and **Remove target** deletes one — removing the last row replaces it with a fresh default rather than emptying the list.
Two conditions block beacon setup:
- **The radio has no region set.** The screen shows nothing but *Set your radio's region before setting up a beacon.* Set the region on **Settings → LoRa** first.
- **The radio uses custom LoRa settings.** A beacon advertises a modem preset for others to join, so a radio with **Use Preset** turned off has no standard preset to offer. In that state **Broadcast a beacon** can be turned off but not on, and the broadcast settings are read-only. Listening for beacons is unaffected.
- **The node has no region set.** The screen shows nothing but *Set your node's region before setting up a beacon.* Set the region on **Settings → LoRa** first.
- **The node uses custom LoRa settings.** A beacon advertises a modem preset for others to join, so a node with **Use Preset** turned off has no standard preset to offer. In that state **Broadcast a beacon** can be turned off but not on, and the broadcast settings are read-only. Listening for beacons is unaffected.
Received invitations appear as **Mesh invitations** cards on the Discovery screen. Each card shows the sender's message plus the offered channel, region, preset, and signal quality, with these actions:
- **Join** — switch to the offered channel and preset (retunes the radio and reboots). When the offer matches your current frequency slot, an **Add channel** action adds it without a reboot.
- **Join** — switch to the offered channel and preset (retunes the node and reboots). When the offer matches your current frequency slot, an **Add channel** action adds it without a reboot.
- **Discover** — seed a Discovery scan with the offered preset so you can survey that mesh before joining (shown only when the beacon offers a preset).
- **Dismiss** — ignore the invitation.
Channels advertised by beacons also show up in the scan setup as **Beacon channels** — select one to include it as a scan target.
An invitation to a mesh your radio is already on is suppressed: no card, no notification, and no **Beacon channels** entry. A channel counts as one you already have only when both its name and its key match a channel on your radio — the same name with a different key is a different mesh, so that invitation still reaches you.
An invitation to a mesh your node is already on is suppressed: no card, no notification, and no **Beacon channels** entry. A channel counts as one you already have only when both its name and its key match a channel on your node — the same name with a different key is a different mesh, so that invitation still reaches you.
## Manual Exploration
## Manual exploration
The following tools are available at any time from the node list and node detail screens. Use them to investigate specific paths and build a topology picture, alongside or instead of a full scan.
@@ -121,7 +121,7 @@ Traceroute reveals the exact path a message takes from your node to any other no
1. Navigate to **Nodes** and tap the node you want to trace.
2. On the node detail screen, find **Traceroute** in the **Telemetry** section and tap its request button. Once a result arrives, a second button on the same row opens the traceroute log, where each hop is listed with its signal quality.
#### Reading the Results
#### Reading the results
A traceroute result looks like this:
@@ -135,12 +135,12 @@ Route traced toward destination:
■ Target Node (TGT1)
```
Each `⇊` line between two nodes is one relay hop, and the SNR on that line is the quality of that segment alone. The app colors it green at or above −7 dB, yellow at or above −15 dB, and orange below that. A request that also gets a reply adds a second block under **Route traced back to us:**.
Each `⇊` line between two nodes is one relay hop, and the SNR on that line is the quality of that segment alone. The app colors it against the demodulation floor of the preset in use, not a fixed number: green above the floor, yellow within 5.5 dB below it, orange within 7.5 dB, and red beyond that. The floor is −7.5 dB on Short Fast and improves 2.5 dB per spreading-factor step, so it is −17.5 dB on Long Fast — the same SNR reads differently on different presets. See [Signal Meter](signal-meter). A request that also gets a reply adds a second block under **Route traced back to us:**.
What to look for | What it means |
------------------|---------------|
All hops show Good SNR (≥ −7 dB, green) | Healthy path — messages flow reliably |
One hop shows a poor SNR (below −15 dB, orange) | Weak link — this relay segment is fragile |
All hops show Good SNR (green) | Healthy path — messages flow reliably |
One hop shows a poor SNR (orange or red) | Weak link — this relay segment is fragile |
Many hops (4+) | Long path — consider repositioning a node to shorten it |
Different path on retry | Mesh is adapting — multiple routes exist (this is good!) |
@@ -151,7 +151,7 @@ Each `⇊` line between two nodes is one relay hop, and the SNR on that line is
- **No Response** — The traceroute got nothing back. The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key.
- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa**.
- **Cannot show traceroute map because the start or destination node has no position information** — The path was traced, but one end has never shared a position.
- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric.
- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation isn't always symmetric.
### Neighbor Info
@@ -161,42 +161,42 @@ The Neighbor Info module lets each node broadcast a list of the nodes it can **d
1. Navigate to **Settings → Module configuration → Neighbor Info**.
2. Enable the module.
3. Set **Update interval (seconds)**. The default is 21600 seconds (6 hours), and the firmware minimum is 14400 seconds (4 hours) — a smaller value is rejected and reset to the default.
4. Turn on **Transmit over LoRa**. Without it, your neighbor list goes only to MQTT and to this app, never over the air. It is unavailable on a channel that still uses the default name and key, so set up your own channel first — see [Messages &amp; Channels](messages-and-channels).
3. Set **Update interval (seconds)**. The app accepts whatever you type; the firmware enforces its own minimum and resets a value below it.
4. Turn on **Transmit over LoRa**. Without it, your neighbor list goes only to MQTT and to this app, never over the air.
Once enabled and transmitting over LoRa, your node periodically broadcasts its neighbor list. Other nodes with Neighbor Info enabled do the same.
#### Viewing Neighbor Data
#### Viewing neighbor data
- Open a node's detail screen and find **Neighbor Info** in the **Telemetry** section. The request button asks the node for its current neighbor list; once the app has received one, a second button on the same row opens the log of everything that node has reported. The row appears only on nodes that can answer a neighbor request, or that have already reported neighbors.
- Each neighbor entry shows the node that was directly heard and its signal quality.
- Combine neighbor data from multiple nodes to understand the full mesh topology.
&gt; ℹ️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. The firmware does not accept an interval shorter than 14400 seconds (4 hours) for this reason; on busy meshes, leave it at the 21600-second default or raise it further.
&gt; ℹ️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. The firmware doesn't accept an interval shorter than 14400 seconds (4 hours) for this reason; on busy meshes, leave it at the 21600-second default or raise it further.
### Node List as a Discovery Tool
### Node list as a discovery tool
The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively.
#### Finding New Nodes
#### Finding new nodes
- Sort by **Last heard** to see the most recently active nodes at the top.
- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on radios.
- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on nodes.
#### Assessing Connectivity
#### Assessing connectivity
- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed.
- Sort by **Distance** to find nearby nodes and verify they're reachable.
- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge).
- Use **Exclude MQTT** to focus on nodes reachable over LoRa (not via internet bridge).
#### Infrastructure Audit
#### Infrastructure audit
- Disable **Exclude infrastructure** to see Router, Router Late, and Client Base nodes.
- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy.
See [Nodes](nodes) for full details on filtering and sorting options.
## Tips for Mesh Exploration
## Tips for Mesh exploration
- **Start with traceroute** — it gives you immediate, actionable information about a specific path.
- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone.
+58 -36
View File
@@ -11,31 +11,35 @@
The Nodes screen lists every node visible on your mesh.
## Node List
## Node list
The node list shows every node your radio has heard, including:
The node list shows every node your node has heard, including:
- **Node name** — user-configured long name
- **Short name** — 4-character identifier
- **Signal quality** — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
- **Signal quality** — SNR, RSSI, and a quality word, shown only for nodes your node heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
- **Last heard** — time since last communication
- **Distance** — estimated distance (if positions are shared)
- **Battery** — remote node battery level (if telemetry is enabled)
### Choosing What the List Shows
### Choosing what the list shows
The list has two densities, set at **Settings → Node Layout**. **Complete** shows every field a node has reported and hides the ones it hasn't. **Compact** fits more nodes on screen and lets you pick the fields yourself — **Power**, **Last Heard Time**, **Relative Last Heard Time**, **Distance and Bearing**, **Hops Away**, **Signal (Direct Only)**, **Channel**, and **Device &amp; Role**. The **Environment Metrics** toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
### Node Status Indicators
### Node Status indicators
Indicator | Meaning |
-------|---------|
Green last-heard time | Node heard within the last 2 hours |
Plain last-heard time | Node not heard for over 2 hours |
Orange last-heard time with a crossed-out signal icon | Not heard since your node's LoRa settings changed, so it can't be reached from here |
Struck-through name | Node you have ignored |
⭐ Favorite | Node you marked as a favorite. |
There is no separate "away" tier.
There is no separate "away" tier, but the orange unreachable state takes precedence over the
green one: a node can be online and still be unreachable on your current settings. Nodes known
only over MQTT are never shown as unreachable.
### Node Roles
### Node roles
Nodes can be configured with different roles that affect their mesh behavior:
@@ -53,18 +57,18 @@ Nodes can be configured with different roles that affect their mesh behavior:
Sensor | Optimized for telemetry reporting |
TAK | Interoperates with TAK systems (sends/receives CoT) |
TAK Tracker | TAK position reporting only |
Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio |
Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost node |
### Choosing a Role
### Choosing a role
Most users should keep the default **Client** role. Consider a different role when:
- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld radios.
- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld nodes.
- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers.
- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client.
- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only radios or to reduce congestion in dense areas.
- **Tracker** — An unattended radio whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
- **Sensor** — An unattended radio reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only nodes or to reduce congestion in dense areas.
- **Tracker** — An unattended node whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery.
- **Sensor** — An unattended node reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker.
- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details.
&gt; 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Client Mute nodes reduce mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area.
@@ -76,16 +80,16 @@ Each node carries one security icon beside its name in the node list. Tap it to
Icon | Meaning | Shown for |
------|---------|-----------|
Person with a shield check (green) | **Verified contact** — you verified this node's key in person by exchanging contact QR codes, so its identity is confirmed. The strongest trust the list shows. Your own connected node carries it too | Any firmware version |
Nodes icon with a shield check (green) | **Signed node** — this node signs its broadcasts with its identity key, so its identity is consistent over time, but you have not verified it in person. On firmware 2.8 the icon appears from the version alone, before any signed broadcast has been heard | Firmware 2.8 or newer, and any node whose signed broadcast your node has verified |
Nodes icon with a shield check (green) | **Signed node** — this node signs its broadcasts with its identity key, so its identity is consistent over time, but you haven't verified it in person. On firmware 2.8 the icon appears from the version alone, before any signed broadcast has been heard | Firmware 2.8 or newer, and any node whose signed broadcast your node has verified |
🔒 Closed lock | A public key is on file and matches, so direct messages to this node are encrypted | Firmware before 2.8, or no reported version |
🔓 Open lock | No public key has been received for this node, so it cannot be direct messaged — use **Request User Info** on the node detail page to ask for one | Firmware before 2.8, or no reported version |
🔓 Open lock | No public key has been received for this node, so it can't be direct messaged — use **Request User Info** on the node detail page to ask for one | Firmware before 2.8, or no reported version |
⚠️ Mismatch | **Public key mismatch** — a different key arrived for this node after one was stored. Investigate before trusting | Any firmware version |
Every node on firmware 2.8 or newer signs its broadcasts, so on that firmware the signed state is the baseline and the locks are not shown.
Every node on firmware 2.8 or newer signs its broadcasts, so on that firmware the signed state is the baseline and the locks aren't shown.
Direct messages always use public-key encryption, so your node needs the other node's public key before it can send one. It refuses the send rather than falling back to channel encryption. Keys arrive inside node info, which is why an open lock usually clears itself once that node is heard from properly.
A mismatch never replaces the key you already hold. The app keeps the first key it recorded and refuses the new one, as the firmware does, so a stray or hostile node info cannot silently break encrypted messaging to a contact. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch &amp; hold the node, choose **Remove**, and let the two nodes exchange keys again the next time yours hears it.
A mismatch never replaces the key you already hold. The app keeps the first key it recorded and refuses the new one, as the firmware does, so a stray or hostile node info can't silently break encrypted messaging to a contact. To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch &amp; hold the node, choose **Remove**, and let the two nodes exchange keys again the next time yours hears it.
## Quick Actions
@@ -101,10 +105,10 @@ From the node list, you can:
Touch &amp; hold **your own node** instead and you get one action, **Update status**, which opens the
User settings screen with the cursor already in the Status Message field. It only appears while the
radio is connected and running firmware 2.8 or newer — see
node is connected and running firmware 2.8 or newer — see
[Settings — Radio &amp; User](settings-radio-user.md) for the field itself.
## Sharing a Contact
## Sharing a contact
On a node's detail screen, tap **Share Contact** to produce a link and a QR code for that node. From the same dialog, **Share link** opens the Android share sheet (on desktop it copies the link instead), **Write to NFC tag** saves it to a writable NFC tag, and **Copy** puts it on the clipboard. While that dialog is open and in front of you, the phone also offers the same link to any NFC reader, so someone can take the contact by tapping their phone against yours with no tag involved.
@@ -112,26 +116,44 @@ Sharing your own contact this way marks it as verified in person, so whoever imp
To add someone else's contact, use the import button on the node list and choose **Scan Shared Contact QR Code**, **Scan Shared Contact NFC**, or **Input Shared Contact URL**. The app asks you to confirm with **Import Shared Contact?**, and warns you when the contact is one you already have.
## Filtering &amp; Sorting
## Filtering &amp; sorting
### Text Search
### Text search
Type in the search field to filter nodes by name or short name. The filter updates in real time as you type.
### Filter Toggles
### Filter toggles
Filter | Description |
--------|-------------|
**Hide offline nodes** | Show only nodes heard within the last 2 hours |
**Only show direct nodes** | Show only nodes your radio heard directly, with no relay in between |
**Include unknown** | Show nodes that haven't sent user info yet. **On by default**, so a node heard before its info arrives stays visible; these carry a badge marking them incomplete, and cannot be direct messaged until their user info brings a public key |
**Exclude infrastructure** | Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role |
**Only show direct nodes** | Show only nodes your node heard directly, with no relay in between |
**Include unknown** | Show nodes that haven't sent user info yet. **On by default**, so a node heard before its info arrives stays visible; these carry a badge marking them incomplete, and can't be direct messaged until their user info brings a public key |
**Exclude infrastructure** | Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that can't be messaged, whatever its role |
**Exclude MQTT** | Hide nodes heard only via MQTT internet bridge |
**Signed only** | Show only nodes whose signed broadcasts your node has actually heard and verified. Stricter than the icon: a node on 2.8 shows as signed by its firmware version before any signed broadcast arrives, and a contact verified in person on older firmware is not signed at all |
**Hide unheard nodes** | Hide nodes your own node hasn't heard since its LoRa settings changed. Off by default, and it does nothing on firmware that doesn't report whether a node was heard on the current settings |
**Signed only** | Show only nodes whose signed broadcasts your node has actually heard and verified. Stricter than the icon: a node on 2.8 shows as signed by its firmware version before any signed broadcast arrives, and a contact verified in person on older firmware isn't signed at all |
**Encrypted only** | Show nodes with a matching public key on file, the key an encrypted direct message needs. A node with a key mismatch is excluded |
**Only show ignored Nodes** | Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back |
### Sort Options
### Nodes not heard on your current Settings
When your node's LoRa settings change — a different preset, region or frequency slot — nodes heard
under the old settings are still in the list but can no longer be reached. The app marks them with
an orange last-heard time and a crossed-out signal icon, and shows a banner at the top of the list:
**N nodes not heard on your current LoRa settings**.
The banner offers two actions:
- **Keep** dismisses the banner and leaves every node in place.
- **Remove** deletes those nodes from the list. Your favorites and your own node are never removed.
**Remove** is a bulk delete and there is no undo, so use **Keep** if you expect to switch back to
the old settings. Removed nodes reappear if your node hears them again.
The **Hide unheard nodes** filter does the same hiding without deleting anything.
### Sort options
Sort | Description |
------|-------------|
@@ -140,14 +162,14 @@ Type in the search field to filter nodes by name or short name. The filter updat
**Distance** | Nearest nodes first (requires position sharing) |
**Hops away** | Fewest relay hops first |
**Channel** | Grouped by channel index |
**via MQTT** | Grouped by MQTT vs. radio-heard |
**via MQTT** | Grouped by MQTT vs. node-heard |
**via Favorite** (default) | Favorited nodes first, then the rest |
## Nodes per Hop
## Nodes per hop
Tap the hop-histogram icon in the node list's app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a **last heard** window — All time, 1 hour, 8 hours, or 24 hours — to see how the mesh looks right now versus over a longer period. It's a quick way to gauge how busy and spread out your local mesh is.
Tap the hop-histogram icon in the node list's app bar to open a bar chart of how many nodes sit at each hop distance (0 = direct, 1 = one relay away, and so on). Filter the chart to a **last heard** window — **All**, **1 Hour**, **8 Hours** or **24H** — to see how the mesh looks right now versus over a longer period. It's a quick way to gauge how busy and spread out your local mesh is.
## Node Detail
## Node detail
Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry.
@@ -167,7 +189,7 @@ Inline status indicators show key metrics at a glance:
Last heard | ![Last heard](../../assets/screenshots/nodes_last_heard.png) |
Distance | ![Distance](../../assets/screenshots/nodes_distance_info.png) |
### Device Links ("I want one")
### Device links ("I want one")
When a node's hardware is recognized, the detail view shows a collapsible **"I want one"** section linking to places to buy or learn more about that device: the vendor's product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the `msh.to` redirect service. Devices with no matching links don't show the section.
@@ -175,12 +197,12 @@ A full, browsable directory of every link is also available at **Settings → De
Some of these are affiliate links. Both places say so above the links: product links may be affiliate links, and purchases may earn Meshtastic a commission.
## When No Nodes Appear
## When no nodes appear
The list stays empty until your radio hears another node.
The list stays empty until your node hears another node.
- **No device connected** — the app is not connected to a radio. See [Connections](connections).
- **Searching for nodes** — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave **Include unknown** on so a node that has not yet sent its name still appears. See [Settings — Radio &amp; User](settings-radio-user).
- **No device connected** — the app isn't connected to a node. See [Connections](connections).
- **Searching for nodes** — the node is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave **Include unknown** on so a node that hasn't yet sent its name still appears. See [Settings — Radio &amp; User](settings-radio-user).
- A node you expect is missing — check the filter toggles. **Only show direct nodes**, **Exclude MQTT**, and **Exclude infrastructure** each hide a whole category of node.
## Related Topics
+71 -45
View File
@@ -11,7 +11,7 @@
Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled.
&gt; 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. A module you expect can be missing for three reasons: your node's role does not enable it, your firmware is older than the release that added it, or the firmware build excludes it for this hardware.
&gt; 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. A module you expect can be missing for three reasons: your node's role doesn't enable it, your firmware is older than the release that added it, or the firmware build excludes it for this hardware.
Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders:
@@ -23,15 +23,15 @@ Module settings use a card-based layout with toggle switches, dropdowns, text fi
![A module settings card with its title and grouped controls](../../assets/screenshots/settings_titled_card.png)
## Module Configuration
## Module configuration
Every module lives under **Settings → Module configuration**.
&gt; ⚠️ **Important:** Saving a module screen restarts the radio — the button reads **Save &amp; restart**, and the radio is unreachable for a few seconds afterwards. External Notification and Mesh Beacon are the exceptions: their button reads **Save**, and the radio may still restart for some changes.
&gt; ⚠️ **Important:** Saving a module screen restarts the node — the button reads **Save &amp; restart**, and the node is unreachable for a few seconds afterwards. External Notification and Mesh Beacon are the exceptions: their button reads **Save**, and the node may still restart for some changes.
### MQTT Module
### MQTT module
Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems.
Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond LoRa range or integrate with home automation systems.
Setting | Description |
---------|-------------|
@@ -48,18 +48,18 @@ Bridges mesh messages to and from an MQTT broker for internet connectivity. This
Map reporting | Publish position to the public map — see the Map reporting group that follows |
Turning **Map reporting** on reveals a consent card headed *Consent to Share Unencrypted Node Data
via MQTT*, with an **I agree.** switch under it. The rest of the card does not exist on screen
via MQTT*, with an **I agree.** switch under it. The rest of the card doesn't exist on screen
until you agree:
Setting | Description |
---------|-------------|
I agree. | Explicit consent to transmit your node data, including an approximate position, unencrypted. Map reporting does not start without it |
I agree. | Explicit consent to transmit your node data, including an approximate position, unencrypted. Map reporting doesn't start without it |
Precision slider | The slider has no label of its own. It sets how coarsely your position is published, from 12 to 15; the line beneath reads *±* the resulting distance, in your own units |
Map reporting interval (seconds) | How often to report. A dropdown of fixed intervals from 1 hour to 72 hours — nothing shorter is offered |
See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup.
### Serial Module
### Serial module
Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh.
@@ -73,9 +73,9 @@ Enables serial port communication for external device integrations (GPS modules,
Timeout | How long to wait before considering an incoming message complete |
Override console serial port | Take over the port the debug console normally uses |
### External Notification Module
### External Notification module
Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations.
Controls buzzer, LED, or vibration alerts on your node hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations.
There are two independent triggers — an incoming **message**, and a received **bell** character —
and each can drive the LED, the buzzer and the vibration motor separately, giving six toggles.
@@ -95,7 +95,7 @@ and each can drive the LED, the buzzer and the vibration motor separately, givin
Nag timeout (seconds) | Keep repeating the alert for this long until it is acknowledged. 0 disables nagging |
Ringtone | The tone played on a PWM buzzer, in RTTTL. Can be imported from a file |
### Store &amp; Forward Module
### Store &amp; Forward module
Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections.
@@ -110,7 +110,7 @@ Buffers messages for nodes that were temporarily offline, then replays them when
&gt; 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on.
### Range Test Module
### Range Test module
&gt; ⚠️ **Warning:** Range Test only works on a secured primary channel. As long as your primary channel
&gt; still uses the default channel key, the interval and CSV controls stay disabled — you can still
@@ -123,9 +123,9 @@ Automated range testing tool for evaluating link quality between nodes. When ena
---------|-------------|
Range test enabled | Activate range testing |
Sender message interval (seconds) | Time between test transmissions, chosen from a dropdown of fixed intervals |
Save .CSV in storage (ESP32 only) | Log received test data to the radio's own filesystem. ESP32 hardware only |
Save .CSV in storage (ESP32 only) | Log received test data to the node's own filesystem. ESP32 hardware only |
### Telemetry Module
### Telemetry module
Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure).
@@ -139,7 +139,7 @@ battery health often and sensors rarely.
Environment metrics module enabled | Report the attached environment sensors |
Environment metrics update interval | How often to report them |
Environment metrics on-screen enabled | Also show these readings on the device's own display |
Environment metrics use Fahrenheit | Use °F on the device's display. This is the radio's screen only — the app follows your phone's locale, see [Units &amp; Locale](units-and-locale) |
Environment metrics use Fahrenheit | Use °F on the device's display. This is the node's screen only — the app follows your phone's locale, see [Units &amp; Locale](units-and-locale) |
Air quality metrics module enabled | Report particulate and CO₂ sensor data |
Air quality metrics update interval | How often to report them |
Power metrics module enabled | Report the per-channel voltage and current readings |
@@ -148,9 +148,9 @@ battery health often and sensors rarely.
See [Telemetry &amp; Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations.
### Canned Message Module
### Canned Message module
Pre-configured messages accessible from the radio's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use.
Pre-configured messages accessible from the node's physical buttons (for nodes with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use.
Setting | Description |
---------|-------------|
@@ -163,7 +163,7 @@ Pre-configured messages accessible from the radio's physical buttons (for radios
Up/Down/Select input enabled | A separate, simpler input scheme using up/down/select buttons rather than an encoder |
~~Allow input source~~ | ⚠️ **Deprecated** in the protobuf schema |
### Audio Module
### Audio module
Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec.
@@ -179,11 +179,11 @@ Codec2 audio support for low-bandwidth voice communication over the mesh. This i
&gt; ℹ️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality.
### Remote Hardware Module
### Remote Hardware module
GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance.
&gt; ⚠️ **Warning:** Turning on **Allow undefined pin access** gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Turn it on only on dedicated GPIO nodes.
&gt; ⚠️ **Warning:** Turning on **Allow undefined pin access** gives remote nodes access to all GPIO pins, which could interfere with the node's own hardware. Turn it on only on dedicated GPIO nodes.
Setting | Description |
---------|-------------|
@@ -191,7 +191,7 @@ GPIO control over the mesh network. Allows a remote node to read or write GPIO p
Allow undefined pin access | Allow access to any GPIO pin (security risk) |
Available pins | Up to 4 GPIO pins this node exposes for remote read/write |
### Neighbor Info Module
### Neighbor Info module
Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality.
@@ -203,7 +203,7 @@ Broadcasts information about directly heard neighbors, enabling mesh topology ma
See [Local Mesh Discovery](discovery) for how to use neighbor data for mesh topology exploration.
### Ambient Lighting Module
### Ambient Lighting module
Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects.
@@ -213,7 +213,7 @@ Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. C
Current | LED current limit (0–31) |
Red / Green / Blue | Individual color channel values (0–255) |
### Detection Sensor Module
### Detection Sensor module
Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh.
@@ -228,7 +228,7 @@ Turns your node into a motion or door sensor alert system. When a GPIO pin detec
Send bell with alert message | Include bell character in alerts |
Friendly name | Custom name for this sensor |
### Paxcounter Module
### Paxcounter module
People counter using Wi-Fi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices.
@@ -236,26 +236,26 @@ People counter using Wi-Fi and BLE probe requests. Counts nearby devices by pass
---------|-------------|
Paxcounter enabled | Activate people counting |
Update interval (seconds) | How often to report counts |
Wi-Fi RSSI threshold | Ignore Wi-Fi probes weaker than this, so distant devices are not counted (defaults to −80 dBm) |
Wi-Fi RSSI threshold | Ignore Wi-Fi probes weaker than this, so distant devices aren't counted (defaults to −80 dBm) |
BLE RSSI threshold | The same cut-off for BLE advertisements (defaults to −80 dBm) |
&gt; 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices.
### Status Message Module
### Status Message module
The status message has no module screen. It is edited with the rest of the node's identity, on
[Settings — Radio &amp; User](settings-radio-user#user-profile).
### Mesh Beacon Module
### Mesh Beacon module
Broadcasts an invitation to your mesh, and receives invitations from others. The entry appears only
on radios running firmware 2.8.0 or newer. See [Local Mesh Discovery](discovery) for the full
on nodes running firmware 2.8.0 or newer. See [Local Mesh Discovery](discovery) for the full
walkthrough.
### TAK Module
### TAK module
Team Awareness Kit integration for interoperability with ATAK and WinTAK. Two things have to be
true before the entry appears in the module list: the radio runs firmware 2.8.0 or newer, and its
true before the entry appears in the module list: the node runs firmware 2.8.0 or newer, and its
**Device Role** on **Settings → Device configuration → Device** is set to `TAK` or `TAK_TRACKER`.
See [TAK Integration](tak) for detailed setup and usage.
@@ -278,30 +278,30 @@ Remotely configure nodes that share your admin key:
Action | What it does |
---|---|
Set time | Sends your phone's clock to the radio |
Reboot | Restarts the radio |
Shutdown | Powers the radio down |
Set time | Sends your phone's clock to the node |
Reboot | Restarts the node |
Shutdown | Powers the node down |
Factory reset | Returns every setting to its factory default |
NodeDB reset | Clears the radio's node database. This dialog carries a **Preserve Favorites?** switch |
NodeDB reset | Clears the node database. This dialog carries a **Preserve Favorites?** switch |
&gt; ⚠️ **Warning:** Factory reset erases all settings, channels, and keys, and cannot be undone. Before you reset, use **Export configuration** to save the radio's settings and **Backup Keys** on the Security screen to save its keys, so you can put both back afterwards.
&gt; ⚠️ **Warning:** Factory reset erases all settings, channels, and keys, and cannot be undone. Before you reset, use **Export configuration** to save the node's settings and **Backup Keys** on the Security screen to save its keys, so you can put both back afterwards.
### Backup &amp; Restore
**Settings → Backup &amp; Restore** writes the connected radio's whole configuration to a file with
**Settings → Backup &amp; Restore** writes the connected node's whole configuration to a file with
**Export configuration**, and reads a saved file back in with **Import configuration**. Export
before a factory reset, or to copy one radio's setup onto another. The section is shown for your
own radio only, not over remote admin.
before a factory reset, or to copy one node's setup onto another. The section is shown for your
own node only, not over remote admin.
### Advanced
**Settings → Advanced** collects the tools that read or rewrite local state, and is likewise shown
for your own radio only: **Firmware Update** on OTA-capable hardware, **Clean Node Database**,
for your own node only: **Firmware Update** on OTA-capable hardware, **Clean Node Database**,
**TAK Server**, **Local Mesh Discovery**, and the **Debug Panel**.
#### Clean Node Database
Prunes nodes from your node database — from the app's copy *and* from the radio's own, so this is
Prunes nodes from your node database — from the app's copy *and* from the node's own, so this is
not a display-only cleanup. The two filters combine rather than acting separately; the screen puts
it as *Selections are additive*.
@@ -311,7 +311,7 @@ it as *Selections are additive*.
info. The age limit still applies on top of it.
The screen lists the nodes queued for deletion as you move the filters. **Clean Now** carries the
purge out, after one more confirmation, and it cannot be undone. Favorited nodes, ignored nodes,
purge out, after one more confirmation, and it can't be undone. Favorited nodes, ignored nodes,
and nodes with a public key heard in the last seven days are never removed, whatever the filters
say — that is why the queued list can be shorter than you expect.
@@ -321,12 +321,38 @@ Opens the **Packets** and **App logs** tabs for viewing, filtering, and exportin
### App Settings
Two easy-to-miss entries on the **Settings** screen configure the app rather than the radio, and
appear only when your own node is selected:
The **App Settings** block on the **Settings** screen configures the app rather than the node, and
appears only when your own node is selected. It is grouped rather than flat:
**Privacy**
- **Allow analytics and crash reporting** — opt in or out of diagnostics.
- **Provide phone location to mesh** — share this phone's position when the node has no GPS fix.
- **Homoglyph encoding** — how look-alike characters in names are handled.
**Appearance**
- **Units** — metric, imperial, or follow the system. This is the entry
[Units &amp; Locale](units-and-locale) sends you to.
- **Theme** and **Language**.
- **Show full message timestamps**.
**Persistence**
- A cache limit for how much history is kept.
- **Export rangetest packets**, **Export all packets** and **Export node database**.
**On their own**
- **Node Layout** — how much detail each row of the node list shows.
- **Wi-Fi Provisioning for mPWRD-OS** — see [Connections](connections).
- **Message Filter** — hides incoming messages that contain words you list. With no words
configured it does nothing.
- **System AI** — appears only where app functions are available; see
[App Functions](app-functions).
A **Permissions** block sits above App Settings, so a user who skipped a permission during
onboarding can get back to it, and **App Info** sits below.
### About
@@ -349,7 +375,7 @@ may redistribute under the same license.
Reached from **About**, this lists every open-source library the app ships, with its license,
generated at build time by AboutLibraries. It was previously called the license screen.
### Troubleshooting Remote Admin
### Troubleshooting remote admin
- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes.
- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving.
@@ -357,7 +383,7 @@ generated at build time by AboutLibraries. It was previously called the license
## Related Topics
- [Settings — Radio &amp; User](settings-radio-user) — core radio and user profile settings
- [Settings — Radio &amp; User](settings-radio-user) — core node and user profile settings
- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org
- [FAQ](https://meshtastic.org/docs/faq/) — common questions on meshtastic.org
</pre>
+45 -44
View File
@@ -9,14 +9,14 @@
<body data-page="settings-radio-user" data-locale="en">
<pre class="markdown-content"># Settings — Radio &amp; User
Configure your radio's user identity, region and LoRa parameters, position and power behavior, network and Bluetooth connectivity, and security settings.
Configure your node's user identity, region and LoRa parameters, position and power behavior, network and Bluetooth connectivity, and security settings.
## How These Screens Work
## How these screens work
Everything here is on the **Settings** screen. **User**, **LoRa**, **Channels** and **Security** are
listed there directly. **Device**, **Position**, **Power**, **Network**, **Display** and
**Bluetooth** are one level down, under **Settings → Device configuration**. **Network** appears
only on radios with Wi-Fi or Ethernet, and **Bluetooth** only on radios with Bluetooth.
only on nodes with Wi-Fi or Ethernet, and **Bluetooth** only on nodes with Bluetooth.
Settings use standard preference controls — dropdowns, toggles, and sliders:
@@ -36,16 +36,16 @@ On **Settings → User**.
---------|-------------|
Long Name | Your display name (up to 39 characters) |
Short Name | 4-character abbreviated name |
Status Message | A short, public free-text status other nodes display alongside your node — up to 80 bytes, cleared with the **✕** in the field. The radio broadcasts it to the mesh when you change it and again every 12 hours. Needs firmware 2.8 or newer, and is absent otherwise |
Status Message | A short, public free-text status other nodes display alongside your node — up to 80 bytes, cleared with the **✕** in the field. The node broadcasts it to the mesh when you change it and again every 12 hours. Needs firmware 2.8 or newer, and is absent otherwise |
Unmessageable | Marks the node as one nobody should try to message — for an unmonitored or infrastructure node. Other clients hide it from the contact list. Needs supporting firmware |
Licensed amateur radio (Ham) | Enable if you hold an amateur radio license (permits higher power). Turning it on is staged behind a confirmation dialog. On your own radio it then relabels **Long Name** as **Call sign** and adds a separate Long Name field; over remote admin the field stays **Long Name** |
Licensed amateur node (Ham) | Enable if you hold an amateur node license (permits higher power). Turning it on is staged behind a confirmation dialog. On your own node it then relabels **Long Name** as **Call sign** and adds a separate Long Name field; over remote admin the field stays **Long Name** |
### Applying Changes
### Applying changes
The footer appears as soon as you change something. **Discard** throws the change away, and the other button writes it to the radio: it reads **Save &amp; restart** on the screens the firmware applies with a reboot — Position, Network, Bluetooth, Security, and most module screens — and **Save** everywhere else.
The footer appears as soon as you change something. **Discard** throws the change away, and the other button writes it to the node: it reads **Save &amp; restart** on the screens the firmware applies with a reboot — Position, Network, Bluetooth, Security, and most module screens — and **Save** everywhere else.
The status message is saved with the same **Save**, but it never reboots the node — and, like the
rest of this screen, it can be edited on a remote node you administer. For your own radio there is a
rest of this screen, it can be edited on a remote node you administer. For your own node there is a
shortcut while it is connected: touch &amp; hold your node in the [node list](nodes.md) and choose
**Update status**. Older firmware and a disconnected node have no shortcut — the field itself is
still the way in.
@@ -62,7 +62,7 @@ On **Settings → Device configuration → Device**.
Rebroadcast Mode | How the node retransmits messages. As with the role, the picker lists the firmware names and describes only the selected one | `ALL` |
Node Info Broadcast Interval | How often the node re-announces itself. A dropdown of fixed intervals — Unset, then 3 to 72 hours — not a value you type in seconds | 3 hours |
Double Tap as Button | Treat a double tap as a button press | Disabled |
Triple Click Ad Hoc Ping | Send an ad-hoc position ping on a triple click | Disabled |
Triple Click Ad Hoc Ping | Send an ad-hoc position ping on a triple click | Enabled |
LED Heartbeat | Blink the status LED periodically | Enabled |
Time Zone | POSIX time-zone string for the device clock, with buttons to copy your phone's zone or clear it | — |
Button / Buzzer GPIO | Advanced: which pins the button and buzzer are wired to | — |
@@ -77,11 +77,11 @@ On **Settings → LoRa**.
Presets | Speed/range tradeoff | LongFast |
Number of Hops | Maximum retransmit hops | 3 |
Transmit Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) |
Frequency Override | Overrides the computed operating frequency outright (MHz). It does not offset the calculated value — leave at 0 unless you know you need a specific frequency | 0 (use calculated) |
Frequency Override | Overrides the computed operating frequency outright (MHz). It doesn't offset the calculated value — leave at 0 unless you know you need a specific frequency | 0 (use calculated) |
Use Preset | On by default. Turn it off to set Spread Factor, Coding Rate and Bandwidth by hand instead of taking them from the modem preset | On |
Spread Factor | Manual mode only: 5–12. Higher spreads further but slower. On SX127x (RF95) radios the firmware does not accept 5 or 6 and uses 11 instead | From preset |
Spread Factor | Manual mode only: 5–12. Higher spreads further but slower. On SX127x (RF95) radios the firmware doesn't accept 5 or 6 and uses 11 instead | From preset |
Coding Rate | Manual mode only: 5–8. More redundancy costs airtime | From preset |
Bandwidth | Manual mode only: the channel bandwidth in kHz, typed in directly. On the 2.4 GHz region the app offers a list of the bandwidths your radio supports instead, and a stored value that is not on that list shows as *Unsupported* and blocks saving until you pick a supported one | From preset |
Bandwidth | Manual mode only: the channel bandwidth in kHz, typed in directly. On the 2.4 GHz region the app offers a list of the bandwidths your node supports instead, and a stored value that isn't on that list shows as *Unsupported* and blocks saving until you pick a supported one | From preset |
Frequency Slot | Which slot within the region's band to use. 0 derives it from the primary channel name | 0 (automatic) |
Transmit Enabled | Turning this off makes the node receive-only | On |
Override Duty Cycle | Ignores the region's duty-cycle limit. Illegal in most regions; turn it on only where your license permits | Off |
@@ -90,13 +90,19 @@ On **Settings → LoRa**.
RX Boosted Gain | Extra receive gain on SX126x radios; costs a little current | Off |
PA fan disabled | Turn off the power-amplifier fan on hardware that has one | Off |
Some regions are amateur-radio allocations whose presets only licensed operators may use. On firmware 2.8 or newer the app knows which regions those are and grays the whole **Presets** list out until **Licensed amateur radio (Ham)** is turned on for the node you are configuring; the text under the field says so while it is grayed out.
The preset list is also filtered to what your region legally permits, so a preset allowed in one
region doesn't appear in another. Changing region can therefore leave your current preset
illegal — the app repairs it for you, switching to the region's own default rather than leaving an
unusable setting in place. The region list itself is filtered by what your firmware supports, so
the newer regions appear only on 2.8 or later, alongside whichever region the node already has set.
Some regions are amateur-node allocations whose presets only licensed operators may use. On firmware 2.8 or newer the app knows which regions those are and grays the whole **Presets** list out until **Licensed amateur node (Ham)** is turned on for the node you are configuring; the text under the field says so while it is grayed out.
&gt; ⚠️ **Important:** Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details.
### Modem Presets
### Modem presets
The Lite, Narrow, Medium Turbo, and Tiny presets need firmware 2.8 or newer — the app hides them on older radios.
The Lite, Narrow, Medium Turbo, and Tiny presets need firmware 2.8 or newer — the app hides them on older nodes.
&gt; 💡 **Tip:** The **SNR Limit** values are negative on purpose. LoRa can decode signals *below* the noise floor, so a more-negative limit means the preset tolerates a weaker, noisier signal (more range). See [How the Signal Meter Works](signal-meter) for the full explanation.
@@ -116,13 +122,13 @@ The Lite, Narrow, Medium Turbo, and Tiny presets need firmware 2.8 or newer —
Narrow Slow | ~10 km | 1.30 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast |
Medium Turbo | ~5 km | 7.0 kbps | −12.5 dB | Like Medium Fast but with 500 kHz bandwidth; not legal in every region. Needs firmware 2.8 or newer |
Tiny Fast | ~10 km | 0.68 kbps | −7.5 dB | Amateur bands that cap occupied bandwidth; these presets use 15.6 kHz. Needs firmware 2.8 or newer, an SX126x or SX127x radio, and a TCXO of ±5 ppm or better |
Tiny Slow | ~20 km | 0.33 kbps | −10 dB | Same band restrictions as Tiny Fast, longer range. Same firmware, radio, and TCXO requirements |
Tiny Slow | ~20 km | 0.33 kbps | −10 dB | Same band restrictions as Tiny Fast, longer range. Same firmware, node, and TCXO requirements |
~~Long Slow~~ | ~30 km | 0.18 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release |
~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release |
&gt; ℹ️ **Note:** This table uses the common short names. The app's **Presets** dropdown lists the raw firmware names instead — `SHORT_FAST`, `LONG_FAST`, `LITE_FAST`, `NARROW_FAST`, and so on. Local Mesh Discovery shows the same presets as *Long Fast* and *Short Turbo*.
#### Choosing a Modem Preset
#### Choosing a modem preset
The modem preset controls the fundamental tradeoff between **range** and **data rate**:
@@ -137,38 +143,36 @@ The modem preset controls the fundamental tradeoff between **range** and **data
- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight.
- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area.
All nodes on the same channel must use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key.
All nodes on the same channel must use the same modem preset. Nodes with mismatched presets can't communicate even if they share the same frequency and encryption key.
The range estimates in the [Modem Presets](#modem-presets) table assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow.
### Display Config
On **Settings → Device configuration → Display**. These control the **radio's own screen**, not the app's.
On **Settings → Device configuration → Display**. These control the **node's own screen**, not the app's.
Setting | Description |
---------|-------------|
Screen on for | How long the display stays lit before sleeping |
Carousel interval | How often the radio cycles between screens on its own |
Carousel interval | How often the node cycles between screens on its own |
Display mode | Screen layout/density used by the firmware |
Display units | Metric or Imperial on the radio's screen |
Use 12h clock format | Show the radio's clock as 12-hour rather than 24-hour |
Display units | Metric or Imperial on the node's screen |
Use 12h clock format | Show the node's clock as 12-hour rather than 24-hour |
Bold Heading | Draw the screen's heading text in bold |
Flip screen | Rotate the display 180° for an inverted mounting |
OLED type | Auto, SSD1306, SH1106, SH1107 |
Wake on tap or motion | Light the screen when the radio is tapped or moved |
Compass orientation | Rotation offset for the compass rose (0°, 90°, 180°, 270°) |
OLED type | Six values, shown as the raw constants: `OLED_AUTO`, `OLED_SSD1306`, `OLED_SH1106`, `OLED_SH1107`, `OLED_SH1107_128_128`, `OLED_SH1107_ROTATED` |
Wake on tap or motion | Light the screen when the node is tapped or moved |
Compass orientation | Rotation offset for the compass rose. Eight values, shown as the raw constants `DEGREES_0` through `DEGREES_270` plus an `_INVERTED` variant of each |
Always point north | Locks the compass rose north-up instead of rotating it with your heading. Independent of Compass orientation — neither replaces the other |
### Position Config
On **Settings → Device configuration → Position**.
&gt; ⚠️ **Important:** Saving this screen always reboots the radio.
Setting | Description |
---------|-------------|
GPS Mode (Physical Hardware) | Three-state: GPS enabled, disabled, or not present. Not a simple on/off |
GPS Polling Interval | How often the radio asks its GPS for a fix |
GPS Polling Interval | How often the node asks its GPS for a fix |
Broadcast Interval | How often the position is shared with the mesh |
Smart Position | Broadcast based on movement rather than purely on the clock |
Smart Interval | With Smart Position on, the shortest gap between broadcasts |
@@ -183,10 +187,10 @@ On **Settings → Device configuration → Power**.
Setting | Description |
---------|-------------|
Enable power saving mode | Let the radio sleep aggressively between activity |
Enable power saving mode | Let the node sleep aggressively between activity |
Shutdown on power loss | Power the device down after external power disappears |
Super deep sleep duration | How long the deepest sleep state lasts |
Minimum wake time | The shortest time the radio stays awake once woken |
Minimum wake time | The shortest time the node stays awake once woken |
Wait for Bluetooth duration | How long to wait for a phone to connect before sleeping |
ADC multiplier override | Turn on a manual correction for battery-voltage readings |
ADC multiplier override ratio | The correction factor itself, used only when the override is on |
@@ -194,13 +198,13 @@ On **Settings → Device configuration → Power**.
### Network Config
On **Settings → Device configuration → Network**, on radios with Wi-Fi or Ethernet.
On **Settings → Device configuration → Network**, on nodes with Wi-Fi or Ethernet.
&gt; ⚠️ **Warning:** Turning on **Wi-Fi enabled** or **Ethernet enabled** ends the Bluetooth connection between your phone and the radio. Reconnect over the network afterwards from the [Connections](connections) screen, or turn Wi-Fi off again from the radio's own screen or over USB. Saving this screen also always reboots the radio.
&gt; ⚠️ **Warning:** Turning on **Wi-Fi enabled** or **Ethernet enabled** ends the Bluetooth connection between your phone and the node. Reconnect over the network afterwards from the [Connections](connections) screen, or turn Wi-Fi off again from the node's own screen or over USB. Saving this screen also always reboots the node.
Setting | Description |
---------|-------------|
Wi-Fi enabled | Enable the Wi-Fi radio (ESP32 radios) |
Wi-Fi enabled | Enable the Wi-Fi node (ESP32 nodes) |
SSID | Network name to connect to. Appears only once **Wi-Fi enabled** is on, along with **Password**. **Scan Wi-Fi QR code** fills both from a standard Wi-Fi QR code; on Android, holding the phone against a Wi-Fi NFC tag while this screen is open fills them the same way, and the app offers to open system settings if NFC is turned off |
Password | Network password |
Ethernet enabled | Use a wired connection on hardware that has one |
@@ -214,9 +218,7 @@ On **Settings → Device configuration → Network**, on radios with Wi-Fi or Et
### Bluetooth Config
On **Settings → Device configuration → Bluetooth**, on radios with Bluetooth.
&gt; ⚠️ **Important:** Saving this screen always reboots the radio.
On **Settings → Device configuration → Bluetooth**, on nodes with Bluetooth.
Setting | Description |
---------|-------------|
@@ -228,18 +230,16 @@ On **Settings → Device configuration → Bluetooth**, on radios with Bluetooth
On **Settings → Security**. The screen is grouped into cards: **Packet authenticity**, **Direct Message Key** (your node's key pair), **Admin Keys**, **Logs**, and **Administration**.
&gt; ⚠️ **Important:** Saving this screen always reboots the radio.
Setting | Description |
---------|-------------|
Public Key | Your node's public key (read-only) |
Admin Key | Keys permitted to administer this node remotely — up to three |
Private Key | Your node's private key (handle securely). Shown redacted when you are viewing another node over remote admin — the firmware does not send it |
Private Key | Your node's private key (handle securely). Shown redacted when you are viewing another node over remote admin — the firmware doesn't send it |
Regenerate Private Key | Issues a new keypair for this node, behind a confirmation. Every peer that knew your old key must learn the new one |
~~Admin Channel Enabled~~ | ⚠️ Removed — now configured automatically when an admin key is set |
Serial console | Serial console over the Stream API |
Debug log API enabled | Output live debug logging over serial, and view and export position-redacted radio logs over Bluetooth |
Managed Mode | Restrict non-admin channel changes. Only selectable once an Admin Key is set |
Debug log API enabled | Output live debug logging over serial, and view and export position-redacted node logs over Bluetooth |
Managed Mode | Locks the whole Configuration list, not just channels — every setting on the node becomes read-only and only an admin can change anything. Only selectable once an Admin Key is set |
Backup Keys | Save an encrypted backup of the node's keys on this phone (Android only, and only for your own node) |
Restore Keys | Write the backed-up keys back to the node (available once a backup exists) |
Delete Key Backup | Remove the stored key backup from this phone |
@@ -248,11 +248,12 @@ On **Settings → Security**. The screen is grouped into cards: **Packet authent
#### Lockdown Mode
Lockdown encrypts the device's storage and requires a passphrase for each connection. It needs
supporting firmware; the row does not appear otherwise.
supporting firmware; the row doesn't appear otherwise.
Enabling it asks you to set and confirm a passphrase, and to acknowledge that **it locks the debug
(SWD) port on hardware that supports locking**. You can turn lockdown off again at any time with
the passphrase, and a full device erase restores the hardware regardless.
(SWD) port on hardware where the lockout takes effect**. That part isn't reversible from the app.
Turning lockdown off later decrypts your storage and reboots the device, but the port stays locked.
Reopening it takes a full chip erase with a debug probe, which destroys everything on the device.
Alongside the passphrase you set the limits that end a session automatically:
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
+1 -1
View File
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
+7 -7
View File
@@ -3,17 +3,17 @@
{"id":"connections","title":"Connections","section":"user","locale":"en","resourcePath":"docs/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "radio", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "provisioning", "for", "mpwrd", "after", "your", "first", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":9994},
{"id":"debug-logs","title":"Debug Logs","section":"user","locale":"en","resourcePath":"docs/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3119},
{"id":"desktop","title":"Desktop App","section":"user","locale":"en","resourcePath":"docs/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6647},
{"id":"discovery","title":"Local Mesh Discovery","section":"user","locale":"en","resourcePath":"docs/user/discovery.html","navOrder":12,"keywords":["local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "neighbor", "info", "node", "list", "tool", "tips", "for", "related", "topics"],"aliases":["discovery", "local-mesh-discovery", "mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":14722},
{"id":"discovery","title":"Local Mesh Discovery","section":"user","locale":"en","resourcePath":"docs/user/discovery.html","navOrder":12,"keywords":["local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "neighbor", "info", "node", "list", "tool", "tips", "for", "related", "topics"],"aliases":["discovery", "local-mesh-discovery", "mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":15026},
{"id":"firmware","title":"Firmware Updates","section":"user","locale":"en","resourcePath":"docs/user/firmware.html","navOrder":13,"keywords":["firmware", "updates", "checking", "for", "update", "methods", "ota", "over", "the", "air", "via", "bluetooth", "network", "connected", "esp32", "app", "usb", "factory", "erase", "and", "bootloader", "upgrade", "other", "flashing", "options", "version", "channels", "pre", "checklist", "post"],"aliases":["firmware", "update", "ota", "flash"],"charCount":9771},
{"id":"help-and-docs","title":"Help & In-App Docs","section":"user","locale":"en","resourcePath":"docs/user/help-and-docs.html","navOrder":21,"keywords":["help", "app", "docs", "browsing", "search", "chirpy", "the", "assistant", "related", "topics"],"aliases":["help", "docs-browser", "chirpy", "assistant"],"charCount":2306},
{"id":"map-and-waypoints","title":"Map & Waypoints","section":"user","locale":"en","resourcePath":"docs/user/map-and-waypoints.html","navOrder":6,"keywords":["map", "waypoints", "view", "node", "markers", "controls", "filtering", "the", "creating", "waypoint", "properties", "expiration", "geofences", "managing", "layers", "site", "planner", "position", "sharing", "enabling", "privacy", "considerations", "sources", "adding", "your", "own", "tile", "source", "offline", "terrain"],"aliases":["map", "waypoints", "gps", "location", "site-planner", "map-layers", "geojson", "kml"],"charCount":13670},
{"id":"messages-and-channels","title":"Messages & Channels","section":"user","locale":"en","resourcePath":"docs/user/messages-and-channels.html","navOrder":3,"keywords":["messages", "channels", "default", "channel", "security", "adding", "archived", "direct", "sending", "message", "managing", "the", "conversation", "list", "bubbles", "states", "delivery", "errors", "features", "quick", "chat", "searching", "text", "formatting", "mentions", "reactions", "replying", "day", "separators", "jump"],"aliases":["channels", "direct-messages", "messaging", "conversations"],"charCount":18137},
{"id":"mqtt","title":"MQTT","section":"user","locale":"en","resourcePath":"docs/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "connection", "status", "and", "test", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":9785},
{"id":"node-metrics","title":"Node Metrics","section":"user","locale":"en","resourcePath":"docs/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "viewing", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "position", "log", "neighbor", "info", "host", "pax", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9949},
{"id":"nodes","title":"Nodes","section":"user","locale":"en","resourcePath":"docs/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "choosing", "what", "the", "shows", "status", "indicators", "roles", "role", "security", "quick", "actions", "sharing", "contact", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":14010},
{"id":"nodes","title":"Nodes","section":"user","locale":"en","resourcePath":"docs/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "choosing", "what", "the", "shows", "status", "indicators", "roles", "role", "security", "quick", "actions", "sharing", "contact", "filtering", "sorting", "text", "search", "filter", "toggles", "not", "heard", "your", "current", "settings", "sort", "options", "per"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":15452},
{"id":"onboarding","title":"Getting Started","section":"user","locale":"en","resourcePath":"docs/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "related", "topics"],"aliases":["first-launch", "setup", "intro"],"charCount":7656},
{"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"en","resourcePath":"docs/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "status", "mesh", "beacon", "tak"],"aliases":["modules", "module-config", "administration"],"charCount":19969},
{"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"en","resourcePath":"docs/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "how", "these", "screens", "work", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":19700},
{"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"en","resourcePath":"docs/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "status", "mesh", "beacon", "tak"],"aliases":["modules", "module-config", "administration"],"charCount":20930},
{"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"en","resourcePath":"docs/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "how", "these", "screens", "work", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":20380},
{"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"en","resourcePath":"docs/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "rssi", "and", "snr", "decoding", "below", "noise", "floor", "rating", "quality", "diagnosing", "local", "interference", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":4745},
{"id":"tak","title":"TAK Integration","section":"user","locale":"en","resourcePath":"docs/user/tak.html","navOrder":10,"keywords":["tak", "integration", "overview", "setup", "prerequisites", "configuration", "local", "server", "roles", "cot", "cursor", "target", "format", "wire", "usage", "with", "atak", "troubleshooting", "security", "considerations", "related", "topics"],"aliases":["tak", "atak", "team-awareness-kit"],"charCount":7738},
{"id":"telemetry-and-sensors","title":"Telemetry and sensors","section":"user","locale":"en","resourcePath":"docs/user/telemetry-and-sensors.html","navOrder":999,"keywords":["telemetry", "and", "sensors", "device", "environment", "temperature", "humidity", "air", "quality", "soil", "light", "weather", "other", "readings", "power", "metrics", "configuring", "choosing", "interval", "viewing", "troubleshooting", "related", "topics"],"aliases":[],"charCount":8358},
@@ -25,11 +25,11 @@
{"id":"codebase","title":"Codebase","section":"developer","locale":"en","resourcePath":"docs/developer/codebase.html","navOrder":2,"keywords":["codebase", "repository", "structure", "namespacing", "convention", "build", "system", "gradle", "kotlin", "dsl", "plugins", "variants", "android", "key", "tasks", "compile", "check", "across", "all", "kmp", "targets", "run", "tests", "code", "quality", "desktop", "native", "installers", "for", "the"],"aliases":["repository-layout", "project-structure", "source-code"],"charCount":4885},
{"id":"contributing","title":"Contributing","section":"developer","locale":"en","resourcePath":"docs/developer/contributing.html","navOrder":8,"keywords":["contributing", "branch", "naming", "development", "workflow", "commit", "messages", "pull", "request", "checklist", "code", "style", "architecture", "rules", "verification", "getting", "help"],"aliases":["contributing", "pull-request", "branch-naming"],"charCount":3611},
{"id":"documentation-style","title":"Documentation Style","section":"developer","locale":"en","resourcePath":"docs/developer/documentation-style.html","navOrder":11,"keywords":["documentation", "style", "transition", "repository", "mechanics", "local", "forms", "prose", "rules", "section", "leaves", "open", "word", "list", "new", "page", "checklist", "related", "topics"],"aliases":["style", "style-guide", "docs-style", "writing"],"charCount":9218},
{"id":"measurement","title":"Measurement & Formatting","section":"developer","locale":"en","resourcePath":"docs/developer/measurement.html","navOrder":9,"keywords":["measurement", "formatting", "overview", "metricformatter", "api", "usage", "numberformatter", "unit", "conversion", "adding", "new", "type", "dateformatter", "design", "decisions", "related"],"aliases":["measurement", "metric-formatter", "number-formatter"],"charCount":8029},
{"id":"navigation-and-deep-links","title":"Navigation & Deep Links","section":"developer","locale":"en","resourcePath":"docs/developer/navigation-and-deep-links.html","navOrder":4,"keywords":["navigation", "deep", "links", "route", "architecture", "hierarchy", "conventions", "link", "router", "uri", "format", "supported", "backstack", "synthesis", "adding", "entry", "registration", "testing"],"aliases":["deeplinks", "navigation-3", "routes"],"charCount":7234},
{"id":"measurement","title":"Measurement & Formatting","section":"developer","locale":"en","resourcePath":"docs/developer/measurement.html","navOrder":9,"keywords":["measurement", "formatting", "overview", "metricformatter", "api", "usage", "numberformatter", "unit", "conversion", "adding", "new", "type", "dateformatter", "design", "decisions", "related"],"aliases":["measurement", "metric-formatter", "number-formatter"],"charCount":9004},
{"id":"navigation-and-deep-links","title":"Navigation & Deep Links","section":"developer","locale":"en","resourcePath":"docs/developer/navigation-and-deep-links.html","navOrder":4,"keywords":["navigation", "deep", "links", "route", "architecture", "hierarchy", "conventions", "link", "router", "uri", "format", "supported", "backstack", "synthesis", "adding", "entry", "registration", "testing"],"aliases":["deeplinks", "navigation-3", "routes"],"charCount":7650},
{"id":"persistence","title":"Persistence","section":"developer","locale":"en","resourcePath":"docs/developer/persistence.html","navOrder":6,"keywords":["persistence", "room", "kmp", "database", "key", "points", "what", "stored", "datastore", "preferences", "core", "prefs", "docs", "intentionally", "skip", "best", "practices"],"aliases":["room", "database", "datastore", "prefs"],"charCount":3670},
{"id":"test-builds","title":"Test Builds & Obtainium","section":"developer","locale":"en","resourcePath":"docs/developer/test-builds.html","navOrder":10,"keywords":["test", "builds", "obtainium", "which", "channels", "can", "reach", "one", "tap", "setup", "how", "many", "entries", "you", "have", "once", "manual", "stable", "open", "beta", "closed", "bleeding", "edge", "newest", "promoted", "build", "any", "channel", "snapshot", "latest"],"aliases":["test-builds", "obtainium", "beta", "snapshot"],"charCount":20778},
{"id":"testing","title":"Testing","section":"developer","locale":"en","resourcePath":"docs/developer/testing.html","navOrder":7,"keywords":["testing", "test", "categories", "kmp", "unit", "tests", "commontest", "android", "host", "compose", "screenshot", "baseline", "profile", "startup", "performance", "organization", "guidelines", "don", "running", "all", "specific", "module", "code", "quality", "full", "verification", "integration"],"aliases":["tests", "unit-tests", "screenshot-tests"],"charCount":10054},
{"id":"testing","title":"Testing","section":"developer","locale":"en","resourcePath":"docs/developer/testing.html","navOrder":7,"keywords":["testing", "test", "categories", "kmp", "unit", "tests", "commontest", "android", "host", "compose", "screenshot", "baseline", "profile", "startup", "performance", "organization", "guidelines", "don", "running", "all", "specific", "module", "code", "quality", "full", "verification", "integration"],"aliases":["tests", "unit-tests", "screenshot-tests"],"charCount":10230},
{"id":"transport","title":"Transport","section":"developer","locale":"en","resourcePath":"docs/developer/transport.html","navOrder":5,"keywords":["transport", "abstraction", "bluetooth", "low", "energy", "ble", "where", "the", "code", "lives", "usb", "serial", "tcp", "factory", "connection", "lifecycle", "adding", "new"],"aliases":["ble", "serial", "tcp", "radio-transport"],"charCount":4902},
{"id":"app-functions","title":"App Functions","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":4364},
{"id":"connections","title":"Connections","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "radio", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "provisioning", "for", "mpwrd", "after", "your", "first", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":11132},