This commit is contained in:
mikecarper
2026-08-23 07:29:25 +00:00
parent 2619200f0f
commit 36b80bb8cd
39 changed files with 3109 additions and 35 deletions
+31
View File
@@ -46,6 +46,8 @@
<link rel="stylesheet" href="/MeshCore/_stylesheets/extra.css">
<link rel="stylesheet" href="/MeshCore/_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="/MeshCore/_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="/MeshCore/_stylesheets/filter_tool.css">
@@ -515,6 +517,33 @@
<li class="md-nav__item">
<a href="/MeshCore/firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="/MeshCore/flood_filtering/" class="md-nav__link">
@@ -1148,6 +1177,8 @@
<script src="/MeshCore/assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="/MeshCore/_javascript/firmware_picker.js"></script>
<script src="/MeshCore/_javascript/telemetry_decoder.js"></script>
<script src="/MeshCore/_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -700,6 +702,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1978,6 +2007,8 @@ diagnostics apply only to a <code>wifi_mqtt</code> companion target.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+359
View File
@@ -0,0 +1,359 @@
(function (global) {
"use strict";
const PURPOSES = Object.freeze({
"usb-logging": Object.freeze({
title: "Station G2 FULL USB logging repeater",
summary: "Best for a G2 that normally remains connected to a computer collecting serial packet logs.",
pattern: /^Station_G2_repeater-full-logging-ota-/,
expected: "Station_G2_repeater-full-logging-ota-...",
full: true,
notes: [
"Back up the node configuration before the first FULL install.",
"Use the merged image once to install the expanded partition table.",
"Reconnect at 115200 baud and leave the USB data connection attached for logging.",
],
}),
field: Object.freeze({
title: "Station G2 standard repeater",
summary: "The simplest sensor-enabled repeater for local USB installation and ordinary field use.",
pattern: /^Station_G2_repeater-v/,
expected: "Station_G2_repeater-v...",
full: false,
notes: [
"Choose this when USB logging, MQTT, ESP-NOW, and remote LoRa updates are not required.",
"This keeps the standard Station G2 partition profile.",
],
}),
"field-ota": Object.freeze({
title: "Station G2 lean OTA repeater",
summary: "A standalone repeater with LoRa/WiFi update support and no optional external environmental-sensor drivers.",
pattern: /^Station_G2_repeater_lora_ota_no_external_sensors-ota-/,
expected: "Station_G2_repeater_lora_ota_no_external_sensors-ota-...",
full: false,
notes: [
"Board-native GPS support remains available; only optional external sensor drivers are removed.",
"Use the exact matching target for every later LoRa package.",
],
}),
mqtt: Object.freeze({
title: "Station G2 FULL MQTT observer/repeater",
summary: "For direct radio-to-MQTT forwarding over WiFi with the complete CLI and expanded partitions.",
pattern: /^Station_G2_repeater_observer_mqtt-full-ota-/,
expected: "Station_G2_repeater_observer_mqtt-full-ota-...",
full: true,
notes: [
"This is an MQTT observer role, not USB packet logging.",
"Use its merged image once before any app-only WiFi or LoRa update.",
],
}),
espnow: Object.freeze({
title: "Station G2 FULL ESP-NOW bridge repeater",
summary: "For a repeater that bridges packets through ESP-NOW and needs the complete CLI.",
pattern: /^Station_G2_repeater_bridge_espnow-full-ota-/,
expected: "Station_G2_repeater_bridge_espnow-full-ota-...",
full: true,
notes: ["ESP-NOW bridge builds use the expanded FULL partition profile."],
}),
room: Object.freeze({
title: "Station G2 room server",
summary: "A standard room-server role without MQTT.",
pattern: /^Station_G2_room_server-v/,
expected: "Station_G2_room_server-v...",
full: false,
notes: ["Do not install this when the node is intended to remain a repeater."],
}),
"room-mqtt": Object.freeze({
title: "Station G2 FULL MQTT room observer",
summary: "A room server with direct MQTT/WiFi forwarding and expanded partitions.",
pattern: /^Station_G2_room_server_observer_mqtt-full-ota-/,
expected: "Station_G2_room_server_observer_mqtt-full-ota-...",
full: true,
notes: ["Use its merged image once before later same-profile OTA updates."],
}),
"companion-usb": Object.freeze({
title: "Station G2 USB Companion",
summary: "For a Station G2 controlled as a Companion through a USB serial connection.",
pattern: /^Station_G2_companion_radio_usb-ota-/,
expected: "Station_G2_companion_radio_usb-ota-...",
full: false,
notes: ["This is a Companion, not a standalone repeater or USB packet logger."],
}),
"companion-ble": Object.freeze({
title: "Station G2 Bluetooth Companion",
summary: "For a Station G2 controlled by a phone or computer through Bluetooth.",
pattern: /^Station_G2_companion_radio_ble-/,
expected: "Station_G2_companion_radio_ble-...",
full: false,
notes: ["Choose USB Companion instead when the data connection is normally wired."],
}),
"companion-wifi": Object.freeze({
title: "Station G2 WiFi Companion",
summary: "For Companion protocol access over WiFi.",
pattern: /^Station_G2_companion_radio_wifi-ota-/,
expected: "Station_G2_companion_radio_wifi-ota-...",
full: false,
notes: ["This is not the standalone MQTT observer role."],
}),
"companion-full": Object.freeze({
title: "Station G2 Full Companion",
summary: "A host-backed Companion that can serve LoRa OTA content and exposes the complete transport set.",
pattern: /^Station_G2_companion_radio_full-v/,
expected: "Station_G2_companion_radio_full-...",
full: true,
notes: [
"Full Companion is an OTA source and host-backed controller, not a self-updating repeater.",
"Install its merged image over USB.",
],
}),
});
function isSafeGithubUrl(value) {
try {
const url = new URL(value);
return url.protocol === "https:" &&
(url.hostname === "github.com" || url.hostname === "objects.githubusercontent.com");
} catch (_) {
return false;
}
}
function flattenReleases(releases, channel) {
const allowPrerelease = channel === "development";
const rows = [];
(Array.isArray(releases) ? releases : []).forEach(function (release) {
if (!release || release.draft || (!allowPrerelease && release.prerelease)) return;
(Array.isArray(release.assets) ? release.assets : []).forEach(function (asset) {
if (!asset || typeof asset.name !== "string") return;
rows.push({
name: asset.name,
url: isSafeGithubUrl(asset.browser_download_url) ? asset.browser_download_url : "",
size: Number(asset.size) || 0,
releaseName: release.name || release.tag_name || "Release",
releaseTag: release.tag_name || "",
releaseUrl: isSafeGithubUrl(release.html_url) ? release.html_url : "",
prerelease: Boolean(release.prerelease),
publishedAt: release.published_at || release.created_at || "",
});
});
});
return rows.sort(function (a, b) {
return String(b.publishedAt).localeCompare(String(a.publishedAt));
});
}
function wantedSuffix(install) {
return install === "first" ? "-merged.bin" : ".bin";
}
function selectAsset(rows, purposeKey, install) {
const purpose = PURPOSES[purposeKey];
if (!purpose) return null;
const suffix = wantedSuffix(install);
const matches = rows.filter(function (row) {
if (!purpose.pattern.test(row.name) || !row.name.endsWith(suffix)) return false;
if (install !== "first" && row.name.endsWith("-merged.bin")) return false;
return true;
});
matches.sort(function (a, b) {
const byDate = String(b.publishedAt).localeCompare(String(a.publishedAt));
if (byDate) return byDate;
const byLength = a.name.length - b.name.length;
return byLength || a.name.localeCompare(b.name);
});
return matches[0] || null;
}
function formatBytes(value) {
const size = Number(value) || 0;
if (size >= 1024 * 1024) return (size / (1024 * 1024)).toFixed(2) + " MiB";
if (size >= 1024) return (size / 1024).toFixed(1) + " KiB";
return size + " bytes";
}
function installExplanation(install) {
if (install === "first") {
return {
label: "USB merged-image install",
warning: "This can replace the partition table. Back up configuration first.",
};
}
if (install === "lora") {
return {
label: "LoRa OTA source image",
warning: "Package the non-merged application for the exact target. The installed partition signature must already match.",
};
}
return {
label: "Browser/WiFi app-only update",
warning: "Use only when the installed board, role, and partition layout already match.",
};
}
function createElement(tag, text) {
const element = document.createElement(tag);
if (text != null) element.textContent = text;
return element;
}
function replaceFacts(container, facts) {
container.replaceChildren();
facts.forEach(function (fact) {
container.appendChild(createElement("dt", fact[0]));
const dd = createElement("dd", fact[1]);
if (fact[2]) dd.title = fact[2];
container.appendChild(dd);
});
}
function renderSteps(container, purpose, install) {
container.replaceChildren();
container.appendChild(createElement("strong", "What to do"));
const list = createElement("ol");
const common = install === "first"
? [
"Back up configuration, keys, and radio settings.",
"Verify that the filename begins with Station_G2 before flashing.",
"Flash the merged image over a data-capable USB cable.",
"Wait for the board to reboot, reconnect, and verify its role and radio settings.",
]
: install === "lora"
? [
"Confirm the running target and partition signature already match this profile.",
"Use the non-merged application as input to the LoRa OTA packaging workflow.",
"Verify the target identity and completed update after reboot.",
]
: [
"Confirm the running target and partition signature already match this profile.",
"Upload the non-merged application through the firmware's browser/WiFi updater.",
"Verify the role and version after reboot.",
];
common.concat(purpose.notes).forEach(function (text) {
list.appendChild(createElement("li", text));
});
container.appendChild(list);
}
function initPicker(root) {
const repo = root.getAttribute("data-release-repo") || "mikecarper/MeshCore";
const form = root.querySelector('[data-role="form"]');
const channelField = root.querySelector('[data-field="channel"]');
const purposeField = root.querySelector('[data-field="purpose"]');
const installField = root.querySelector('[data-field="install"]');
const status = root.querySelector('[data-role="status"]');
const result = root.querySelector('[data-role="result"]');
const missing = root.querySelector('[data-role="missing"]');
const search = root.querySelector('[data-field="asset-search"]');
const assetResults = root.querySelector('[data-role="asset-results"]');
let releases = [];
function currentRows() {
return flattenReleases(releases, channelField.value);
}
function render() {
const purpose = PURPOSES[purposeField.value];
const install = installField.value;
const rows = currentRows();
const asset = selectAsset(rows, purposeField.value, install);
const installInfo = installExplanation(install);
result.hidden = true;
missing.hidden = true;
if (!asset) {
missing.hidden = false;
const suffix = wantedSuffix(install);
root.querySelector('[data-role="missing-text"]').textContent =
"Expected a recent asset beginning with " + purpose.expected +
" and ending in " + suffix + ". Try the other release channel or open the release collection.";
return;
}
root.querySelector('[data-role="result-title"]').textContent = purpose.title;
root.querySelector('[data-role="result-summary"]').textContent = purpose.summary;
replaceFacts(root.querySelector('[data-role="result-facts"]'), [
["File", asset.name],
["Release", asset.releaseName],
["Install path", installInfo.label],
["Size", formatBytes(asset.size)],
["Important", installInfo.warning],
]);
const download = root.querySelector('[data-role="download"]');
download.href = asset.url || asset.releaseUrl;
download.hidden = !(asset.url || asset.releaseUrl);
const releaseLink = root.querySelector('[data-role="release"]');
releaseLink.href = asset.releaseUrl || "https://github.com/" + repo + "/releases";
renderSteps(root.querySelector('[data-role="steps"]'), purpose, install);
result.hidden = false;
}
function renderSearch() {
assetResults.replaceChildren();
const query = search.value.trim().toLowerCase();
if (query.length < 2) return;
const matches = currentRows().filter(function (row) {
return row.name.toLowerCase().includes(query);
}).slice(0, 80);
if (!matches.length) {
assetResults.appendChild(createElement("p", "No recent release filename matched."));
return;
}
const list = createElement("ul");
list.className = "firmware-asset-list";
matches.forEach(function (row) {
const item = createElement("li");
const link = createElement("a", row.name);
link.href = row.url || row.releaseUrl;
item.appendChild(link);
const meta = createElement("span", row.releaseName + " - " + formatBytes(row.size));
meta.className = "firmware-asset-meta";
item.appendChild(meta);
list.appendChild(item);
});
assetResults.appendChild(list);
}
form.addEventListener("change", function () {
render();
renderSearch();
});
search.addEventListener("input", renderSearch);
const endpoint = "https://api.github.com/repos/" + encodeURIComponent(repo.split("/")[0]) +
"/" + encodeURIComponent(repo.split("/")[1]) + "/releases?per_page=20";
fetch(endpoint, { headers: { Accept: "application/vnd.github+json" } })
.then(function (response) {
if (!response.ok) throw new Error("GitHub returned HTTP " + response.status);
return response.json();
})
.then(function (data) {
releases = Array.isArray(data) ? data : [];
const count = flattenReleases(releases, "development").length;
status.textContent = "Loaded " + count + " firmware assets from the 20 most recent releases.";
render();
})
.catch(function (error) {
status.textContent = "Could not load the GitHub release catalog: " + error.message;
missing.hidden = false;
root.querySelector('[data-role="missing-text"]').textContent =
"Open the release collection and look for the expected filename shown by this picker.";
});
}
const api = Object.freeze({
PURPOSES: PURPOSES,
flattenReleases: flattenReleases,
selectAsset: selectAsset,
wantedSuffix: wantedSuffix,
formatBytes: formatBytes,
});
if (typeof module !== "undefined" && module.exports) module.exports = api;
global.MeshCoreFirmwarePicker = api;
if (typeof document !== "undefined") {
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll("[data-firmware-picker]").forEach(initPicker);
});
}
})(typeof globalThis !== "undefined" ? globalThis : this);
+173
View File
@@ -0,0 +1,173 @@
.firmware-picker {
--picker-accent: #0f766e;
--picker-accent-dark: #115e59;
--picker-border: color-mix(in srgb, currentColor 18%, transparent);
margin: 1.25rem 0 2rem;
}
.firmware-picker-intro,
.firmware-picker-result,
.firmware-picker-missing,
.firmware-asset-browser {
border: 1px solid var(--picker-border);
border-radius: 0.7rem;
padding: 1rem 1.15rem;
}
.firmware-picker-intro {
border-left: 0.35rem solid var(--picker-accent);
background: color-mix(in srgb, var(--picker-accent) 8%, transparent);
}
.firmware-picker-intro p,
.firmware-picker-result p,
.firmware-picker-missing p {
margin-bottom: 0;
}
.firmware-picker-form {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
gap: 0.9rem;
margin: 1.2rem 0;
}
.firmware-picker-form label,
.firmware-asset-browser label {
display: grid;
gap: 0.35rem;
font-weight: 650;
}
.firmware-picker-form select,
.firmware-asset-browser input {
width: 100%;
min-height: 2.7rem;
padding: 0.45rem 0.6rem;
border: 1px solid var(--picker-border);
border-radius: 0.35rem;
color: inherit;
background: var(--md-default-bg-color);
font: inherit;
}
.firmware-picker-status {
min-height: 1.5rem;
margin: 0.75rem 0;
color: var(--md-default-fg-color--light);
}
.firmware-picker-result {
border-top: 0.3rem solid var(--picker-accent);
}
.firmware-picker-eyebrow {
margin: 0 0 0.15rem !important;
color: var(--picker-accent);
font-size: 0.75rem;
font-weight: 750;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.firmware-picker-result h2,
.firmware-picker-missing h2 {
margin-top: 0.2rem;
}
.firmware-picker-facts {
display: grid;
grid-template-columns: minmax(7rem, auto) 1fr;
gap: 0.35rem 0.9rem;
margin: 1rem 0;
}
.firmware-picker-facts dt {
font-weight: 700;
}
.firmware-picker-facts dd {
min-width: 0;
margin: 0;
overflow-wrap: anywhere;
}
.firmware-picker-actions {
display: flex;
flex-wrap: wrap;
gap: 0.65rem;
margin: 1rem 0;
}
.firmware-picker-actions a {
display: inline-block;
padding: 0.55rem 0.8rem;
border: 1px solid var(--picker-accent);
border-radius: 0.4rem;
font-weight: 700;
text-decoration: none;
}
.firmware-picker-actions .firmware-picker-primary {
color: white;
background: var(--picker-accent);
}
.firmware-picker-actions .firmware-picker-primary:hover {
background: var(--picker-accent-dark);
}
.firmware-picker-steps {
border-top: 1px solid var(--picker-border);
margin-top: 1rem;
padding-top: 0.8rem;
}
.firmware-picker-steps ol {
margin-bottom: 0;
}
.firmware-picker-missing {
border-left: 0.35rem solid #b45309;
}
.firmware-asset-browser {
margin-top: 1.2rem;
}
.firmware-asset-browser summary {
cursor: pointer;
font-weight: 700;
}
.firmware-asset-list {
max-height: 24rem;
margin-top: 0.8rem;
padding-left: 1.2rem;
overflow: auto;
}
.firmware-asset-list li {
margin: 0.35rem 0;
overflow-wrap: anywhere;
}
.firmware-asset-meta {
display: block;
color: var(--md-default-fg-color--light);
font-size: 0.78rem;
}
@media (max-width: 44rem) {
.firmware-picker-form {
grid-template-columns: 1fr;
}
.firmware-picker-facts {
grid-template-columns: 1fr;
}
.firmware-picker-facts dd + dt {
margin-top: 0.35rem;
}
}
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -628,6 +630,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1488,6 +1517,8 @@ profile, and finally the target's compiled hardware features.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -744,6 +746,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -4487,6 +4516,8 @@ selected by that manifest.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -2424,6 +2426,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -7603,6 +7632,8 @@ non-PSRAM variants opt in with <code>MQTT_NEIGHBORS_WITHOUT_PSRAM</code>.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -595,6 +597,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1353,6 +1382,8 @@ protocol setting to resize it at runtime.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -1149,6 +1151,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -3881,6 +3910,8 @@ response = wait_for_response(PACKET_MSG_SENT)
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -667,6 +669,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1822,6 +1851,8 @@ selection, nRF52 in-place deltas, relays, trust checks, and recovery behavior.</
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -584,6 +586,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1271,6 +1300,8 @@ pip install mkdocs-material
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -1518,6 +1520,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -3978,6 +4007,8 @@ Flash one of the Ethernet-enabled firmware variants:
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+32 -1
View File
@@ -16,7 +16,7 @@
<link rel="prev" href="../faq/">
<link rel="next" href="../flood_filtering/">
<link rel="next" href="../firmware_picker/">
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -617,6 +619,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2051,6 +2080,8 @@ sized structure for every possible condition and action.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
File diff suppressed because it is too large Load Diff
+32 -1
View File
@@ -13,7 +13,7 @@
<link rel="canonical" href="https://mikecarper.github.io/MeshCore/flood_filtering/">
<link rel="prev" href="../filter_tool/">
<link rel="prev" href="../firmware_picker/">
<link rel="next" href="../gps_tracking/">
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -524,6 +526,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
@@ -2389,6 +2418,8 @@ inspect or reset those separately when troubleshooting.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1479,6 +1508,8 @@ fresh data is available.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2108,6 +2137,8 @@ set flood.retry.path 2
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+32
View File
@@ -50,6 +50,8 @@
<link rel="stylesheet" href="_stylesheets/extra.css">
<link rel="stylesheet" href="_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="_stylesheets/filter_tool.css">
@@ -534,6 +536,33 @@
<li class="md-nav__item">
<a href="firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="flood_filtering/" class="md-nav__link">
@@ -1143,6 +1172,7 @@
<p>Below are a few quick start guides.</p>
<ul>
<li><a href="faq/">Frequently Asked Questions</a></li>
<li><a href="firmware_picker/">Firmware Picker</a></li>
<li><a href="cli_commands/">CLI Commands</a></li>
<li><a href="filter_tool/">Filter Policy Playground</a></li>
<li><a href="telemetry_decoder/">Telemetry Decoder</a></li>
@@ -1217,6 +1247,8 @@
<script src="assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="_javascript/firmware_picker.js"></script>
<script src="_javascript/telemetry_decoder.js"></script>
<script src="_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2695,6 +2724,8 @@
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1965,6 +1994,8 @@ image: the default active-download guard preserves it until you explicitly use
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1685,6 +1714,8 @@ not the cause, and waev does not cap connections per IP.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2052,6 +2081,8 @@ DEBUG: PWRMGT: LPCOMP wake configured (AIN7, ref=3/8 VDD)
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1238,6 +1267,8 @@
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2002,6 +2031,8 @@ and container internals, see <a href="../ota_protocol/">the OTA protocol specifi
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1741,6 +1770,8 @@ as an alias.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1634,6 +1663,8 @@ Use USB/BLE DFU or SWD for initial provisioning and local recovery.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1626,6 +1655,8 @@ OTAFIX enters USB/BLE recovery rather than booting a partial image.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2931,6 +2960,8 @@ reject v2+BOOTLOADER, v3 without exact <code>FULL|SIGNED|BOOTLOADER</code>, and
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2061,6 +2090,8 @@ that only contains what changed). You get them by:</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1777,6 +1806,8 @@ support only a subset of the path encodings and payload types described here.</p
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2758,6 +2787,8 @@ relay an opaque OTA packet when their routing policy permits it.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1314,6 +1343,8 @@
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1994,6 +2023,8 @@ only re-enables the watchdog after step 9. Success requires endpoint body hash
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
File diff suppressed because one or more lines are too long
+36 -32
View File
@@ -2,130 +2,134 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://mikecarper.github.io/MeshCore/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/WiFi/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/cli_build_matrix/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/cli_command_availability/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/cli_commands/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/companion_offline_queue/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/companion_protocol/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/companion_radio_full/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/docs/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/faq/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/filter_tool/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/firmware_picker/</loc>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/flood_filtering/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/gps_tracking/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/halo_keymind_settings/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/kiss_modem_protocol/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/lora_ota_automation/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/mbedtls-tls-footprint/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/nrf52_power_management/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/number_allocations/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/ota_easy/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/ota_meshtower_v2_sdcard/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/ota_nrf52_bootloader_update/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/ota_nrf52_qspi/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/ota_protocol/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/ota_user_guide/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/packet_format/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/payloads/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/qr_codes/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/rak3401_mota_chain/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/stats_binary_frames/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/telemetry_decoder/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/terminal_chat_cli/</loc>
<lastmod>2026-08-22</lastmod>
<lastmod>2026-08-23</lastmod>
</url>
</urlset>
BIN
View File
Binary file not shown.
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -2147,6 +2176,8 @@ function parseStatsPackets(buffer: ArrayBuffer): StatsPackets {
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -52,6 +52,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -526,6 +528,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1517,6 +1546,8 @@ page.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
+31
View File
@@ -50,6 +50,8 @@
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
@@ -524,6 +526,33 @@
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
@@ -1534,6 +1563,8 @@ length, which also includes the sender-name prefix added over the air.</p>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>