From bbe9a0d5cd8287a8199c752629614ef678ae6640 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 15 Jun 2026 13:23:28 -0500 Subject: [PATCH] feat(protobufs): sync to firmware-current and consume workspace package (#1097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(protobufs): sync to firmware-current and consume workspace package Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*). Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true. * build(protobufs): vendor generated bindings for workspace consumers The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen * fix(protobufs): clean script removes the actual generated output dir buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback. * refactor: move web app packages/web -> apps/web Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green. * feat: config fields, module pages, key verification, telemetry capture Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green. * chore: drop #1062 (unsaved-change-detection) to match upstream revert #1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green. * fix(nodes): clean up SNR display in node table and map popup SNR is a ratio measured in dB, not dBm (which is absolute power); the node table and map popup both mislabeled it and crammed three values together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same heuristic ((snr+10)*5) shown twice — once clamped, once not. Render SNR in dB rounded to one decimal, color-coded by a 0-100% signal-quality heuristic (green/yellow/red), with the quality percentage as a muted secondary. Drop the redundant raw value. Adds unit.db; this matches the existing SNRTooltip, which already renders dB. --- .github/workflows/nightly.yml | 12 +- .github/workflows/pr.yml | 2 +- .github/workflows/release-web.yml | 10 +- PR-NOTES.md | 65 + {packages => apps}/web/.oxfmtrc.json | 0 {packages => apps}/web/.oxlintrc.json | 0 {packages => apps}/web/CONTRIBUTING.md | 0 .../web/CONTRIBUTING_I18N_DEVELOPER_GUIDE.md | 0 .../web/CONTRIBUTING_TRANSLATIONS.md | 0 {packages => apps}/web/README.md | 0 {packages => apps}/web/crowdin.yml | 0 {packages => apps}/web/index.html | 0 {packages => apps}/web/infra/.dockerignore | 0 {packages => apps}/web/infra/Containerfile | 0 {packages => apps}/web/infra/default.conf | 0 {packages => apps}/web/package.json | 2 + .../web/public/apple-touch-icon.png | Bin {packages => apps}/web/public/chirpy.svg | 0 {packages => apps}/web/public/devices/diy.svg | 0 .../devices/heltec-ht62-esp32c3-sx1262.svg | 0 .../devices/heltec-mesh-node-t114-case.svg | 0 .../public/devices/heltec-mesh-node-t114.svg | 0 .../web/public/devices/heltec-v3-case.svg | 0 .../web/public/devices/heltec-v3.svg | 0 .../devices/heltec-vision-master-e213.svg | 0 .../devices/heltec-vision-master-e290.svg | 0 .../devices/heltec-vision-master-t190.svg | 0 .../devices/heltec-wireless-paper-V1_0.svg | 0 .../public/devices/heltec-wireless-paper.svg | 0 .../devices/heltec-wireless-tracker-V1-0.svg | 0 .../devices/heltec-wireless-tracker.svg | 0 .../web/public/devices/heltec-wsl-v3.svg | 0 .../web/public/devices/nano-g2-ultra.svg | 0 .../web/public/devices/pico.svg | 0 .../web/public/devices/promicro.svg | 0 .../web/public/devices/rak-wismeshtap.svg | 0 .../web/public/devices/rak11310.svg | 0 .../web/public/devices/rak2560.svg | 0 .../web/public/devices/rak4631.svg | 0 .../web/public/devices/rak4631_case.svg | 0 .../web/public/devices/rpipicow.svg | 0 .../devices/seeed-sensecap-indicator.svg | 0 .../web/public/devices/seeed-xiao-s3.svg | 0 .../web/public/devices/station-g2.svg | 0 .../web/public/devices/t-deck.svg | 0 .../web/public/devices/t-echo.svg | 0 .../web/public/devices/t-watch-s3.svg | 0 .../web/public/devices/tbeam-s3-core.svg | 0 .../web/public/devices/tbeam.svg | 0 .../web/public/devices/tlora-c6.svg | 0 .../web/public/devices/tlora-t3s3-epaper.svg | 0 .../web/public/devices/tlora-t3s3-v1.svg | 0 .../web/public/devices/tlora-v2-1-1_6.svg | 0 .../web/public/devices/tlora-v2-1-1_8.svg | 0 .../web/public/devices/tracker-t1000-e.svg | 0 .../web/public/devices/unknown.svg | 0 .../web/public/devices/wio-tracker-wm1110.svg | 0 .../web/public/devices/wm1110_dev_kit.svg | 0 {packages => apps}/web/public/favicon.ico | Bin .../public/fonts/InterVariable-Italic.woff2 | Bin .../web/public/fonts/InterVariable.woff2 | Bin .../public/i18n/locales/be-BY/channels.json | 0 .../i18n/locales/be-BY/commandPalette.json | 0 .../web/public/i18n/locales/be-BY/common.json | 0 .../web/public/i18n/locales/be-BY/config.json | 0 .../i18n/locales/be-BY/connections.json | 0 .../i18n/locales/be-BY/deviceConfig.json | 0 .../web/public/i18n/locales/be-BY/dialog.json | 0 .../web/public/i18n/locales/be-BY/map.json | 0 .../public/i18n/locales/be-BY/messages.json | 0 .../i18n/locales/be-BY/moduleConfig.json | 0 .../web/public/i18n/locales/be-BY/nodes.json | 0 .../web/public/i18n/locales/be-BY/ui.json | 0 .../public/i18n/locales/bg-BG/channels.json | 0 .../i18n/locales/bg-BG/commandPalette.json | 0 .../web/public/i18n/locales/bg-BG/common.json | 0 .../web/public/i18n/locales/bg-BG/config.json | 0 .../i18n/locales/bg-BG/connections.json | 0 .../i18n/locales/bg-BG/deviceConfig.json | 0 .../web/public/i18n/locales/bg-BG/dialog.json | 0 .../web/public/i18n/locales/bg-BG/map.json | 0 .../public/i18n/locales/bg-BG/messages.json | 0 .../i18n/locales/bg-BG/moduleConfig.json | 0 .../web/public/i18n/locales/bg-BG/nodes.json | 0 .../web/public/i18n/locales/bg-BG/ui.json | 0 .../public/i18n/locales/cs-CZ/channels.json | 0 .../i18n/locales/cs-CZ/commandPalette.json | 0 .../web/public/i18n/locales/cs-CZ/common.json | 0 .../web/public/i18n/locales/cs-CZ/config.json | 0 .../i18n/locales/cs-CZ/connections.json | 0 .../i18n/locales/cs-CZ/deviceConfig.json | 0 .../web/public/i18n/locales/cs-CZ/dialog.json | 0 .../web/public/i18n/locales/cs-CZ/map.json | 0 .../public/i18n/locales/cs-CZ/messages.json | 0 .../i18n/locales/cs-CZ/moduleConfig.json | 0 .../web/public/i18n/locales/cs-CZ/nodes.json | 0 .../web/public/i18n/locales/cs-CZ/ui.json | 0 .../public/i18n/locales/de-DE/channels.json | 0 .../i18n/locales/de-DE/commandPalette.json | 0 .../web/public/i18n/locales/de-DE/common.json | 0 .../web/public/i18n/locales/de-DE/config.json | 0 .../i18n/locales/de-DE/connections.json | 0 .../i18n/locales/de-DE/deviceConfig.json | 0 .../web/public/i18n/locales/de-DE/dialog.json | 0 .../web/public/i18n/locales/de-DE/map.json | 0 .../public/i18n/locales/de-DE/messages.json | 0 .../i18n/locales/de-DE/moduleConfig.json | 0 .../web/public/i18n/locales/de-DE/nodes.json | 0 .../web/public/i18n/locales/de-DE/ui.json | 0 .../web/public/i18n/locales/en/channels.json | 0 .../i18n/locales/en/commandPalette.json | 0 .../web/public/i18n/locales/en/common.json | 1 + .../web/public/i18n/locales/en/config.json | 12 + .../public/i18n/locales/en/connections.json | 0 .../web/public/i18n/locales/en/dialog.json | 23 +- .../web/public/i18n/locales/en/map.json | 0 .../web/public/i18n/locales/en/messages.json | 0 .../public/i18n/locales/en/moduleConfig.json | 102 +- .../web/public/i18n/locales/en/nodes.json | 0 .../web/public/i18n/locales/en/ui.json | 0 .../public/i18n/locales/es-ES/channels.json | 0 .../i18n/locales/es-ES/commandPalette.json | 0 .../web/public/i18n/locales/es-ES/common.json | 0 .../web/public/i18n/locales/es-ES/config.json | 0 .../i18n/locales/es-ES/connections.json | 0 .../i18n/locales/es-ES/deviceConfig.json | 0 .../web/public/i18n/locales/es-ES/dialog.json | 0 .../web/public/i18n/locales/es-ES/map.json | 0 .../public/i18n/locales/es-ES/messages.json | 0 .../i18n/locales/es-ES/moduleConfig.json | 0 .../web/public/i18n/locales/es-ES/nodes.json | 0 .../web/public/i18n/locales/es-ES/ui.json | 0 .../public/i18n/locales/fi-FI/channels.json | 0 .../i18n/locales/fi-FI/commandPalette.json | 0 .../web/public/i18n/locales/fi-FI/common.json | 0 .../web/public/i18n/locales/fi-FI/config.json | 0 .../i18n/locales/fi-FI/connections.json | 0 .../i18n/locales/fi-FI/deviceConfig.json | 0 .../web/public/i18n/locales/fi-FI/dialog.json | 0 .../web/public/i18n/locales/fi-FI/map.json | 0 .../public/i18n/locales/fi-FI/messages.json | 0 .../i18n/locales/fi-FI/moduleConfig.json | 0 .../web/public/i18n/locales/fi-FI/nodes.json | 0 .../web/public/i18n/locales/fi-FI/ui.json | 0 .../public/i18n/locales/fr-FR/channels.json | 0 .../i18n/locales/fr-FR/commandPalette.json | 0 .../web/public/i18n/locales/fr-FR/common.json | 0 .../web/public/i18n/locales/fr-FR/config.json | 0 .../i18n/locales/fr-FR/connections.json | 0 .../i18n/locales/fr-FR/deviceConfig.json | 0 .../web/public/i18n/locales/fr-FR/dialog.json | 0 .../web/public/i18n/locales/fr-FR/map.json | 0 .../public/i18n/locales/fr-FR/messages.json | 0 .../i18n/locales/fr-FR/moduleConfig.json | 0 .../web/public/i18n/locales/fr-FR/nodes.json | 0 .../web/public/i18n/locales/fr-FR/ui.json | 0 .../public/i18n/locales/hu-HU/channels.json | 0 .../i18n/locales/hu-HU/commandPalette.json | 0 .../web/public/i18n/locales/hu-HU/common.json | 0 .../web/public/i18n/locales/hu-HU/config.json | 0 .../i18n/locales/hu-HU/connections.json | 0 .../i18n/locales/hu-HU/deviceConfig.json | 0 .../web/public/i18n/locales/hu-HU/dialog.json | 0 .../web/public/i18n/locales/hu-HU/map.json | 0 .../public/i18n/locales/hu-HU/messages.json | 0 .../i18n/locales/hu-HU/moduleConfig.json | 0 .../web/public/i18n/locales/hu-HU/nodes.json | 0 .../web/public/i18n/locales/hu-HU/ui.json | 0 .../public/i18n/locales/it-IT/channels.json | 0 .../i18n/locales/it-IT/commandPalette.json | 0 .../web/public/i18n/locales/it-IT/common.json | 0 .../web/public/i18n/locales/it-IT/config.json | 0 .../i18n/locales/it-IT/connections.json | 0 .../i18n/locales/it-IT/deviceConfig.json | 0 .../web/public/i18n/locales/it-IT/dialog.json | 0 .../web/public/i18n/locales/it-IT/map.json | 0 .../public/i18n/locales/it-IT/messages.json | 0 .../i18n/locales/it-IT/moduleConfig.json | 0 .../web/public/i18n/locales/it-IT/nodes.json | 0 .../web/public/i18n/locales/it-IT/ui.json | 0 .../public/i18n/locales/ja-JP/channels.json | 0 .../i18n/locales/ja-JP/commandPalette.json | 0 .../web/public/i18n/locales/ja-JP/common.json | 0 .../web/public/i18n/locales/ja-JP/config.json | 0 .../i18n/locales/ja-JP/connections.json | 0 .../i18n/locales/ja-JP/deviceConfig.json | 0 .../web/public/i18n/locales/ja-JP/dialog.json | 0 .../web/public/i18n/locales/ja-JP/map.json | 0 .../public/i18n/locales/ja-JP/messages.json | 0 .../i18n/locales/ja-JP/moduleConfig.json | 0 .../web/public/i18n/locales/ja-JP/nodes.json | 0 .../web/public/i18n/locales/ja-JP/ui.json | 0 .../public/i18n/locales/ko-KR/channels.json | 0 .../i18n/locales/ko-KR/commandPalette.json | 0 .../web/public/i18n/locales/ko-KR/common.json | 0 .../web/public/i18n/locales/ko-KR/config.json | 0 .../i18n/locales/ko-KR/connections.json | 0 .../i18n/locales/ko-KR/deviceConfig.json | 0 .../web/public/i18n/locales/ko-KR/dialog.json | 0 .../web/public/i18n/locales/ko-KR/map.json | 0 .../public/i18n/locales/ko-KR/messages.json | 0 .../i18n/locales/ko-KR/moduleConfig.json | 0 .../web/public/i18n/locales/ko-KR/nodes.json | 0 .../web/public/i18n/locales/ko-KR/ui.json | 0 .../public/i18n/locales/nl-NL/channels.json | 0 .../i18n/locales/nl-NL/commandPalette.json | 0 .../web/public/i18n/locales/nl-NL/common.json | 0 .../web/public/i18n/locales/nl-NL/config.json | 0 .../i18n/locales/nl-NL/connections.json | 0 .../i18n/locales/nl-NL/deviceConfig.json | 0 .../web/public/i18n/locales/nl-NL/dialog.json | 0 .../web/public/i18n/locales/nl-NL/map.json | 0 .../public/i18n/locales/nl-NL/messages.json | 0 .../i18n/locales/nl-NL/moduleConfig.json | 0 .../web/public/i18n/locales/nl-NL/nodes.json | 0 .../web/public/i18n/locales/nl-NL/ui.json | 0 .../public/i18n/locales/pl-PL/channels.json | 0 .../i18n/locales/pl-PL/commandPalette.json | 0 .../web/public/i18n/locales/pl-PL/common.json | 0 .../web/public/i18n/locales/pl-PL/config.json | 0 .../i18n/locales/pl-PL/connections.json | 0 .../i18n/locales/pl-PL/deviceConfig.json | 0 .../web/public/i18n/locales/pl-PL/dialog.json | 0 .../web/public/i18n/locales/pl-PL/map.json | 0 .../public/i18n/locales/pl-PL/messages.json | 0 .../i18n/locales/pl-PL/moduleConfig.json | 0 .../web/public/i18n/locales/pl-PL/nodes.json | 0 .../web/public/i18n/locales/pl-PL/ui.json | 0 .../public/i18n/locales/pt-BR/channels.json | 0 .../i18n/locales/pt-BR/commandPalette.json | 0 .../web/public/i18n/locales/pt-BR/common.json | 0 .../web/public/i18n/locales/pt-BR/config.json | 0 .../i18n/locales/pt-BR/connections.json | 0 .../i18n/locales/pt-BR/deviceConfig.json | 0 .../web/public/i18n/locales/pt-BR/dialog.json | 0 .../web/public/i18n/locales/pt-BR/map.json | 0 .../public/i18n/locales/pt-BR/messages.json | 0 .../i18n/locales/pt-BR/moduleConfig.json | 0 .../web/public/i18n/locales/pt-BR/nodes.json | 0 .../web/public/i18n/locales/pt-BR/ui.json | 0 .../public/i18n/locales/pt-PT/channels.json | 0 .../i18n/locales/pt-PT/commandPalette.json | 0 .../web/public/i18n/locales/pt-PT/common.json | 0 .../web/public/i18n/locales/pt-PT/config.json | 0 .../i18n/locales/pt-PT/connections.json | 0 .../i18n/locales/pt-PT/deviceConfig.json | 0 .../web/public/i18n/locales/pt-PT/dialog.json | 0 .../web/public/i18n/locales/pt-PT/map.json | 0 .../public/i18n/locales/pt-PT/messages.json | 0 .../i18n/locales/pt-PT/moduleConfig.json | 0 .../web/public/i18n/locales/pt-PT/nodes.json | 0 .../web/public/i18n/locales/pt-PT/ui.json | 0 .../public/i18n/locales/ru-RU/channels.json | 0 .../i18n/locales/ru-RU/commandPalette.json | 0 .../web/public/i18n/locales/ru-RU/common.json | 0 .../web/public/i18n/locales/ru-RU/config.json | 0 .../i18n/locales/ru-RU/connections.json | 0 .../web/public/i18n/locales/ru-RU/dialog.json | 0 .../web/public/i18n/locales/ru-RU/map.json | 0 .../public/i18n/locales/ru-RU/messages.json | 0 .../i18n/locales/ru-RU/moduleConfig.json | 0 .../web/public/i18n/locales/ru-RU/nodes.json | 0 .../web/public/i18n/locales/ru-RU/ui.json | 0 .../public/i18n/locales/sv-SE/channels.json | 0 .../i18n/locales/sv-SE/commandPalette.json | 0 .../web/public/i18n/locales/sv-SE/common.json | 0 .../web/public/i18n/locales/sv-SE/config.json | 0 .../i18n/locales/sv-SE/connections.json | 0 .../i18n/locales/sv-SE/deviceConfig.json | 0 .../web/public/i18n/locales/sv-SE/dialog.json | 0 .../web/public/i18n/locales/sv-SE/map.json | 0 .../public/i18n/locales/sv-SE/messages.json | 0 .../i18n/locales/sv-SE/moduleConfig.json | 0 .../web/public/i18n/locales/sv-SE/nodes.json | 0 .../web/public/i18n/locales/sv-SE/ui.json | 0 .../public/i18n/locales/tr-TR/channels.json | 0 .../i18n/locales/tr-TR/commandPalette.json | 0 .../web/public/i18n/locales/tr-TR/common.json | 0 .../web/public/i18n/locales/tr-TR/config.json | 0 .../i18n/locales/tr-TR/connections.json | 0 .../i18n/locales/tr-TR/deviceConfig.json | 0 .../web/public/i18n/locales/tr-TR/dialog.json | 0 .../web/public/i18n/locales/tr-TR/map.json | 0 .../public/i18n/locales/tr-TR/messages.json | 0 .../i18n/locales/tr-TR/moduleConfig.json | 0 .../web/public/i18n/locales/tr-TR/nodes.json | 0 .../web/public/i18n/locales/tr-TR/ui.json | 0 .../public/i18n/locales/uk-UA/channels.json | 0 .../i18n/locales/uk-UA/commandPalette.json | 0 .../web/public/i18n/locales/uk-UA/common.json | 0 .../web/public/i18n/locales/uk-UA/config.json | 0 .../i18n/locales/uk-UA/connections.json | 0 .../i18n/locales/uk-UA/deviceConfig.json | 0 .../web/public/i18n/locales/uk-UA/dialog.json | 0 .../web/public/i18n/locales/uk-UA/map.json | 0 .../public/i18n/locales/uk-UA/messages.json | 0 .../i18n/locales/uk-UA/moduleConfig.json | 0 .../web/public/i18n/locales/uk-UA/nodes.json | 0 .../web/public/i18n/locales/uk-UA/ui.json | 0 .../public/i18n/locales/zh-CN/channels.json | 0 .../i18n/locales/zh-CN/commandPalette.json | 0 .../web/public/i18n/locales/zh-CN/common.json | 0 .../web/public/i18n/locales/zh-CN/config.json | 0 .../i18n/locales/zh-CN/connections.json | 0 .../i18n/locales/zh-CN/deviceConfig.json | 0 .../web/public/i18n/locales/zh-CN/dialog.json | 0 .../web/public/i18n/locales/zh-CN/map.json | 0 .../public/i18n/locales/zh-CN/messages.json | 0 .../i18n/locales/zh-CN/moduleConfig.json | 0 .../web/public/i18n/locales/zh-CN/nodes.json | 0 .../web/public/i18n/locales/zh-CN/ui.json | 0 .../public/i18n/locales/zh-TW/channels.json | 0 .../i18n/locales/zh-TW/commandPalette.json | 0 .../web/public/i18n/locales/zh-TW/common.json | 0 .../web/public/i18n/locales/zh-TW/config.json | 0 .../i18n/locales/zh-TW/connections.json | 0 .../public/i18n/locales/zh-TW/dashboard.json | 0 .../web/public/i18n/locales/zh-TW/dialog.json | 0 .../web/public/i18n/locales/zh-TW/map.json | 0 .../public/i18n/locales/zh-TW/messages.json | 0 .../i18n/locales/zh-TW/moduleConfig.json | 0 .../web/public/i18n/locales/zh-TW/nodes.json | 0 .../web/public/i18n/locales/zh-TW/ui.json | 0 {packages => apps}/web/public/logo.svg | 0 {packages => apps}/web/public/robots.txt | 0 .../web/public/site.webmanifest | 0 {packages => apps}/web/src/App.tsx | 0 {packages => apps}/web/src/DeviceWrapper.tsx | 0 .../web/src/__mocks__/README.md | 0 .../src/__mocks__/components/UI/Button.tsx | 0 .../src/__mocks__/components/UI/Checkbox.tsx | 0 .../__mocks__/components/UI/Dialog/Dialog.tsx | 0 .../web/src/__mocks__/components/UI/Label.tsx | 0 .../web/src/__mocks__/components/UI/Link.tsx | 0 .../Badge/ConnectionStatusBadge.tsx | 0 .../src/components/Badge/SupportedBadge.tsx | 0 .../web/src/components/BatteryStatus.tsx | 0 .../src/components/CommandPalette/index.tsx | 0 .../web/src/components/DeviceInfoPanel.tsx | 0 .../AddConnectionDialog.tsx | 0 .../Dialog/AddConnectionDialog/validation.ts | 0 .../ClearAllStoresDialog.test.tsx | 0 .../ClearAllStoresDialog.tsx | 0 .../ClientNotificationDialog.tsx | 163 + .../DeleteMessagesDialog.test.tsx | 0 .../DeleteMessagesDialog.tsx | 0 .../src/components/Dialog/DialogManager.tsx | 0 .../src/components/Dialog/DialogWrapper.tsx | 0 .../FactoryResetConfigDialog.test.tsx | 0 .../FactoryResetConfigDialog.tsx | 0 .../FactoryResetDeviceDialog.test.tsx | 0 .../FactoryResetDeviceDialog.tsx | 0 .../src/components/Dialog/ImportDialog.tsx | 0 .../Dialog/LocationResponseDialog.tsx | 0 .../components/Dialog/ManagedModeDialog.tsx | 0 .../src/components/Dialog/NewDeviceDialog.tsx | 0 .../NodeDetailsDialog/NodeDetailsDialog.tsx | 23 + .../src/components/Dialog/PKIBackupDialog.tsx | 0 .../components/Dialog/PkiRegenerateDialog.tsx | 0 .../web/src/components/Dialog/QRDialog.tsx | 0 .../components/Dialog/RebootDialog.test.tsx | 0 .../src/components/Dialog/RebootDialog.tsx | 0 .../RefreshKeysDialog.test.tsx | 0 .../RefreshKeysDialog/RefreshKeysDialog.tsx | 0 .../RefreshKeysDialog/useRefreshKeysDialog.ts | 0 .../components/Dialog/RemoveNodeDialog.tsx | 0 .../ResetNodeDbDialog.test.tsx | 0 .../ResetNodeDbDialog/ResetNodeDbDialog.tsx | 0 .../src/components/Dialog/ShutdownDialog.tsx | 0 .../Dialog/TracerouteResponseDialog.tsx | 0 .../UnsafeRolesDialog/UnsafeRolesDialog.tsx | 0 .../useUnsafeRolesDialog.test.tsx | 0 .../UnsafeRolesDialog/useUnsafeRolesDialog.ts | 0 .../web/src/components/Dialog/useDialog.ts | 0 .../web/src/components/Form/DynamicForm.tsx | 0 .../src/components/Form/DynamicFormField.tsx | 0 .../web/src/components/Form/FormInput.tsx | 0 .../src/components/Form/FormMultiSelect.tsx | 0 .../components/Form/FormPasswordGenerator.tsx | 0 .../web/src/components/Form/FormSelect.tsx | 0 .../web/src/components/Form/FormToggle.tsx | 0 .../web/src/components/Form/FormWrapper.tsx | 0 .../src/components/Form/createZodResolver.ts | 0 .../web/src/components/KeyBackupReminder.tsx | 0 .../web/src/components/LanguageSwitcher.tsx | 0 {packages => apps}/web/src/components/Map.tsx | 0 .../PageComponents/Channels/Channel.tsx | 0 .../PageComponents/Channels/Channels.tsx | 0 .../Connections/ConnectionStatusBadge.tsx | 0 .../Map/Layers/HeatmapLayer.tsx | 0 .../PageComponents/Map/Layers/NodesLayer.tsx | 0 .../Map/Layers/PrecisionLayer.tsx | 0 .../PageComponents/Map/Layers/SNRLayer.tsx | 0 .../Map/Layers/WaypointLayer.tsx | 0 .../PageComponents/Map/Markers/NodeMarker.tsx | 0 .../PageComponents/Map/Markers/StackBadge.tsx | 0 .../PageComponents/Map/Popups/NodeDetail.tsx | 18 +- .../Map/Popups/PopupWrapper.tsx | 0 .../Map/Popups/WaypointDetail.tsx | 0 .../PageComponents/Map/Tools/MapLayerTool.tsx | 0 .../components/PageComponents/Map/cluster.ts | 0 .../PageComponents/Messages/ChannelChat.tsx | 0 .../Messages/MessageActionsMenu.tsx | 0 .../Messages/MessageInput.test.tsx | 0 .../PageComponents/Messages/MessageInput.tsx | 0 .../PageComponents/Messages/MessageItem.tsx | 0 .../Messages/TraceRoute.test.tsx | 0 .../PageComponents/Messages/TraceRoute.tsx | 0 .../ModuleConfig/AmbientLighting.tsx | 0 .../PageComponents/ModuleConfig/Audio.tsx | 0 .../ModuleConfig/CannedMessage.tsx | 0 .../ModuleConfig/DetectionSensor.tsx | 0 .../ModuleConfig/ExternalNotification.tsx | 0 .../PageComponents/ModuleConfig/MQTT.tsx | 0 .../ModuleConfig/NeighborInfo.tsx | 0 .../ModuleConfig/Paxcounter.tsx | 0 .../PageComponents/ModuleConfig/RangeTest.tsx | 0 .../ModuleConfig/RemoteHardware.tsx | 63 + .../PageComponents/ModuleConfig/Serial.tsx | 0 .../ModuleConfig/StatusMessage.tsx | 59 + .../ModuleConfig/StoreForward.tsx | 0 .../PageComponents/ModuleConfig/Tak.tsx | 65 + .../PageComponents/ModuleConfig/Telemetry.tsx | 6 + .../ModuleConfig/TrafficManagement.tsx | 141 + .../PageComponents/Settings/Bluetooth.tsx | 0 .../PageComponents/Settings/Device/index.tsx | 0 .../PageComponents/Settings/Display.tsx | 6 + .../PageComponents/Settings/LoRa.tsx | 16 + .../PageComponents/Settings/Network/index.tsx | 0 .../PageComponents/Settings/Position.tsx | 0 .../PageComponents/Settings/Power.tsx | 0 .../Settings/Security/Security.tsx | 0 .../PageComponents/Settings/User.tsx | 0 .../web/src/components/PageLayout.tsx | 0 .../web/src/components/Sidebar.tsx | 0 .../web/src/components/ThemeSwitcher.tsx | 0 .../web/src/components/Toaster.tsx | 0 .../web/src/components/UI/Accordion.tsx | 0 .../web/src/components/UI/AlertDialog.tsx | 0 .../web/src/components/UI/Avatar.tsx | 0 .../web/src/components/UI/Badge.tsx | 0 .../web/src/components/UI/Button.tsx | 0 .../web/src/components/UI/Card.tsx | 0 .../components/UI/Checkbox/Checkbox.test.tsx | 0 .../web/src/components/UI/Checkbox/index.tsx | 0 .../web/src/components/UI/Command.tsx | 0 .../web/src/components/UI/Dialog.tsx | 0 .../web/src/components/UI/DropdownMenu.tsx | 0 .../web/src/components/UI/ErrorPage.tsx | 0 .../web/src/components/UI/Footer.tsx | 0 .../web/src/components/UI/Generator.tsx | 0 .../web/src/components/UI/Input.tsx | 0 .../web/src/components/UI/Label.tsx | 0 .../web/src/components/UI/Menubar.tsx | 0 .../web/src/components/UI/MultiSelect.tsx | 0 .../web/src/components/UI/Popover.tsx | 0 .../web/src/components/UI/ScrollArea.tsx | 0 .../web/src/components/UI/Select.tsx | 0 .../web/src/components/UI/Separator.tsx | 0 .../components/UI/Sidebar/SidebarButton.tsx | 0 .../components/UI/Sidebar/SidebarSection.tsx | 0 .../web/src/components/UI/Skeleton.tsx | 0 .../web/src/components/UI/Slider.tsx | 0 .../web/src/components/UI/Spinner.tsx | 0 .../web/src/components/UI/Switch.tsx | 0 .../web/src/components/UI/Tabs.tsx | 0 .../web/src/components/UI/Toast.tsx | 0 .../web/src/components/UI/ToggleGroup.tsx | 0 .../web/src/components/UI/Tooltip.tsx | 0 .../components/UI/Typography/Blockquote.tsx | 0 .../web/src/components/UI/Typography/Code.tsx | 0 .../src/components/UI/Typography/Heading.tsx | 0 .../web/src/components/UI/Typography/Link.tsx | 0 .../web/src/components/UI/Typography/P.tsx | 0 .../src/components/UI/Typography/Subtle.tsx | 0 .../web/src/components/generic/Blur.tsx | 0 .../src/components/generic/DeviceImage.tsx | 0 .../generic/Filter/FilterComponents.tsx | 0 .../generic/Filter/FilterControl.tsx | 0 .../generic/Filter/useFilterNode.test.ts | 0 .../generic/Filter/useFilterNode.ts | 0 .../web/src/components/generic/Mono.tsx | 0 .../components/generic/Table/index.test.tsx | 0 .../src/components/generic/Table/index.tsx | 0 .../web/src/components/generic/TimeAgo.tsx | 0 .../web/src/components/generic/Uptime.tsx | 0 .../web/src/components/types.ts | 0 .../web/src/core/dto/NodeNumToNodeInfoDTO.ts | 0 .../web/src/core/dto/PacketToMessageDTO.ts | 0 .../core/hooks/useBrowserFeatureDetection.ts | 0 .../web/src/core/hooks/useCookie.ts | 0 .../web/src/core/hooks/useCopyToClipboard.ts | 0 .../web/src/core/hooks/useDeviceContext.ts | 0 .../src/core/hooks/useFavoriteNode.test.ts | 0 .../web/src/core/hooks/useFavoriteNode.ts | 0 .../web/src/core/hooks/useFeatureFlags.ts | 0 .../web/src/core/hooks/useIgnoreNode.test.ts | 0 .../web/src/core/hooks/useIgnoreNode.ts | 0 .../src/core/hooks/useKeyBackupReminder.tsx | 0 .../web/src/core/hooks/useLRUList.ts | 0 .../web/src/core/hooks/useLang.ts | 0 .../src/core/hooks/useLocalStorage.test.ts | 0 .../web/src/core/hooks/useLocalStorage.ts | 0 .../web/src/core/hooks/useMapFitting.ts | 0 .../web/src/core/hooks/useNewNodeNum.ts | 0 .../hooks/usePasswordVisibilityToggle.test.ts | 0 .../core/hooks/usePasswordVisibilityToggle.ts | 0 .../web/src/core/hooks/usePinnedItems.ts | 0 .../web/src/core/hooks/usePositionFlags.ts | 0 .../web/src/core/hooks/useTheme.ts | 0 .../web/src/core/hooks/useToast.test.tsx | 0 .../web/src/core/hooks/useToast.ts | 0 .../src/core/hooks/useToggleVisiblility.ts | 0 .../web/src/core/hooks/useWaitForConfig.ts | 0 .../web/src/core/services/dev-overrides.ts | 0 .../web/src/core/services/featureFlags.ts | 0 .../src/core/stores/appStore/appStore.test.ts | 0 .../web/src/core/stores/appStore/index.ts | 0 .../web/src/core/stores/appStore/types.ts | 0 .../core/stores/deviceStore/changeRegistry.ts | 6 +- .../stores/deviceStore/deviceStore.mock.ts | 0 .../stores/deviceStore/deviceStore.test.ts | 42 + .../web/src/core/stores/deviceStore/index.ts | 16 + .../src/core/stores/deviceStore/selectors.ts | 0 .../web/src/core/stores/deviceStore/types.ts | 0 .../web/src/core/stores/index.ts | 0 .../web/src/core/stores/messageStore/index.ts | 0 .../stores/messageStore/messageStore.test.ts | 0 .../web/src/core/stores/messageStore/types.ts | 0 .../web/src/core/stores/nodeDBStore/index.ts | 23 + .../stores/nodeDBStore/nodeDBStore.mock.ts | 1 + .../stores/nodeDBStore/nodeDBStore.test.ts | 68 + .../stores/nodeDBStore/nodeDBStore.test.tsx | 0 .../core/stores/nodeDBStore/nodeValidation.ts | 0 .../web/src/core/stores/nodeDBStore/types.ts | 0 .../src/core/stores/sidebarStore/index.tsx | 0 .../core/stores/utils/bindStoreToDevice.ts | 0 .../core/stores/utils/evictOldestEntries.ts | 0 .../web/src/core/stores/utils/indexDB.test.ts | 0 .../web/src/core/stores/utils/indexDB.ts | 0 .../web/src/core/subscriptions.ts | 11 +- .../web/src/core/utils/bitwise.ts | 0 {packages => apps}/web/src/core/utils/cn.ts | 0 .../web/src/core/utils/color.test.ts | 0 .../web/src/core/utils/color.ts | 0 .../web/src/core/utils/debounce.test.ts | 0 .../web/src/core/utils/debounce.ts | 0 .../src/core/utils/deepCompareConfig.test.ts | 0 .../web/src/core/utils/deepCompareConfig.ts | 0 .../web/src/core/utils/dotPath.test.ts | 0 .../web/src/core/utils/dotPath.ts | 0 .../web/src/core/utils/eventBus.test.ts | 0 .../web/src/core/utils/eventBus.ts | 0 {packages => apps}/web/src/core/utils/geo.ts | 0 .../web/src/core/utils/github.ts | 0 .../web/src/core/utils/ip.test.ts | 0 {packages => apps}/web/src/core/utils/ip.ts | 0 .../web/src/core/utils/randId.test.ts | 0 .../web/src/core/utils/randId.ts | 0 .../web/src/core/utils/signalColor.ts | 0 {packages => apps}/web/src/core/utils/sort.ts | 0 .../web/src/core/utils/string.ts | 0 .../web/src/core/utils/x25519.ts | 0 {packages => apps}/web/src/i18n-config.ts | 0 {packages => apps}/web/src/index.css | 0 {packages => apps}/web/src/index.tsx | 0 .../web/src/pages/Connections/index.tsx | 0 .../src/pages/Connections/useConnections.ts | 0 .../web/src/pages/Connections/utils.ts | 0 .../web/src/pages/Map/index.tsx | 0 {packages => apps}/web/src/pages/Messages.tsx | 0 .../web/src/pages/Nodes/index.tsx | 18 +- .../web/src/pages/Settings/DeviceConfig.tsx | 0 .../web/src/pages/Settings/ModuleConfig.tsx | 20 + .../web/src/pages/Settings/RadioConfig.tsx | 0 .../web/src/pages/Settings/index.tsx | 0 {packages => apps}/web/src/routes.tsx | 0 apps/web/src/sdk-preview/README.md | 69 + .../sdk-preview/adapters/fromMeshDevice.ts | 42 + .../sdk-preview/core/client/MeshClientPort.ts | 34 + .../src/sdk-preview/core/errors/MeshError.ts | 30 + apps/web/src/sdk-preview/core/index.ts | 3 + .../sdk-preview/core/signals/createStore.ts | 104 + .../web/src/sdk-preview/core/signals/index.ts | 1 + .../config/__tests__/ConfigEditor.test.ts | 157 + .../config/application/ConfigUseCases.ts | 53 + .../features/config/domain/ConfigEditor.ts | 234 + .../features/config/domain/ModuleConfig.ts | 20 + .../features/config/domain/RadioConfig.ts | 19 + .../src/sdk-preview/features/config/index.ts | 4 + .../config/infrastructure/ConfigMapper.ts | 26 + .../config/infrastructure/configBuilders.ts | 27 + apps/web/src/sdk-preview/index.ts | 12 + .../src/sdk-preview/react/useConfigEditor.ts | 16 + apps/web/src/sdk-preview/react/useSignal.ts | 16 + {packages => apps}/web/src/tests/setup.ts | 0 .../web/src/tests/test-utils.tsx | 0 .../web/src/validation/channel.test.ts | 0 .../web/src/validation/channel.ts | 0 .../web/src/validation/config/bluetooth.ts | 0 .../web/src/validation/config/device.ts | 0 .../web/src/validation/config/display.ts | 1 + .../web/src/validation/config/lora.test.ts | 0 .../web/src/validation/config/lora.ts | 3 + .../web/src/validation/config/network.ts | 0 .../web/src/validation/config/position.ts | 0 .../web/src/validation/config/power.ts | 0 .../src/validation/config/security.test.ts | 0 .../web/src/validation/config/security.ts | 0 .../web/src/validation/config/user.ts | 0 .../moduleConfig/ambientLighting.ts | 0 .../web/src/validation/moduleConfig/audio.ts | 0 .../validation/moduleConfig/cannedMessage.ts | 0 .../moduleConfig/detectionSensor.ts | 0 .../moduleConfig/externalNotification.ts | 0 .../web/src/validation/moduleConfig/mqtt.ts | 0 .../validation/moduleConfig/neighborInfo.ts | 0 .../src/validation/moduleConfig/paxcounter.ts | 0 .../src/validation/moduleConfig/rangeTest.ts | 0 .../validation/moduleConfig/remoteHardware.ts | 11 + .../web/src/validation/moduleConfig/serial.ts | 0 .../validation/moduleConfig/statusMessage.ts | 7 + .../validation/moduleConfig/storeForward.ts | 0 apps/web/src/validation/moduleConfig/tak.ts | 12 + .../src/validation/moduleConfig/telemetry.ts | 1 + .../moduleConfig/trafficManagement.ts | 20 + .../web/src/validation/pskSchema.test.ts | 0 .../web/src/validation/pskSchema.ts | 0 .../web/src/validation/validate.ts | 0 {packages => apps}/web/tsconfig.json | 0 {packages => apps}/web/vercel.json | 0 {packages => apps}/web/vite-env.d.ts | 0 {packages => apps}/web/vite.config.ts | 0 {packages => apps}/web/vitest.config.ts | 0 package.json | 2 +- packages/core/package.json | 1 + packages/core/src/meshDevice.ts | 70 +- packages/protobufs/meshtastic/admin.proto | 314 +- packages/protobufs/meshtastic/apponly.proto | 2 +- packages/protobufs/meshtastic/atak.proto | 1974 ++++++- .../protobufs/meshtastic/cannedmessages.proto | 2 +- packages/protobufs/meshtastic/channel.proto | 12 +- .../protobufs/meshtastic/clientonly.proto | 2 +- packages/protobufs/meshtastic/config.proto | 155 +- .../meshtastic/connection_status.proto | 2 +- packages/protobufs/meshtastic/device_ui.proto | 2 +- .../protobufs/meshtastic/deviceonly.proto | 122 +- .../meshtastic/deviceonly_legacy.proto | 50 + .../protobufs/meshtastic/interdevice.proto | 2 +- packages/protobufs/meshtastic/localonly.proto | 17 +- packages/protobufs/meshtastic/mesh.proto | 447 +- .../protobufs/meshtastic/module_config.proto | 137 +- packages/protobufs/meshtastic/mqtt.proto | 2 +- packages/protobufs/meshtastic/paxcount.proto | 2 +- packages/protobufs/meshtastic/portnums.proto | 43 +- packages/protobufs/meshtastic/powermon.proto | 2 +- .../meshtastic/remote_hardware.proto | 2 +- packages/protobufs/meshtastic/rtttl.proto | 2 +- .../protobufs/meshtastic/serial_hal.proto | 63 + .../protobufs/meshtastic/storeforward.proto | 2 +- packages/protobufs/meshtastic/telemetry.proto | 144 +- packages/protobufs/meshtastic/xmodem.proto | 2 +- packages/protobufs/package.json | 16 +- .../packages/ts/dist/meshtastic/admin_pb.ts | 1559 ++++++ .../packages/ts/dist/meshtastic/apponly_pb.ts | 53 + .../packages/ts/dist/meshtastic/atak_pb.ts | 4216 ++++++++++++++ .../ts/dist/meshtastic/cannedmessages_pb.ts | 37 + .../packages/ts/dist/meshtastic/channel_pb.ts | 248 + .../ts/dist/meshtastic/clientonly_pb.ts | 98 + .../packages/ts/dist/meshtastic/config_pb.ts | 2314 ++++++++ .../dist/meshtastic/connection_status_pb.ts | 237 + .../ts/dist/meshtastic/device_ui_pb.ts | 698 +++ .../dist/meshtastic/deviceonly_legacy_pb.ts | 132 + .../ts/dist/meshtastic/deviceonly_pb.ts | 636 +++ .../ts/dist/meshtastic/interdevice_pb.ts | 160 + .../ts/dist/meshtastic/localonly_pb.ts | 254 + .../packages/ts/dist/meshtastic/mesh_pb.ts | 4852 +++++++++++++++++ .../ts/dist/meshtastic/module_config_pb.ts | 1889 +++++++ .../packages/ts/dist/meshtastic/mqtt_pb.ts | 189 + .../ts/dist/meshtastic/paxcount_pb.ts | 53 + .../ts/dist/meshtastic/portnums_pb.ts | 412 ++ .../ts/dist/meshtastic/powermon_pb.ts | 308 ++ .../ts/dist/meshtastic/remote_hardware_pb.ts | 126 + .../packages/ts/dist/meshtastic/rtttl_pb.ts | 37 + .../ts/dist/meshtastic/serial_hal_pb.ts | 188 + .../ts/dist/meshtastic/storeforward_pb.ts | 384 ++ .../ts/dist/meshtastic/telemetry_pb.ts | 1603 ++++++ .../packages/ts/dist/meshtastic/xmodem_pb.ts | 97 + .../protobufs/packages/ts/dist/nanopb_pb.ts | 463 ++ packages/protobufs/packages/ts/mod.ts | 40 +- .../ClientNotificationDialog.tsx | 69 - pnpm-lock.yaml | 958 ++-- pnpm-workspace.yaml | 1 + tsconfig.json | 2 +- vitest.config.ts | 2 +- 695 files changed, 27038 insertions(+), 786 deletions(-) create mode 100644 PR-NOTES.md rename {packages => apps}/web/.oxfmtrc.json (100%) rename {packages => apps}/web/.oxlintrc.json (100%) rename {packages => apps}/web/CONTRIBUTING.md (100%) rename {packages => apps}/web/CONTRIBUTING_I18N_DEVELOPER_GUIDE.md (100%) rename {packages => apps}/web/CONTRIBUTING_TRANSLATIONS.md (100%) rename {packages => apps}/web/README.md (100%) rename {packages => apps}/web/crowdin.yml (100%) rename {packages => apps}/web/index.html (100%) rename {packages => apps}/web/infra/.dockerignore (100%) rename {packages => apps}/web/infra/Containerfile (100%) rename {packages => apps}/web/infra/default.conf (100%) rename {packages => apps}/web/package.json (98%) rename {packages => apps}/web/public/apple-touch-icon.png (100%) rename {packages => apps}/web/public/chirpy.svg (100%) rename {packages => apps}/web/public/devices/diy.svg (100%) rename {packages => apps}/web/public/devices/heltec-ht62-esp32c3-sx1262.svg (100%) rename {packages => apps}/web/public/devices/heltec-mesh-node-t114-case.svg (100%) rename {packages => apps}/web/public/devices/heltec-mesh-node-t114.svg (100%) rename {packages => apps}/web/public/devices/heltec-v3-case.svg (100%) rename {packages => apps}/web/public/devices/heltec-v3.svg (100%) rename {packages => apps}/web/public/devices/heltec-vision-master-e213.svg (100%) rename {packages => apps}/web/public/devices/heltec-vision-master-e290.svg (100%) rename {packages => apps}/web/public/devices/heltec-vision-master-t190.svg (100%) rename {packages => apps}/web/public/devices/heltec-wireless-paper-V1_0.svg (100%) rename {packages => apps}/web/public/devices/heltec-wireless-paper.svg (100%) rename {packages => apps}/web/public/devices/heltec-wireless-tracker-V1-0.svg (100%) rename {packages => apps}/web/public/devices/heltec-wireless-tracker.svg (100%) rename {packages => apps}/web/public/devices/heltec-wsl-v3.svg (100%) rename {packages => apps}/web/public/devices/nano-g2-ultra.svg (100%) rename {packages => apps}/web/public/devices/pico.svg (100%) rename {packages => apps}/web/public/devices/promicro.svg (100%) rename {packages => apps}/web/public/devices/rak-wismeshtap.svg (100%) rename {packages => apps}/web/public/devices/rak11310.svg (100%) rename {packages => apps}/web/public/devices/rak2560.svg (100%) rename {packages => apps}/web/public/devices/rak4631.svg (100%) rename {packages => apps}/web/public/devices/rak4631_case.svg (100%) rename {packages => apps}/web/public/devices/rpipicow.svg (100%) rename {packages => apps}/web/public/devices/seeed-sensecap-indicator.svg (100%) rename {packages => apps}/web/public/devices/seeed-xiao-s3.svg (100%) rename {packages => apps}/web/public/devices/station-g2.svg (100%) rename {packages => apps}/web/public/devices/t-deck.svg (100%) rename {packages => apps}/web/public/devices/t-echo.svg (100%) rename {packages => apps}/web/public/devices/t-watch-s3.svg (100%) rename {packages => apps}/web/public/devices/tbeam-s3-core.svg (100%) rename {packages => apps}/web/public/devices/tbeam.svg (100%) rename {packages => apps}/web/public/devices/tlora-c6.svg (100%) rename {packages => apps}/web/public/devices/tlora-t3s3-epaper.svg (100%) rename {packages => apps}/web/public/devices/tlora-t3s3-v1.svg (100%) rename {packages => apps}/web/public/devices/tlora-v2-1-1_6.svg (100%) rename {packages => apps}/web/public/devices/tlora-v2-1-1_8.svg (100%) rename {packages => apps}/web/public/devices/tracker-t1000-e.svg (100%) rename {packages => apps}/web/public/devices/unknown.svg (100%) rename {packages => apps}/web/public/devices/wio-tracker-wm1110.svg (100%) rename {packages => apps}/web/public/devices/wm1110_dev_kit.svg (100%) rename {packages => apps}/web/public/favicon.ico (100%) rename {packages => apps}/web/public/fonts/InterVariable-Italic.woff2 (100%) rename {packages => apps}/web/public/fonts/InterVariable.woff2 (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/common.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/config.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/map.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/be-BY/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/common.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/config.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/map.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/bg-BG/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/common.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/config.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/map.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/cs-CZ/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/common.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/config.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/map.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/de-DE/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/en/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/en/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/en/common.json (99%) rename {packages => apps}/web/public/i18n/locales/en/config.json (96%) rename {packages => apps}/web/public/i18n/locales/en/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/en/dialog.json (93%) rename {packages => apps}/web/public/i18n/locales/en/map.json (100%) rename {packages => apps}/web/public/i18n/locales/en/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/en/moduleConfig.json (79%) rename {packages => apps}/web/public/i18n/locales/en/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/en/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/common.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/config.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/map.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/es-ES/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/common.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/config.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/map.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/fi-FI/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/common.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/config.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/map.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/fr-FR/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/common.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/config.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/map.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/hu-HU/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/common.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/config.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/map.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/it-IT/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/common.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/config.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/map.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/ja-JP/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/common.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/config.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/map.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/ko-KR/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/common.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/config.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/map.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/nl-NL/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/common.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/config.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/map.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/pl-PL/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/common.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/config.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/map.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-BR/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/common.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/config.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/map.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/pt-PT/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/common.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/config.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/map.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/ru-RU/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/common.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/config.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/map.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/sv-SE/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/common.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/config.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/map.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/tr-TR/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/common.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/config.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/map.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/uk-UA/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/common.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/config.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/deviceConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/map.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-CN/ui.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/channels.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/commandPalette.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/common.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/config.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/connections.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/dashboard.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/dialog.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/map.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/messages.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/moduleConfig.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/nodes.json (100%) rename {packages => apps}/web/public/i18n/locales/zh-TW/ui.json (100%) rename {packages => apps}/web/public/logo.svg (100%) rename {packages => apps}/web/public/robots.txt (100%) rename {packages => apps}/web/public/site.webmanifest (100%) rename {packages => apps}/web/src/App.tsx (100%) rename {packages => apps}/web/src/DeviceWrapper.tsx (100%) rename {packages => apps}/web/src/__mocks__/README.md (100%) rename {packages => apps}/web/src/__mocks__/components/UI/Button.tsx (100%) rename {packages => apps}/web/src/__mocks__/components/UI/Checkbox.tsx (100%) rename {packages => apps}/web/src/__mocks__/components/UI/Dialog/Dialog.tsx (100%) rename {packages => apps}/web/src/__mocks__/components/UI/Label.tsx (100%) rename {packages => apps}/web/src/__mocks__/components/UI/Link.tsx (100%) rename {packages => apps}/web/src/components/Badge/ConnectionStatusBadge.tsx (100%) rename {packages => apps}/web/src/components/Badge/SupportedBadge.tsx (100%) rename {packages => apps}/web/src/components/BatteryStatus.tsx (100%) rename {packages => apps}/web/src/components/CommandPalette/index.tsx (100%) rename {packages => apps}/web/src/components/DeviceInfoPanel.tsx (100%) rename {packages => apps}/web/src/components/Dialog/AddConnectionDialog/AddConnectionDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/AddConnectionDialog/validation.ts (100%) rename {packages => apps}/web/src/components/Dialog/ClearAllStoresDialog/ClearAllStoresDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/ClearAllStoresDialog/ClearAllStoresDialog.tsx (100%) create mode 100644 apps/web/src/components/Dialog/ClientNotificationDialog/ClientNotificationDialog.tsx rename {packages => apps}/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/DialogManager.tsx (100%) rename {packages => apps}/web/src/components/Dialog/DialogWrapper.tsx (100%) rename {packages => apps}/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/ImportDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/LocationResponseDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/ManagedModeDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/NewDeviceDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx (95%) rename {packages => apps}/web/src/components/Dialog/PKIBackupDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/PkiRegenerateDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/QRDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/RebootDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/RebootDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/RefreshKeysDialog/useRefreshKeysDialog.ts (100%) rename {packages => apps}/web/src/components/Dialog/RemoveNodeDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/ShutdownDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/TracerouteResponseDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx (100%) rename {packages => apps}/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.test.tsx (100%) rename {packages => apps}/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts (100%) rename {packages => apps}/web/src/components/Dialog/useDialog.ts (100%) rename {packages => apps}/web/src/components/Form/DynamicForm.tsx (100%) rename {packages => apps}/web/src/components/Form/DynamicFormField.tsx (100%) rename {packages => apps}/web/src/components/Form/FormInput.tsx (100%) rename {packages => apps}/web/src/components/Form/FormMultiSelect.tsx (100%) rename {packages => apps}/web/src/components/Form/FormPasswordGenerator.tsx (100%) rename {packages => apps}/web/src/components/Form/FormSelect.tsx (100%) rename {packages => apps}/web/src/components/Form/FormToggle.tsx (100%) rename {packages => apps}/web/src/components/Form/FormWrapper.tsx (100%) rename {packages => apps}/web/src/components/Form/createZodResolver.ts (100%) rename {packages => apps}/web/src/components/KeyBackupReminder.tsx (100%) rename {packages => apps}/web/src/components/LanguageSwitcher.tsx (100%) rename {packages => apps}/web/src/components/Map.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Channels/Channel.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Channels/Channels.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Connections/ConnectionStatusBadge.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Layers/NodesLayer.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Layers/PrecisionLayer.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Layers/WaypointLayer.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Markers/NodeMarker.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Markers/StackBadge.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx (91%) rename {packages => apps}/web/src/components/PageComponents/Map/Popups/PopupWrapper.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Map/cluster.ts (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/ChannelChat.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/MessageInput.test.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/MessageInput.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/MessageItem.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/TraceRoute.test.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Messages/TraceRoute.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/Audio.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/MQTT.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx (100%) create mode 100644 apps/web/src/components/PageComponents/ModuleConfig/RemoteHardware.tsx rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/Serial.tsx (100%) create mode 100644 apps/web/src/components/PageComponents/ModuleConfig/StatusMessage.tsx rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx (100%) create mode 100644 apps/web/src/components/PageComponents/ModuleConfig/Tak.tsx rename {packages => apps}/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx (94%) create mode 100644 apps/web/src/components/PageComponents/ModuleConfig/TrafficManagement.tsx rename {packages => apps}/web/src/components/PageComponents/Settings/Bluetooth.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Settings/Device/index.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Settings/Display.tsx (95%) rename {packages => apps}/web/src/components/PageComponents/Settings/LoRa.tsx (91%) rename {packages => apps}/web/src/components/PageComponents/Settings/Network/index.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Settings/Position.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Settings/Power.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Settings/Security/Security.tsx (100%) rename {packages => apps}/web/src/components/PageComponents/Settings/User.tsx (100%) rename {packages => apps}/web/src/components/PageLayout.tsx (100%) rename {packages => apps}/web/src/components/Sidebar.tsx (100%) rename {packages => apps}/web/src/components/ThemeSwitcher.tsx (100%) rename {packages => apps}/web/src/components/Toaster.tsx (100%) rename {packages => apps}/web/src/components/UI/Accordion.tsx (100%) rename {packages => apps}/web/src/components/UI/AlertDialog.tsx (100%) rename {packages => apps}/web/src/components/UI/Avatar.tsx (100%) rename {packages => apps}/web/src/components/UI/Badge.tsx (100%) rename {packages => apps}/web/src/components/UI/Button.tsx (100%) rename {packages => apps}/web/src/components/UI/Card.tsx (100%) rename {packages => apps}/web/src/components/UI/Checkbox/Checkbox.test.tsx (100%) rename {packages => apps}/web/src/components/UI/Checkbox/index.tsx (100%) rename {packages => apps}/web/src/components/UI/Command.tsx (100%) rename {packages => apps}/web/src/components/UI/Dialog.tsx (100%) rename {packages => apps}/web/src/components/UI/DropdownMenu.tsx (100%) rename {packages => apps}/web/src/components/UI/ErrorPage.tsx (100%) rename {packages => apps}/web/src/components/UI/Footer.tsx (100%) rename {packages => apps}/web/src/components/UI/Generator.tsx (100%) rename {packages => apps}/web/src/components/UI/Input.tsx (100%) rename {packages => apps}/web/src/components/UI/Label.tsx (100%) rename {packages => apps}/web/src/components/UI/Menubar.tsx (100%) rename {packages => apps}/web/src/components/UI/MultiSelect.tsx (100%) rename {packages => apps}/web/src/components/UI/Popover.tsx (100%) rename {packages => apps}/web/src/components/UI/ScrollArea.tsx (100%) rename {packages => apps}/web/src/components/UI/Select.tsx (100%) rename {packages => apps}/web/src/components/UI/Separator.tsx (100%) rename {packages => apps}/web/src/components/UI/Sidebar/SidebarButton.tsx (100%) rename {packages => apps}/web/src/components/UI/Sidebar/SidebarSection.tsx (100%) rename {packages => apps}/web/src/components/UI/Skeleton.tsx (100%) rename {packages => apps}/web/src/components/UI/Slider.tsx (100%) rename {packages => apps}/web/src/components/UI/Spinner.tsx (100%) rename {packages => apps}/web/src/components/UI/Switch.tsx (100%) rename {packages => apps}/web/src/components/UI/Tabs.tsx (100%) rename {packages => apps}/web/src/components/UI/Toast.tsx (100%) rename {packages => apps}/web/src/components/UI/ToggleGroup.tsx (100%) rename {packages => apps}/web/src/components/UI/Tooltip.tsx (100%) rename {packages => apps}/web/src/components/UI/Typography/Blockquote.tsx (100%) rename {packages => apps}/web/src/components/UI/Typography/Code.tsx (100%) rename {packages => apps}/web/src/components/UI/Typography/Heading.tsx (100%) rename {packages => apps}/web/src/components/UI/Typography/Link.tsx (100%) rename {packages => apps}/web/src/components/UI/Typography/P.tsx (100%) rename {packages => apps}/web/src/components/UI/Typography/Subtle.tsx (100%) rename {packages => apps}/web/src/components/generic/Blur.tsx (100%) rename {packages => apps}/web/src/components/generic/DeviceImage.tsx (100%) rename {packages => apps}/web/src/components/generic/Filter/FilterComponents.tsx (100%) rename {packages => apps}/web/src/components/generic/Filter/FilterControl.tsx (100%) rename {packages => apps}/web/src/components/generic/Filter/useFilterNode.test.ts (100%) rename {packages => apps}/web/src/components/generic/Filter/useFilterNode.ts (100%) rename {packages => apps}/web/src/components/generic/Mono.tsx (100%) rename {packages => apps}/web/src/components/generic/Table/index.test.tsx (100%) rename {packages => apps}/web/src/components/generic/Table/index.tsx (100%) rename {packages => apps}/web/src/components/generic/TimeAgo.tsx (100%) rename {packages => apps}/web/src/components/generic/Uptime.tsx (100%) rename {packages => apps}/web/src/components/types.ts (100%) rename {packages => apps}/web/src/core/dto/NodeNumToNodeInfoDTO.ts (100%) rename {packages => apps}/web/src/core/dto/PacketToMessageDTO.ts (100%) rename {packages => apps}/web/src/core/hooks/useBrowserFeatureDetection.ts (100%) rename {packages => apps}/web/src/core/hooks/useCookie.ts (100%) rename {packages => apps}/web/src/core/hooks/useCopyToClipboard.ts (100%) rename {packages => apps}/web/src/core/hooks/useDeviceContext.ts (100%) rename {packages => apps}/web/src/core/hooks/useFavoriteNode.test.ts (100%) rename {packages => apps}/web/src/core/hooks/useFavoriteNode.ts (100%) rename {packages => apps}/web/src/core/hooks/useFeatureFlags.ts (100%) rename {packages => apps}/web/src/core/hooks/useIgnoreNode.test.ts (100%) rename {packages => apps}/web/src/core/hooks/useIgnoreNode.ts (100%) rename {packages => apps}/web/src/core/hooks/useKeyBackupReminder.tsx (100%) rename {packages => apps}/web/src/core/hooks/useLRUList.ts (100%) rename {packages => apps}/web/src/core/hooks/useLang.ts (100%) rename {packages => apps}/web/src/core/hooks/useLocalStorage.test.ts (100%) rename {packages => apps}/web/src/core/hooks/useLocalStorage.ts (100%) rename {packages => apps}/web/src/core/hooks/useMapFitting.ts (100%) rename {packages => apps}/web/src/core/hooks/useNewNodeNum.ts (100%) rename {packages => apps}/web/src/core/hooks/usePasswordVisibilityToggle.test.ts (100%) rename {packages => apps}/web/src/core/hooks/usePasswordVisibilityToggle.ts (100%) rename {packages => apps}/web/src/core/hooks/usePinnedItems.ts (100%) rename {packages => apps}/web/src/core/hooks/usePositionFlags.ts (100%) rename {packages => apps}/web/src/core/hooks/useTheme.ts (100%) rename {packages => apps}/web/src/core/hooks/useToast.test.tsx (100%) rename {packages => apps}/web/src/core/hooks/useToast.ts (100%) rename {packages => apps}/web/src/core/hooks/useToggleVisiblility.ts (100%) rename {packages => apps}/web/src/core/hooks/useWaitForConfig.ts (100%) rename {packages => apps}/web/src/core/services/dev-overrides.ts (100%) rename {packages => apps}/web/src/core/services/featureFlags.ts (100%) rename {packages => apps}/web/src/core/stores/appStore/appStore.test.ts (100%) rename {packages => apps}/web/src/core/stores/appStore/index.ts (100%) rename {packages => apps}/web/src/core/stores/appStore/types.ts (100%) rename {packages => apps}/web/src/core/stores/deviceStore/changeRegistry.ts (98%) rename {packages => apps}/web/src/core/stores/deviceStore/deviceStore.mock.ts (100%) rename {packages => apps}/web/src/core/stores/deviceStore/deviceStore.test.ts (91%) rename {packages => apps}/web/src/core/stores/deviceStore/index.ts (98%) rename {packages => apps}/web/src/core/stores/deviceStore/selectors.ts (100%) rename {packages => apps}/web/src/core/stores/deviceStore/types.ts (100%) rename {packages => apps}/web/src/core/stores/index.ts (100%) rename {packages => apps}/web/src/core/stores/messageStore/index.ts (100%) rename {packages => apps}/web/src/core/stores/messageStore/messageStore.test.ts (100%) rename {packages => apps}/web/src/core/stores/messageStore/types.ts (100%) rename {packages => apps}/web/src/core/stores/nodeDBStore/index.ts (95%) rename {packages => apps}/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts (96%) create mode 100644 apps/web/src/core/stores/nodeDBStore/nodeDBStore.test.ts rename {packages => apps}/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx (100%) rename {packages => apps}/web/src/core/stores/nodeDBStore/nodeValidation.ts (100%) rename {packages => apps}/web/src/core/stores/nodeDBStore/types.ts (100%) rename {packages => apps}/web/src/core/stores/sidebarStore/index.tsx (100%) rename {packages => apps}/web/src/core/stores/utils/bindStoreToDevice.ts (100%) rename {packages => apps}/web/src/core/stores/utils/evictOldestEntries.ts (100%) rename {packages => apps}/web/src/core/stores/utils/indexDB.test.ts (100%) rename {packages => apps}/web/src/core/stores/utils/indexDB.ts (100%) rename {packages => apps}/web/src/core/subscriptions.ts (92%) rename {packages => apps}/web/src/core/utils/bitwise.ts (100%) rename {packages => apps}/web/src/core/utils/cn.ts (100%) rename {packages => apps}/web/src/core/utils/color.test.ts (100%) rename {packages => apps}/web/src/core/utils/color.ts (100%) rename {packages => apps}/web/src/core/utils/debounce.test.ts (100%) rename {packages => apps}/web/src/core/utils/debounce.ts (100%) rename {packages => apps}/web/src/core/utils/deepCompareConfig.test.ts (100%) rename {packages => apps}/web/src/core/utils/deepCompareConfig.ts (100%) rename {packages => apps}/web/src/core/utils/dotPath.test.ts (100%) rename {packages => apps}/web/src/core/utils/dotPath.ts (100%) rename {packages => apps}/web/src/core/utils/eventBus.test.ts (100%) rename {packages => apps}/web/src/core/utils/eventBus.ts (100%) rename {packages => apps}/web/src/core/utils/geo.ts (100%) rename {packages => apps}/web/src/core/utils/github.ts (100%) rename {packages => apps}/web/src/core/utils/ip.test.ts (100%) rename {packages => apps}/web/src/core/utils/ip.ts (100%) rename {packages => apps}/web/src/core/utils/randId.test.ts (100%) rename {packages => apps}/web/src/core/utils/randId.ts (100%) rename {packages => apps}/web/src/core/utils/signalColor.ts (100%) rename {packages => apps}/web/src/core/utils/sort.ts (100%) rename {packages => apps}/web/src/core/utils/string.ts (100%) rename {packages => apps}/web/src/core/utils/x25519.ts (100%) rename {packages => apps}/web/src/i18n-config.ts (100%) rename {packages => apps}/web/src/index.css (100%) rename {packages => apps}/web/src/index.tsx (100%) rename {packages => apps}/web/src/pages/Connections/index.tsx (100%) rename {packages => apps}/web/src/pages/Connections/useConnections.ts (100%) rename {packages => apps}/web/src/pages/Connections/utils.ts (100%) rename {packages => apps}/web/src/pages/Map/index.tsx (100%) rename {packages => apps}/web/src/pages/Messages.tsx (100%) rename {packages => apps}/web/src/pages/Nodes/index.tsx (93%) rename {packages => apps}/web/src/pages/Settings/DeviceConfig.tsx (100%) rename {packages => apps}/web/src/pages/Settings/ModuleConfig.tsx (84%) rename {packages => apps}/web/src/pages/Settings/RadioConfig.tsx (100%) rename {packages => apps}/web/src/pages/Settings/index.tsx (100%) rename {packages => apps}/web/src/routes.tsx (100%) create mode 100644 apps/web/src/sdk-preview/README.md create mode 100644 apps/web/src/sdk-preview/adapters/fromMeshDevice.ts create mode 100644 apps/web/src/sdk-preview/core/client/MeshClientPort.ts create mode 100644 apps/web/src/sdk-preview/core/errors/MeshError.ts create mode 100644 apps/web/src/sdk-preview/core/index.ts create mode 100644 apps/web/src/sdk-preview/core/signals/createStore.ts create mode 100644 apps/web/src/sdk-preview/core/signals/index.ts create mode 100644 apps/web/src/sdk-preview/features/config/__tests__/ConfigEditor.test.ts create mode 100644 apps/web/src/sdk-preview/features/config/application/ConfigUseCases.ts create mode 100644 apps/web/src/sdk-preview/features/config/domain/ConfigEditor.ts create mode 100644 apps/web/src/sdk-preview/features/config/domain/ModuleConfig.ts create mode 100644 apps/web/src/sdk-preview/features/config/domain/RadioConfig.ts create mode 100644 apps/web/src/sdk-preview/features/config/index.ts create mode 100644 apps/web/src/sdk-preview/features/config/infrastructure/ConfigMapper.ts create mode 100644 apps/web/src/sdk-preview/features/config/infrastructure/configBuilders.ts create mode 100644 apps/web/src/sdk-preview/index.ts create mode 100644 apps/web/src/sdk-preview/react/useConfigEditor.ts create mode 100644 apps/web/src/sdk-preview/react/useSignal.ts rename {packages => apps}/web/src/tests/setup.ts (100%) rename {packages => apps}/web/src/tests/test-utils.tsx (100%) rename {packages => apps}/web/src/validation/channel.test.ts (100%) rename {packages => apps}/web/src/validation/channel.ts (100%) rename {packages => apps}/web/src/validation/config/bluetooth.ts (100%) rename {packages => apps}/web/src/validation/config/device.ts (100%) rename {packages => apps}/web/src/validation/config/display.ts (96%) rename {packages => apps}/web/src/validation/config/lora.test.ts (100%) rename {packages => apps}/web/src/validation/config/lora.ts (88%) rename {packages => apps}/web/src/validation/config/network.ts (100%) rename {packages => apps}/web/src/validation/config/position.ts (100%) rename {packages => apps}/web/src/validation/config/power.ts (100%) rename {packages => apps}/web/src/validation/config/security.test.ts (100%) rename {packages => apps}/web/src/validation/config/security.ts (100%) rename {packages => apps}/web/src/validation/config/user.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/ambientLighting.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/audio.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/cannedMessage.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/detectionSensor.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/externalNotification.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/mqtt.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/neighborInfo.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/paxcounter.ts (100%) rename {packages => apps}/web/src/validation/moduleConfig/rangeTest.ts (100%) create mode 100644 apps/web/src/validation/moduleConfig/remoteHardware.ts rename {packages => apps}/web/src/validation/moduleConfig/serial.ts (100%) create mode 100644 apps/web/src/validation/moduleConfig/statusMessage.ts rename {packages => apps}/web/src/validation/moduleConfig/storeForward.ts (100%) create mode 100644 apps/web/src/validation/moduleConfig/tak.ts rename {packages => apps}/web/src/validation/moduleConfig/telemetry.ts (94%) create mode 100644 apps/web/src/validation/moduleConfig/trafficManagement.ts rename {packages => apps}/web/src/validation/pskSchema.test.ts (100%) rename {packages => apps}/web/src/validation/pskSchema.ts (100%) rename {packages => apps}/web/src/validation/validate.ts (100%) rename {packages => apps}/web/tsconfig.json (100%) rename {packages => apps}/web/vercel.json (100%) rename {packages => apps}/web/vite-env.d.ts (100%) rename {packages => apps}/web/vite.config.ts (100%) rename {packages => apps}/web/vitest.config.ts (100%) create mode 100644 packages/protobufs/meshtastic/deviceonly_legacy.proto create mode 100644 packages/protobufs/meshtastic/serial_hal.proto create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/admin_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/apponly_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/atak_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/cannedmessages_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/channel_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/clientonly_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/config_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/connection_status_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/device_ui_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/deviceonly_legacy_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/deviceonly_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/interdevice_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/localonly_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/mesh_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/module_config_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/mqtt_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/paxcount_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/portnums_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/powermon_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/remote_hardware_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/rtttl_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/serial_hal_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/storeforward_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/telemetry_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/meshtastic/xmodem_pb.ts create mode 100644 packages/protobufs/packages/ts/dist/nanopb_pb.ts delete mode 100644 packages/web/src/components/Dialog/ClientNotificationDialog/ClientNotificationDialog.tsx diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index f5f56b64..3d44f90b 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -37,18 +37,18 @@ jobs: run: pnpm run test - name: Build web package - working-directory: packages/web + working-directory: apps/web run: pnpm run build - name: Package output - working-directory: packages/web + working-directory: apps/web run: pnpm run package - name: Upload compressed build (artifact) uses: actions/upload-artifact@v7 with: name: web-build-nightly - path: packages/web/dist/build.tar + path: apps/web/dist/build.tar if-no-files-found: error - name: Compute tags and labels @@ -64,8 +64,8 @@ jobs: # Try to use latest release tag if it exists; fallback to package version; else date LATEST_TAG="$(gh release view --json tagName --jq .tagName 2>/dev/null || true)" - if [ -z "$LATEST_TAG" ] && [ -f packages/web/package.json ]; then - LATEST_TAG="v$(jq -r .version packages/web/package.json)" + if [ -z "$LATEST_TAG" ] && [ -f apps/web/package.json ]; then + LATEST_TAG="v$(jq -r .version apps/web/package.json)" fi if [ -n "${LATEST_TAG:-}" ] && [ "$LATEST_TAG" != "vnull" ]; then @@ -89,7 +89,7 @@ jobs: uses: redhat-actions/buildah-build@v2 with: containerfiles: | - ./packages/web/infra/Containerfile + ./apps/web/infra/Containerfile image: ${{ env.REGISTRY_IMAGE }} tags: | ${{ steps.meta.outputs.moving_tag }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index db91b65d..b9683b35 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -57,4 +57,4 @@ jobs: run: pnpm run test - name: Build web package - run: pnpm --filter "./packages/web" run build + run: pnpm --filter "./apps/web" run build diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 4409fa51..f9be28ca 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -49,25 +49,25 @@ jobs: run: pnpm install --frozen-lockfile - name: Build web package - working-directory: packages/web + working-directory: apps/web run: pnpm run build - name: Create release archive - working-directory: packages/web + working-directory: apps/web run: pnpm run package - name: Upload archive (artifact) uses: actions/upload-artifact@v7 with: name: web-build - path: packages/web/dist/build.tar + path: apps/web/dist/build.tar if-no-files-found: error - name: Attach archive to GitHub Release if: ${{ github.event_name == 'release' || inputs.attach_to_release == true }} uses: softprops/action-gh-release@v3 with: - files: packages/web/dist/build.tar + files: apps/web/dist/build.tar tag_name: ${{ github.event_name == 'release' && github.event.release.tag_name || inputs.tag_name }} fail_on_unmatched_files: true env: @@ -132,7 +132,7 @@ jobs: uses: docker/build-push-action@v7 with: context: . - file: ./packages/web/infra/Containerfile + file: ./apps/web/infra/Containerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 push: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.tag_name != '') }} tags: ${{ steps.meta.outputs.tags }} diff --git a/PR-NOTES.md b/PR-NOTES.md new file mode 100644 index 00000000..adf96300 --- /dev/null +++ b/PR-NOTES.md @@ -0,0 +1,65 @@ +# Protobuf catch-up to firmware-current + +> Draft PR description + the one decision for maintainers. This file is **untracked** — +> use it as the PR body, then delete it (or leave it, it won't be committed). + +## What this does + +- Syncs the vendored `.proto` sources in `packages/protobufs/meshtastic/` from ~v2.7.20 to + **firmware-current (v2.7.25 + 48 commits)** — +2 new files (`deviceonly_legacy`, `serial_hal`) + and additions across `config` / `module_config` / `mesh` / `admin` / `portnums` / `telemetry`. +- Regenerates the v2 TS bindings (`buf generate`). +- Makes the app consume the **workspace** protobufs (`workspace:*`) instead of the stale JSR + `@meshtastic/protobufs@2.7.20`, finishing the monorepo migration that was half-done + (`@meshtastic/core` was already `workspace:*`; protobufs was still on JSR). +- One breaking-change fix: `admin.proto` `nodedb_reset` changed `int32 → bool`, so + `MeshDevice.resetNodes()` now sends `value: true` (the oneof-case presence triggers the + reset; `true` preserves favorites through it). + +## Free wins (dynamic enum dropdowns — no UI code) + +New LoRa regions (ITU/EU amateur bands), modem presets (LONG_TURBO, LITE/NARROW/TINY_*), +~25 hardware names, `OLED_SH1107_ROTATED`, serial `LOG`/`LOGTEXT` — they flow into the +existing enum-bound ` setSecurityNumber(e.target.value)} + placeholder={t("keyVerification.request.placeholder")} + /> + + + + + + ); + } + + case "keyVerificationFinal": { + const value = variant.value; + return ( + <> + + {t("keyVerification.final.title")} + + {t("keyVerification.final.description", { name: value.remoteLongname })} + + +

+ {value.verificationCharacters} +

+ + + + + + ); + } + + default: + return ( + + {t("clientNotification.title")} + + {t([`clientNotification.${notification?.message}`, notification?.message ?? ""])} + + + ); + } + })(); + + return ( + + + + {dialogContent} + + + ); +}; diff --git a/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx b/apps/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx rename to apps/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.test.tsx diff --git a/packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx b/apps/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx rename to apps/web/src/components/Dialog/DeleteMessagesDialog/DeleteMessagesDialog.tsx diff --git a/packages/web/src/components/Dialog/DialogManager.tsx b/apps/web/src/components/Dialog/DialogManager.tsx similarity index 100% rename from packages/web/src/components/Dialog/DialogManager.tsx rename to apps/web/src/components/Dialog/DialogManager.tsx diff --git a/packages/web/src/components/Dialog/DialogWrapper.tsx b/apps/web/src/components/Dialog/DialogWrapper.tsx similarity index 100% rename from packages/web/src/components/Dialog/DialogWrapper.tsx rename to apps/web/src/components/Dialog/DialogWrapper.tsx diff --git a/packages/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.test.tsx b/apps/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.test.tsx rename to apps/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.test.tsx diff --git a/packages/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.tsx b/apps/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.tsx rename to apps/web/src/components/Dialog/FactoryResetConfigDialog/FactoryResetConfigDialog.tsx diff --git a/packages/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.test.tsx b/apps/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.test.tsx rename to apps/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.test.tsx diff --git a/packages/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.tsx b/apps/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.tsx rename to apps/web/src/components/Dialog/FactoryResetDeviceDialog/FactoryResetDeviceDialog.tsx diff --git a/packages/web/src/components/Dialog/ImportDialog.tsx b/apps/web/src/components/Dialog/ImportDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/ImportDialog.tsx rename to apps/web/src/components/Dialog/ImportDialog.tsx diff --git a/packages/web/src/components/Dialog/LocationResponseDialog.tsx b/apps/web/src/components/Dialog/LocationResponseDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/LocationResponseDialog.tsx rename to apps/web/src/components/Dialog/LocationResponseDialog.tsx diff --git a/packages/web/src/components/Dialog/ManagedModeDialog.tsx b/apps/web/src/components/Dialog/ManagedModeDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/ManagedModeDialog.tsx rename to apps/web/src/components/Dialog/ManagedModeDialog.tsx diff --git a/packages/web/src/components/Dialog/NewDeviceDialog.tsx b/apps/web/src/components/Dialog/NewDeviceDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/NewDeviceDialog.tsx rename to apps/web/src/components/Dialog/NewDeviceDialog.tsx diff --git a/packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx b/apps/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx similarity index 95% rename from packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx rename to apps/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx index 16a292f4..e0924009 100644 --- a/packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx +++ b/apps/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx @@ -38,6 +38,7 @@ import { BellOffIcon, MapPinnedIcon, MessageSquareIcon, + ShieldCheckIcon, StarIcon, TrashIcon, WaypointsIcon, @@ -116,6 +117,22 @@ export const NodeDetailsDialog = ({ open, onOpenChange }: NodeDetailsDialogProps onOpenChange(false); } + function handleInitiateKeyVerification() { + if (!node) { + return; + } + connection + ?.sendKeyVerification( + Protobuf.Admin.KeyVerificationAdmin_MessageType.INITIATE_VERIFICATION, + node.num, + 0n, + ) + .catch((error) => { + console.error("Failed to initiate key verification:", error); + }); + onOpenChange(false); + } + function handleNodeRemove() { if (!node) { return; @@ -207,6 +224,12 @@ export const NodeDetailsDialog = ({ open, onOpenChange }: NodeDetailsDialogProps className={cn(isFavoriteState ? " fill-yellow-400 stroke-yellow-400" : "")} /> + {node.user?.publicKey && node.user.publicKey.length > 0 && ( + + )}
diff --git a/packages/web/src/components/Dialog/PKIBackupDialog.tsx b/apps/web/src/components/Dialog/PKIBackupDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/PKIBackupDialog.tsx rename to apps/web/src/components/Dialog/PKIBackupDialog.tsx diff --git a/packages/web/src/components/Dialog/PkiRegenerateDialog.tsx b/apps/web/src/components/Dialog/PkiRegenerateDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/PkiRegenerateDialog.tsx rename to apps/web/src/components/Dialog/PkiRegenerateDialog.tsx diff --git a/packages/web/src/components/Dialog/QRDialog.tsx b/apps/web/src/components/Dialog/QRDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/QRDialog.tsx rename to apps/web/src/components/Dialog/QRDialog.tsx diff --git a/packages/web/src/components/Dialog/RebootDialog.test.tsx b/apps/web/src/components/Dialog/RebootDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/RebootDialog.test.tsx rename to apps/web/src/components/Dialog/RebootDialog.test.tsx diff --git a/packages/web/src/components/Dialog/RebootDialog.tsx b/apps/web/src/components/Dialog/RebootDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/RebootDialog.tsx rename to apps/web/src/components/Dialog/RebootDialog.tsx diff --git a/packages/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.test.tsx b/apps/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.test.tsx rename to apps/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.test.tsx diff --git a/packages/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx b/apps/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx rename to apps/web/src/components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx diff --git a/packages/web/src/components/Dialog/RefreshKeysDialog/useRefreshKeysDialog.ts b/apps/web/src/components/Dialog/RefreshKeysDialog/useRefreshKeysDialog.ts similarity index 100% rename from packages/web/src/components/Dialog/RefreshKeysDialog/useRefreshKeysDialog.ts rename to apps/web/src/components/Dialog/RefreshKeysDialog/useRefreshKeysDialog.ts diff --git a/packages/web/src/components/Dialog/RemoveNodeDialog.tsx b/apps/web/src/components/Dialog/RemoveNodeDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/RemoveNodeDialog.tsx rename to apps/web/src/components/Dialog/RemoveNodeDialog.tsx diff --git a/packages/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.test.tsx b/apps/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.test.tsx rename to apps/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.test.tsx diff --git a/packages/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.tsx b/apps/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.tsx rename to apps/web/src/components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.tsx diff --git a/packages/web/src/components/Dialog/ShutdownDialog.tsx b/apps/web/src/components/Dialog/ShutdownDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/ShutdownDialog.tsx rename to apps/web/src/components/Dialog/ShutdownDialog.tsx diff --git a/packages/web/src/components/Dialog/TracerouteResponseDialog.tsx b/apps/web/src/components/Dialog/TracerouteResponseDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/TracerouteResponseDialog.tsx rename to apps/web/src/components/Dialog/TracerouteResponseDialog.tsx diff --git a/packages/web/src/components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx b/apps/web/src/components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx similarity index 100% rename from packages/web/src/components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx rename to apps/web/src/components/Dialog/UnsafeRolesDialog/UnsafeRolesDialog.tsx diff --git a/packages/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.test.tsx b/apps/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.test.tsx similarity index 100% rename from packages/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.test.tsx rename to apps/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.test.tsx diff --git a/packages/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts b/apps/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts similarity index 100% rename from packages/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts rename to apps/web/src/components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts diff --git a/packages/web/src/components/Dialog/useDialog.ts b/apps/web/src/components/Dialog/useDialog.ts similarity index 100% rename from packages/web/src/components/Dialog/useDialog.ts rename to apps/web/src/components/Dialog/useDialog.ts diff --git a/packages/web/src/components/Form/DynamicForm.tsx b/apps/web/src/components/Form/DynamicForm.tsx similarity index 100% rename from packages/web/src/components/Form/DynamicForm.tsx rename to apps/web/src/components/Form/DynamicForm.tsx diff --git a/packages/web/src/components/Form/DynamicFormField.tsx b/apps/web/src/components/Form/DynamicFormField.tsx similarity index 100% rename from packages/web/src/components/Form/DynamicFormField.tsx rename to apps/web/src/components/Form/DynamicFormField.tsx diff --git a/packages/web/src/components/Form/FormInput.tsx b/apps/web/src/components/Form/FormInput.tsx similarity index 100% rename from packages/web/src/components/Form/FormInput.tsx rename to apps/web/src/components/Form/FormInput.tsx diff --git a/packages/web/src/components/Form/FormMultiSelect.tsx b/apps/web/src/components/Form/FormMultiSelect.tsx similarity index 100% rename from packages/web/src/components/Form/FormMultiSelect.tsx rename to apps/web/src/components/Form/FormMultiSelect.tsx diff --git a/packages/web/src/components/Form/FormPasswordGenerator.tsx b/apps/web/src/components/Form/FormPasswordGenerator.tsx similarity index 100% rename from packages/web/src/components/Form/FormPasswordGenerator.tsx rename to apps/web/src/components/Form/FormPasswordGenerator.tsx diff --git a/packages/web/src/components/Form/FormSelect.tsx b/apps/web/src/components/Form/FormSelect.tsx similarity index 100% rename from packages/web/src/components/Form/FormSelect.tsx rename to apps/web/src/components/Form/FormSelect.tsx diff --git a/packages/web/src/components/Form/FormToggle.tsx b/apps/web/src/components/Form/FormToggle.tsx similarity index 100% rename from packages/web/src/components/Form/FormToggle.tsx rename to apps/web/src/components/Form/FormToggle.tsx diff --git a/packages/web/src/components/Form/FormWrapper.tsx b/apps/web/src/components/Form/FormWrapper.tsx similarity index 100% rename from packages/web/src/components/Form/FormWrapper.tsx rename to apps/web/src/components/Form/FormWrapper.tsx diff --git a/packages/web/src/components/Form/createZodResolver.ts b/apps/web/src/components/Form/createZodResolver.ts similarity index 100% rename from packages/web/src/components/Form/createZodResolver.ts rename to apps/web/src/components/Form/createZodResolver.ts diff --git a/packages/web/src/components/KeyBackupReminder.tsx b/apps/web/src/components/KeyBackupReminder.tsx similarity index 100% rename from packages/web/src/components/KeyBackupReminder.tsx rename to apps/web/src/components/KeyBackupReminder.tsx diff --git a/packages/web/src/components/LanguageSwitcher.tsx b/apps/web/src/components/LanguageSwitcher.tsx similarity index 100% rename from packages/web/src/components/LanguageSwitcher.tsx rename to apps/web/src/components/LanguageSwitcher.tsx diff --git a/packages/web/src/components/Map.tsx b/apps/web/src/components/Map.tsx similarity index 100% rename from packages/web/src/components/Map.tsx rename to apps/web/src/components/Map.tsx diff --git a/packages/web/src/components/PageComponents/Channels/Channel.tsx b/apps/web/src/components/PageComponents/Channels/Channel.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Channels/Channel.tsx rename to apps/web/src/components/PageComponents/Channels/Channel.tsx diff --git a/packages/web/src/components/PageComponents/Channels/Channels.tsx b/apps/web/src/components/PageComponents/Channels/Channels.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Channels/Channels.tsx rename to apps/web/src/components/PageComponents/Channels/Channels.tsx diff --git a/packages/web/src/components/PageComponents/Connections/ConnectionStatusBadge.tsx b/apps/web/src/components/PageComponents/Connections/ConnectionStatusBadge.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Connections/ConnectionStatusBadge.tsx rename to apps/web/src/components/PageComponents/Connections/ConnectionStatusBadge.tsx diff --git a/packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx b/apps/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx rename to apps/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx diff --git a/packages/web/src/components/PageComponents/Map/Layers/NodesLayer.tsx b/apps/web/src/components/PageComponents/Map/Layers/NodesLayer.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Layers/NodesLayer.tsx rename to apps/web/src/components/PageComponents/Map/Layers/NodesLayer.tsx diff --git a/packages/web/src/components/PageComponents/Map/Layers/PrecisionLayer.tsx b/apps/web/src/components/PageComponents/Map/Layers/PrecisionLayer.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Layers/PrecisionLayer.tsx rename to apps/web/src/components/PageComponents/Map/Layers/PrecisionLayer.tsx diff --git a/packages/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx b/apps/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx rename to apps/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx diff --git a/packages/web/src/components/PageComponents/Map/Layers/WaypointLayer.tsx b/apps/web/src/components/PageComponents/Map/Layers/WaypointLayer.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Layers/WaypointLayer.tsx rename to apps/web/src/components/PageComponents/Map/Layers/WaypointLayer.tsx diff --git a/packages/web/src/components/PageComponents/Map/Markers/NodeMarker.tsx b/apps/web/src/components/PageComponents/Map/Markers/NodeMarker.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Markers/NodeMarker.tsx rename to apps/web/src/components/PageComponents/Map/Markers/NodeMarker.tsx diff --git a/packages/web/src/components/PageComponents/Map/Markers/StackBadge.tsx b/apps/web/src/components/PageComponents/Map/Markers/StackBadge.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Markers/StackBadge.tsx rename to apps/web/src/components/PageComponents/Map/Markers/StackBadge.tsx diff --git a/packages/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx b/apps/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx similarity index 91% rename from packages/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx rename to apps/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx index 301e039b..e28231dd 100644 --- a/packages/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx +++ b/apps/web/src/components/PageComponents/Map/Popups/NodeDetail.tsx @@ -37,6 +37,10 @@ export const NodeDetail = ({ node }: NodeDetailProps) => { ? t("unset") : rawHardwareType.replaceAll("_", " ") : `${hwModel}`; + // SNR is in dB; derive a 0–100% quality heuristic (-10 dB → 0%, +10 dB → 100%). + const snrQuality = Math.min(Math.max(Math.round((node.snr + 10) * 5), 0), 100); + const snrTone = + snrQuality >= 67 ? "text-green-600" : snrQuality >= 34 ? "text-yellow-600" : "text-red-600"; function handleDirectMessage() { navigate({ to: `/messages/direct/${node.num}` }); } @@ -180,14 +184,12 @@ export const NodeDetail = ({ node }: NodeDetailProps) => { {node.snr !== 0 && (
{t("unit.snr")}
- - {node.snr} - {t("unit.dbm")} - - {Math.min(Math.max((node.snr + 10) * 5, 0), 100)}% - - {(node.snr + 10) * 5} - {t("unit.raw")} + + + {Number(node.snr.toFixed(1))} {t("unit.db")} + + + {snrQuality}%
)} diff --git a/packages/web/src/components/PageComponents/Map/Popups/PopupWrapper.tsx b/apps/web/src/components/PageComponents/Map/Popups/PopupWrapper.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Popups/PopupWrapper.tsx rename to apps/web/src/components/PageComponents/Map/Popups/PopupWrapper.tsx diff --git a/packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx b/apps/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx rename to apps/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx diff --git a/packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx b/apps/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx rename to apps/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx diff --git a/packages/web/src/components/PageComponents/Map/cluster.ts b/apps/web/src/components/PageComponents/Map/cluster.ts similarity index 100% rename from packages/web/src/components/PageComponents/Map/cluster.ts rename to apps/web/src/components/PageComponents/Map/cluster.ts diff --git a/packages/web/src/components/PageComponents/Messages/ChannelChat.tsx b/apps/web/src/components/PageComponents/Messages/ChannelChat.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/ChannelChat.tsx rename to apps/web/src/components/PageComponents/Messages/ChannelChat.tsx diff --git a/packages/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx b/apps/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx rename to apps/web/src/components/PageComponents/Messages/MessageActionsMenu.tsx diff --git a/packages/web/src/components/PageComponents/Messages/MessageInput.test.tsx b/apps/web/src/components/PageComponents/Messages/MessageInput.test.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/MessageInput.test.tsx rename to apps/web/src/components/PageComponents/Messages/MessageInput.test.tsx diff --git a/packages/web/src/components/PageComponents/Messages/MessageInput.tsx b/apps/web/src/components/PageComponents/Messages/MessageInput.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/MessageInput.tsx rename to apps/web/src/components/PageComponents/Messages/MessageInput.tsx diff --git a/packages/web/src/components/PageComponents/Messages/MessageItem.tsx b/apps/web/src/components/PageComponents/Messages/MessageItem.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/MessageItem.tsx rename to apps/web/src/components/PageComponents/Messages/MessageItem.tsx diff --git a/packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx b/apps/web/src/components/PageComponents/Messages/TraceRoute.test.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx rename to apps/web/src/components/PageComponents/Messages/TraceRoute.test.tsx diff --git a/packages/web/src/components/PageComponents/Messages/TraceRoute.tsx b/apps/web/src/components/PageComponents/Messages/TraceRoute.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Messages/TraceRoute.tsx rename to apps/web/src/components/PageComponents/Messages/TraceRoute.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx b/apps/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Audio.tsx b/apps/web/src/components/PageComponents/ModuleConfig/Audio.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/Audio.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/Audio.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx b/apps/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/CannedMessage.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx b/apps/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx b/apps/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/MQTT.tsx b/apps/web/src/components/PageComponents/ModuleConfig/MQTT.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/MQTT.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/MQTT.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx b/apps/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx b/apps/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/Paxcounter.tsx diff --git a/packages/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx b/apps/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/RangeTest.tsx diff --git a/apps/web/src/components/PageComponents/ModuleConfig/RemoteHardware.tsx b/apps/web/src/components/PageComponents/ModuleConfig/RemoteHardware.tsx new file mode 100644 index 00000000..636321b8 --- /dev/null +++ b/apps/web/src/components/PageComponents/ModuleConfig/RemoteHardware.tsx @@ -0,0 +1,63 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; +import { + type RemoteHardwareValidation, + RemoteHardwareValidationSchema, +} from "@app/validation/moduleConfig/remoteHardware.ts"; +import { DynamicForm, type DynamicFormFormInit } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { useTranslation } from "react-i18next"; + +interface RemoteHardwareModuleConfigProps { + onFormInit: DynamicFormFormInit; +} + +export const RemoteHardware = ({ onFormInit }: RemoteHardwareModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "remoteHardware" }); + + const { moduleConfig, setChange, getEffectiveModuleConfig, removeChange } = useDevice(); + const { t } = useTranslation("moduleConfig"); + + const onSubmit = (data: RemoteHardwareValidation) => { + if (deepCompareConfig(moduleConfig.remoteHardware, data, true)) { + removeChange({ type: "moduleConfig", variant: "remoteHardware" }); + return; + } + + setChange( + { type: "moduleConfig", variant: "remoteHardware" }, + data, + moduleConfig.remoteHardware, + ); + }; + + return ( + + onSubmit={onSubmit} + onFormInit={onFormInit} + validationSchema={RemoteHardwareValidationSchema} + defaultValues={moduleConfig.remoteHardware} + values={getEffectiveModuleConfig("remoteHardware")} + fieldGroups={[ + { + label: t("remoteHardware.title"), + description: t("remoteHardware.description"), + fields: [ + { + type: "toggle", + name: "enabled", + label: t("remoteHardware.enabled.label"), + description: t("remoteHardware.enabled.description"), + }, + { + type: "toggle", + name: "allowUndefinedPinAccess", + label: t("remoteHardware.allowUndefinedPinAccess.label"), + description: t("remoteHardware.allowUndefinedPinAccess.description"), + }, + ], + }, + ]} + /> + ); +}; diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Serial.tsx b/apps/web/src/components/PageComponents/ModuleConfig/Serial.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/Serial.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/Serial.tsx diff --git a/apps/web/src/components/PageComponents/ModuleConfig/StatusMessage.tsx b/apps/web/src/components/PageComponents/ModuleConfig/StatusMessage.tsx new file mode 100644 index 00000000..76545cd6 --- /dev/null +++ b/apps/web/src/components/PageComponents/ModuleConfig/StatusMessage.tsx @@ -0,0 +1,59 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; +import { + type StatusMessageValidation, + StatusMessageValidationSchema, +} from "@app/validation/moduleConfig/statusMessage.ts"; +import { DynamicForm, type DynamicFormFormInit } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { useTranslation } from "react-i18next"; + +interface StatusMessageModuleConfigProps { + onFormInit: DynamicFormFormInit; +} + +export const StatusMessage = ({ onFormInit }: StatusMessageModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "statusmessage" }); + + const { moduleConfig, setChange, getEffectiveModuleConfig, removeChange } = useDevice(); + const { t } = useTranslation("moduleConfig"); + + const onSubmit = (data: StatusMessageValidation) => { + if (deepCompareConfig(moduleConfig.statusmessage, data, true)) { + removeChange({ type: "moduleConfig", variant: "statusmessage" }); + return; + } + + setChange({ type: "moduleConfig", variant: "statusmessage" }, data, moduleConfig.statusmessage); + }; + + return ( + + onSubmit={onSubmit} + onFormInit={onFormInit} + validationSchema={StatusMessageValidationSchema} + defaultValues={moduleConfig.statusmessage} + values={getEffectiveModuleConfig("statusmessage")} + fieldGroups={[ + { + label: t("statusMessage.title"), + description: t("statusMessage.description"), + fields: [ + { + type: "text", + name: "nodeStatus", + label: t("statusMessage.nodeStatus.label"), + description: t("statusMessage.nodeStatus.description"), + properties: { + fieldLength: { + max: 200, + showCharacterCount: true, + }, + }, + }, + ], + }, + ]} + /> + ); +}; diff --git a/packages/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx b/apps/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx similarity index 100% rename from packages/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/StoreForward.tsx diff --git a/apps/web/src/components/PageComponents/ModuleConfig/Tak.tsx b/apps/web/src/components/PageComponents/ModuleConfig/Tak.tsx new file mode 100644 index 00000000..7a5776a1 --- /dev/null +++ b/apps/web/src/components/PageComponents/ModuleConfig/Tak.tsx @@ -0,0 +1,65 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; +import { type TakValidation, TakValidationSchema } from "@app/validation/moduleConfig/tak.ts"; +import { DynamicForm, type DynamicFormFormInit } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { Protobuf } from "@meshtastic/core"; +import { useTranslation } from "react-i18next"; + +interface TakModuleConfigProps { + onFormInit: DynamicFormFormInit; +} + +export const Tak = ({ onFormInit }: TakModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "tak" }); + + const { moduleConfig, setChange, getEffectiveModuleConfig, removeChange } = useDevice(); + const { t } = useTranslation("moduleConfig"); + + const onSubmit = (data: TakValidation) => { + if (deepCompareConfig(moduleConfig.tak, data, true)) { + removeChange({ type: "moduleConfig", variant: "tak" }); + return; + } + + setChange({ type: "moduleConfig", variant: "tak" }, data, moduleConfig.tak); + }; + + return ( + + onSubmit={onSubmit} + onFormInit={onFormInit} + validationSchema={TakValidationSchema} + defaultValues={moduleConfig.tak} + values={getEffectiveModuleConfig("tak")} + fieldGroups={[ + { + label: t("tak.title"), + description: t("tak.description"), + fields: [ + { + type: "select", + name: "team", + label: t("tak.team.label"), + description: t("tak.team.description"), + properties: { + enumValue: Protobuf.ATAK.Team, + formatEnumName: true, + }, + }, + { + type: "select", + name: "role", + label: t("tak.role.label"), + description: t("tak.role.description"), + properties: { + enumValue: Protobuf.ATAK.MemberRole, + formatEnumName: true, + }, + }, + ], + }, + ]} + /> + ); +}; diff --git a/packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx b/apps/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx similarity index 94% rename from packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx rename to apps/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx index 9d2a35b2..f6c25602 100644 --- a/packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx +++ b/apps/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx @@ -87,6 +87,12 @@ export const Telemetry = ({ onFormInit }: TelemetryModuleConfigProps) => { label: t("telemetry.airQualityInterval.label"), description: t("telemetry.airQualityInterval.description"), }, + { + type: "toggle", + name: "airQualityScreenEnabled", + label: t("telemetry.airQualityScreenEnabled.label"), + description: t("telemetry.airQualityScreenEnabled.description"), + }, { type: "toggle", name: "powerMeasurementEnabled", diff --git a/apps/web/src/components/PageComponents/ModuleConfig/TrafficManagement.tsx b/apps/web/src/components/PageComponents/ModuleConfig/TrafficManagement.tsx new file mode 100644 index 00000000..4ff4c6b0 --- /dev/null +++ b/apps/web/src/components/PageComponents/ModuleConfig/TrafficManagement.tsx @@ -0,0 +1,141 @@ +import { useWaitForConfig } from "@app/core/hooks/useWaitForConfig"; +import { + type TrafficManagementValidation, + TrafficManagementValidationSchema, +} from "@app/validation/moduleConfig/trafficManagement.ts"; +import { DynamicForm, type DynamicFormFormInit } from "@components/Form/DynamicForm.tsx"; +import { useDevice } from "@core/stores"; +import { deepCompareConfig } from "@core/utils/deepCompareConfig.ts"; +import { useTranslation } from "react-i18next"; + +interface TrafficManagementModuleConfigProps { + onFormInit: DynamicFormFormInit; +} + +export const TrafficManagement = ({ onFormInit }: TrafficManagementModuleConfigProps) => { + useWaitForConfig({ moduleConfigCase: "trafficManagement" }); + + const { moduleConfig, setChange, getEffectiveModuleConfig, removeChange } = useDevice(); + const { t } = useTranslation("moduleConfig"); + + const onSubmit = (data: TrafficManagementValidation) => { + if (deepCompareConfig(moduleConfig.trafficManagement, data, true)) { + removeChange({ type: "moduleConfig", variant: "trafficManagement" }); + return; + } + + setChange( + { type: "moduleConfig", variant: "trafficManagement" }, + data, + moduleConfig.trafficManagement, + ); + }; + + return ( + + onSubmit={onSubmit} + onFormInit={onFormInit} + validationSchema={TrafficManagementValidationSchema} + defaultValues={moduleConfig.trafficManagement} + values={getEffectiveModuleConfig("trafficManagement")} + fieldGroups={[ + { + label: t("trafficManagement.title"), + description: t("trafficManagement.description"), + fields: [ + { + type: "toggle", + name: "enabled", + label: t("trafficManagement.enabled.label"), + description: t("trafficManagement.enabled.description"), + }, + { + type: "toggle", + name: "positionDedupEnabled", + label: t("trafficManagement.positionDedupEnabled.label"), + description: t("trafficManagement.positionDedupEnabled.description"), + }, + { + type: "number", + name: "positionPrecisionBits", + label: t("trafficManagement.positionPrecisionBits.label"), + description: t("trafficManagement.positionPrecisionBits.description"), + }, + { + type: "number", + name: "positionMinIntervalSecs", + label: t("trafficManagement.positionMinIntervalSecs.label"), + description: t("trafficManagement.positionMinIntervalSecs.description"), + properties: { + suffix: t("unit.second.plural"), + }, + }, + { + type: "toggle", + name: "nodeinfoDirectResponse", + label: t("trafficManagement.nodeinfoDirectResponse.label"), + description: t("trafficManagement.nodeinfoDirectResponse.description"), + }, + { + type: "number", + name: "nodeinfoDirectResponseMaxHops", + label: t("trafficManagement.nodeinfoDirectResponseMaxHops.label"), + description: t("trafficManagement.nodeinfoDirectResponseMaxHops.description"), + }, + { + type: "toggle", + name: "rateLimitEnabled", + label: t("trafficManagement.rateLimitEnabled.label"), + description: t("trafficManagement.rateLimitEnabled.description"), + }, + { + type: "number", + name: "rateLimitWindowSecs", + label: t("trafficManagement.rateLimitWindowSecs.label"), + description: t("trafficManagement.rateLimitWindowSecs.description"), + properties: { + suffix: t("unit.second.plural"), + }, + }, + { + type: "number", + name: "rateLimitMaxPackets", + label: t("trafficManagement.rateLimitMaxPackets.label"), + description: t("trafficManagement.rateLimitMaxPackets.description"), + }, + { + type: "toggle", + name: "dropUnknownEnabled", + label: t("trafficManagement.dropUnknownEnabled.label"), + description: t("trafficManagement.dropUnknownEnabled.description"), + }, + { + type: "number", + name: "unknownPacketThreshold", + label: t("trafficManagement.unknownPacketThreshold.label"), + description: t("trafficManagement.unknownPacketThreshold.description"), + }, + { + type: "toggle", + name: "exhaustHopTelemetry", + label: t("trafficManagement.exhaustHopTelemetry.label"), + description: t("trafficManagement.exhaustHopTelemetry.description"), + }, + { + type: "toggle", + name: "exhaustHopPosition", + label: t("trafficManagement.exhaustHopPosition.label"), + description: t("trafficManagement.exhaustHopPosition.description"), + }, + { + type: "toggle", + name: "routerPreserveHops", + label: t("trafficManagement.routerPreserveHops.label"), + description: t("trafficManagement.routerPreserveHops.description"), + }, + ], + }, + ]} + /> + ); +}; diff --git a/packages/web/src/components/PageComponents/Settings/Bluetooth.tsx b/apps/web/src/components/PageComponents/Settings/Bluetooth.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/Bluetooth.tsx rename to apps/web/src/components/PageComponents/Settings/Bluetooth.tsx diff --git a/packages/web/src/components/PageComponents/Settings/Device/index.tsx b/apps/web/src/components/PageComponents/Settings/Device/index.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/Device/index.tsx rename to apps/web/src/components/PageComponents/Settings/Device/index.tsx diff --git a/packages/web/src/components/PageComponents/Settings/Display.tsx b/apps/web/src/components/PageComponents/Settings/Display.tsx similarity index 95% rename from packages/web/src/components/PageComponents/Settings/Display.tsx rename to apps/web/src/components/PageComponents/Settings/Display.tsx index b3fa3991..ff995e3b 100644 --- a/packages/web/src/components/PageComponents/Settings/Display.tsx +++ b/apps/web/src/components/PageComponents/Settings/Display.tsx @@ -125,6 +125,12 @@ export const Display = ({ onFormInit }: DisplayConfigProps) => { label: t("display.wakeOnTapOrMotion.label"), description: t("display.wakeOnTapOrMotion.description"), }, + { + type: "toggle", + name: "enableMessageBubbles", + label: t("display.enableMessageBubbles.label"), + description: t("display.enableMessageBubbles.description"), + }, ], }, ]} diff --git a/packages/web/src/components/PageComponents/Settings/LoRa.tsx b/apps/web/src/components/PageComponents/Settings/LoRa.tsx similarity index 91% rename from packages/web/src/components/PageComponents/Settings/LoRa.tsx rename to apps/web/src/components/PageComponents/Settings/LoRa.tsx index c6aee182..c475360b 100644 --- a/packages/web/src/components/PageComponents/Settings/LoRa.tsx +++ b/apps/web/src/components/PageComponents/Settings/LoRa.tsx @@ -194,6 +194,22 @@ export const LoRa = ({ onFormInit }: LoRaConfigProps) => { step: 0.001, }, }, + { + type: "select", + name: "femLnaMode", + label: t("lora.femLnaMode.label"), + description: t("lora.femLnaMode.description"), + properties: { + enumValue: Protobuf.Config.Config_LoRaConfig_FEM_LNA_Mode, + formatEnumName: true, + }, + }, + { + type: "toggle", + name: "serialHalOnly", + label: t("lora.serialHalOnly.label"), + description: t("lora.serialHalOnly.description"), + }, ], }, ]} diff --git a/packages/web/src/components/PageComponents/Settings/Network/index.tsx b/apps/web/src/components/PageComponents/Settings/Network/index.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/Network/index.tsx rename to apps/web/src/components/PageComponents/Settings/Network/index.tsx diff --git a/packages/web/src/components/PageComponents/Settings/Position.tsx b/apps/web/src/components/PageComponents/Settings/Position.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/Position.tsx rename to apps/web/src/components/PageComponents/Settings/Position.tsx diff --git a/packages/web/src/components/PageComponents/Settings/Power.tsx b/apps/web/src/components/PageComponents/Settings/Power.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/Power.tsx rename to apps/web/src/components/PageComponents/Settings/Power.tsx diff --git a/packages/web/src/components/PageComponents/Settings/Security/Security.tsx b/apps/web/src/components/PageComponents/Settings/Security/Security.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/Security/Security.tsx rename to apps/web/src/components/PageComponents/Settings/Security/Security.tsx diff --git a/packages/web/src/components/PageComponents/Settings/User.tsx b/apps/web/src/components/PageComponents/Settings/User.tsx similarity index 100% rename from packages/web/src/components/PageComponents/Settings/User.tsx rename to apps/web/src/components/PageComponents/Settings/User.tsx diff --git a/packages/web/src/components/PageLayout.tsx b/apps/web/src/components/PageLayout.tsx similarity index 100% rename from packages/web/src/components/PageLayout.tsx rename to apps/web/src/components/PageLayout.tsx diff --git a/packages/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx similarity index 100% rename from packages/web/src/components/Sidebar.tsx rename to apps/web/src/components/Sidebar.tsx diff --git a/packages/web/src/components/ThemeSwitcher.tsx b/apps/web/src/components/ThemeSwitcher.tsx similarity index 100% rename from packages/web/src/components/ThemeSwitcher.tsx rename to apps/web/src/components/ThemeSwitcher.tsx diff --git a/packages/web/src/components/Toaster.tsx b/apps/web/src/components/Toaster.tsx similarity index 100% rename from packages/web/src/components/Toaster.tsx rename to apps/web/src/components/Toaster.tsx diff --git a/packages/web/src/components/UI/Accordion.tsx b/apps/web/src/components/UI/Accordion.tsx similarity index 100% rename from packages/web/src/components/UI/Accordion.tsx rename to apps/web/src/components/UI/Accordion.tsx diff --git a/packages/web/src/components/UI/AlertDialog.tsx b/apps/web/src/components/UI/AlertDialog.tsx similarity index 100% rename from packages/web/src/components/UI/AlertDialog.tsx rename to apps/web/src/components/UI/AlertDialog.tsx diff --git a/packages/web/src/components/UI/Avatar.tsx b/apps/web/src/components/UI/Avatar.tsx similarity index 100% rename from packages/web/src/components/UI/Avatar.tsx rename to apps/web/src/components/UI/Avatar.tsx diff --git a/packages/web/src/components/UI/Badge.tsx b/apps/web/src/components/UI/Badge.tsx similarity index 100% rename from packages/web/src/components/UI/Badge.tsx rename to apps/web/src/components/UI/Badge.tsx diff --git a/packages/web/src/components/UI/Button.tsx b/apps/web/src/components/UI/Button.tsx similarity index 100% rename from packages/web/src/components/UI/Button.tsx rename to apps/web/src/components/UI/Button.tsx diff --git a/packages/web/src/components/UI/Card.tsx b/apps/web/src/components/UI/Card.tsx similarity index 100% rename from packages/web/src/components/UI/Card.tsx rename to apps/web/src/components/UI/Card.tsx diff --git a/packages/web/src/components/UI/Checkbox/Checkbox.test.tsx b/apps/web/src/components/UI/Checkbox/Checkbox.test.tsx similarity index 100% rename from packages/web/src/components/UI/Checkbox/Checkbox.test.tsx rename to apps/web/src/components/UI/Checkbox/Checkbox.test.tsx diff --git a/packages/web/src/components/UI/Checkbox/index.tsx b/apps/web/src/components/UI/Checkbox/index.tsx similarity index 100% rename from packages/web/src/components/UI/Checkbox/index.tsx rename to apps/web/src/components/UI/Checkbox/index.tsx diff --git a/packages/web/src/components/UI/Command.tsx b/apps/web/src/components/UI/Command.tsx similarity index 100% rename from packages/web/src/components/UI/Command.tsx rename to apps/web/src/components/UI/Command.tsx diff --git a/packages/web/src/components/UI/Dialog.tsx b/apps/web/src/components/UI/Dialog.tsx similarity index 100% rename from packages/web/src/components/UI/Dialog.tsx rename to apps/web/src/components/UI/Dialog.tsx diff --git a/packages/web/src/components/UI/DropdownMenu.tsx b/apps/web/src/components/UI/DropdownMenu.tsx similarity index 100% rename from packages/web/src/components/UI/DropdownMenu.tsx rename to apps/web/src/components/UI/DropdownMenu.tsx diff --git a/packages/web/src/components/UI/ErrorPage.tsx b/apps/web/src/components/UI/ErrorPage.tsx similarity index 100% rename from packages/web/src/components/UI/ErrorPage.tsx rename to apps/web/src/components/UI/ErrorPage.tsx diff --git a/packages/web/src/components/UI/Footer.tsx b/apps/web/src/components/UI/Footer.tsx similarity index 100% rename from packages/web/src/components/UI/Footer.tsx rename to apps/web/src/components/UI/Footer.tsx diff --git a/packages/web/src/components/UI/Generator.tsx b/apps/web/src/components/UI/Generator.tsx similarity index 100% rename from packages/web/src/components/UI/Generator.tsx rename to apps/web/src/components/UI/Generator.tsx diff --git a/packages/web/src/components/UI/Input.tsx b/apps/web/src/components/UI/Input.tsx similarity index 100% rename from packages/web/src/components/UI/Input.tsx rename to apps/web/src/components/UI/Input.tsx diff --git a/packages/web/src/components/UI/Label.tsx b/apps/web/src/components/UI/Label.tsx similarity index 100% rename from packages/web/src/components/UI/Label.tsx rename to apps/web/src/components/UI/Label.tsx diff --git a/packages/web/src/components/UI/Menubar.tsx b/apps/web/src/components/UI/Menubar.tsx similarity index 100% rename from packages/web/src/components/UI/Menubar.tsx rename to apps/web/src/components/UI/Menubar.tsx diff --git a/packages/web/src/components/UI/MultiSelect.tsx b/apps/web/src/components/UI/MultiSelect.tsx similarity index 100% rename from packages/web/src/components/UI/MultiSelect.tsx rename to apps/web/src/components/UI/MultiSelect.tsx diff --git a/packages/web/src/components/UI/Popover.tsx b/apps/web/src/components/UI/Popover.tsx similarity index 100% rename from packages/web/src/components/UI/Popover.tsx rename to apps/web/src/components/UI/Popover.tsx diff --git a/packages/web/src/components/UI/ScrollArea.tsx b/apps/web/src/components/UI/ScrollArea.tsx similarity index 100% rename from packages/web/src/components/UI/ScrollArea.tsx rename to apps/web/src/components/UI/ScrollArea.tsx diff --git a/packages/web/src/components/UI/Select.tsx b/apps/web/src/components/UI/Select.tsx similarity index 100% rename from packages/web/src/components/UI/Select.tsx rename to apps/web/src/components/UI/Select.tsx diff --git a/packages/web/src/components/UI/Separator.tsx b/apps/web/src/components/UI/Separator.tsx similarity index 100% rename from packages/web/src/components/UI/Separator.tsx rename to apps/web/src/components/UI/Separator.tsx diff --git a/packages/web/src/components/UI/Sidebar/SidebarButton.tsx b/apps/web/src/components/UI/Sidebar/SidebarButton.tsx similarity index 100% rename from packages/web/src/components/UI/Sidebar/SidebarButton.tsx rename to apps/web/src/components/UI/Sidebar/SidebarButton.tsx diff --git a/packages/web/src/components/UI/Sidebar/SidebarSection.tsx b/apps/web/src/components/UI/Sidebar/SidebarSection.tsx similarity index 100% rename from packages/web/src/components/UI/Sidebar/SidebarSection.tsx rename to apps/web/src/components/UI/Sidebar/SidebarSection.tsx diff --git a/packages/web/src/components/UI/Skeleton.tsx b/apps/web/src/components/UI/Skeleton.tsx similarity index 100% rename from packages/web/src/components/UI/Skeleton.tsx rename to apps/web/src/components/UI/Skeleton.tsx diff --git a/packages/web/src/components/UI/Slider.tsx b/apps/web/src/components/UI/Slider.tsx similarity index 100% rename from packages/web/src/components/UI/Slider.tsx rename to apps/web/src/components/UI/Slider.tsx diff --git a/packages/web/src/components/UI/Spinner.tsx b/apps/web/src/components/UI/Spinner.tsx similarity index 100% rename from packages/web/src/components/UI/Spinner.tsx rename to apps/web/src/components/UI/Spinner.tsx diff --git a/packages/web/src/components/UI/Switch.tsx b/apps/web/src/components/UI/Switch.tsx similarity index 100% rename from packages/web/src/components/UI/Switch.tsx rename to apps/web/src/components/UI/Switch.tsx diff --git a/packages/web/src/components/UI/Tabs.tsx b/apps/web/src/components/UI/Tabs.tsx similarity index 100% rename from packages/web/src/components/UI/Tabs.tsx rename to apps/web/src/components/UI/Tabs.tsx diff --git a/packages/web/src/components/UI/Toast.tsx b/apps/web/src/components/UI/Toast.tsx similarity index 100% rename from packages/web/src/components/UI/Toast.tsx rename to apps/web/src/components/UI/Toast.tsx diff --git a/packages/web/src/components/UI/ToggleGroup.tsx b/apps/web/src/components/UI/ToggleGroup.tsx similarity index 100% rename from packages/web/src/components/UI/ToggleGroup.tsx rename to apps/web/src/components/UI/ToggleGroup.tsx diff --git a/packages/web/src/components/UI/Tooltip.tsx b/apps/web/src/components/UI/Tooltip.tsx similarity index 100% rename from packages/web/src/components/UI/Tooltip.tsx rename to apps/web/src/components/UI/Tooltip.tsx diff --git a/packages/web/src/components/UI/Typography/Blockquote.tsx b/apps/web/src/components/UI/Typography/Blockquote.tsx similarity index 100% rename from packages/web/src/components/UI/Typography/Blockquote.tsx rename to apps/web/src/components/UI/Typography/Blockquote.tsx diff --git a/packages/web/src/components/UI/Typography/Code.tsx b/apps/web/src/components/UI/Typography/Code.tsx similarity index 100% rename from packages/web/src/components/UI/Typography/Code.tsx rename to apps/web/src/components/UI/Typography/Code.tsx diff --git a/packages/web/src/components/UI/Typography/Heading.tsx b/apps/web/src/components/UI/Typography/Heading.tsx similarity index 100% rename from packages/web/src/components/UI/Typography/Heading.tsx rename to apps/web/src/components/UI/Typography/Heading.tsx diff --git a/packages/web/src/components/UI/Typography/Link.tsx b/apps/web/src/components/UI/Typography/Link.tsx similarity index 100% rename from packages/web/src/components/UI/Typography/Link.tsx rename to apps/web/src/components/UI/Typography/Link.tsx diff --git a/packages/web/src/components/UI/Typography/P.tsx b/apps/web/src/components/UI/Typography/P.tsx similarity index 100% rename from packages/web/src/components/UI/Typography/P.tsx rename to apps/web/src/components/UI/Typography/P.tsx diff --git a/packages/web/src/components/UI/Typography/Subtle.tsx b/apps/web/src/components/UI/Typography/Subtle.tsx similarity index 100% rename from packages/web/src/components/UI/Typography/Subtle.tsx rename to apps/web/src/components/UI/Typography/Subtle.tsx diff --git a/packages/web/src/components/generic/Blur.tsx b/apps/web/src/components/generic/Blur.tsx similarity index 100% rename from packages/web/src/components/generic/Blur.tsx rename to apps/web/src/components/generic/Blur.tsx diff --git a/packages/web/src/components/generic/DeviceImage.tsx b/apps/web/src/components/generic/DeviceImage.tsx similarity index 100% rename from packages/web/src/components/generic/DeviceImage.tsx rename to apps/web/src/components/generic/DeviceImage.tsx diff --git a/packages/web/src/components/generic/Filter/FilterComponents.tsx b/apps/web/src/components/generic/Filter/FilterComponents.tsx similarity index 100% rename from packages/web/src/components/generic/Filter/FilterComponents.tsx rename to apps/web/src/components/generic/Filter/FilterComponents.tsx diff --git a/packages/web/src/components/generic/Filter/FilterControl.tsx b/apps/web/src/components/generic/Filter/FilterControl.tsx similarity index 100% rename from packages/web/src/components/generic/Filter/FilterControl.tsx rename to apps/web/src/components/generic/Filter/FilterControl.tsx diff --git a/packages/web/src/components/generic/Filter/useFilterNode.test.ts b/apps/web/src/components/generic/Filter/useFilterNode.test.ts similarity index 100% rename from packages/web/src/components/generic/Filter/useFilterNode.test.ts rename to apps/web/src/components/generic/Filter/useFilterNode.test.ts diff --git a/packages/web/src/components/generic/Filter/useFilterNode.ts b/apps/web/src/components/generic/Filter/useFilterNode.ts similarity index 100% rename from packages/web/src/components/generic/Filter/useFilterNode.ts rename to apps/web/src/components/generic/Filter/useFilterNode.ts diff --git a/packages/web/src/components/generic/Mono.tsx b/apps/web/src/components/generic/Mono.tsx similarity index 100% rename from packages/web/src/components/generic/Mono.tsx rename to apps/web/src/components/generic/Mono.tsx diff --git a/packages/web/src/components/generic/Table/index.test.tsx b/apps/web/src/components/generic/Table/index.test.tsx similarity index 100% rename from packages/web/src/components/generic/Table/index.test.tsx rename to apps/web/src/components/generic/Table/index.test.tsx diff --git a/packages/web/src/components/generic/Table/index.tsx b/apps/web/src/components/generic/Table/index.tsx similarity index 100% rename from packages/web/src/components/generic/Table/index.tsx rename to apps/web/src/components/generic/Table/index.tsx diff --git a/packages/web/src/components/generic/TimeAgo.tsx b/apps/web/src/components/generic/TimeAgo.tsx similarity index 100% rename from packages/web/src/components/generic/TimeAgo.tsx rename to apps/web/src/components/generic/TimeAgo.tsx diff --git a/packages/web/src/components/generic/Uptime.tsx b/apps/web/src/components/generic/Uptime.tsx similarity index 100% rename from packages/web/src/components/generic/Uptime.tsx rename to apps/web/src/components/generic/Uptime.tsx diff --git a/packages/web/src/components/types.ts b/apps/web/src/components/types.ts similarity index 100% rename from packages/web/src/components/types.ts rename to apps/web/src/components/types.ts diff --git a/packages/web/src/core/dto/NodeNumToNodeInfoDTO.ts b/apps/web/src/core/dto/NodeNumToNodeInfoDTO.ts similarity index 100% rename from packages/web/src/core/dto/NodeNumToNodeInfoDTO.ts rename to apps/web/src/core/dto/NodeNumToNodeInfoDTO.ts diff --git a/packages/web/src/core/dto/PacketToMessageDTO.ts b/apps/web/src/core/dto/PacketToMessageDTO.ts similarity index 100% rename from packages/web/src/core/dto/PacketToMessageDTO.ts rename to apps/web/src/core/dto/PacketToMessageDTO.ts diff --git a/packages/web/src/core/hooks/useBrowserFeatureDetection.ts b/apps/web/src/core/hooks/useBrowserFeatureDetection.ts similarity index 100% rename from packages/web/src/core/hooks/useBrowserFeatureDetection.ts rename to apps/web/src/core/hooks/useBrowserFeatureDetection.ts diff --git a/packages/web/src/core/hooks/useCookie.ts b/apps/web/src/core/hooks/useCookie.ts similarity index 100% rename from packages/web/src/core/hooks/useCookie.ts rename to apps/web/src/core/hooks/useCookie.ts diff --git a/packages/web/src/core/hooks/useCopyToClipboard.ts b/apps/web/src/core/hooks/useCopyToClipboard.ts similarity index 100% rename from packages/web/src/core/hooks/useCopyToClipboard.ts rename to apps/web/src/core/hooks/useCopyToClipboard.ts diff --git a/packages/web/src/core/hooks/useDeviceContext.ts b/apps/web/src/core/hooks/useDeviceContext.ts similarity index 100% rename from packages/web/src/core/hooks/useDeviceContext.ts rename to apps/web/src/core/hooks/useDeviceContext.ts diff --git a/packages/web/src/core/hooks/useFavoriteNode.test.ts b/apps/web/src/core/hooks/useFavoriteNode.test.ts similarity index 100% rename from packages/web/src/core/hooks/useFavoriteNode.test.ts rename to apps/web/src/core/hooks/useFavoriteNode.test.ts diff --git a/packages/web/src/core/hooks/useFavoriteNode.ts b/apps/web/src/core/hooks/useFavoriteNode.ts similarity index 100% rename from packages/web/src/core/hooks/useFavoriteNode.ts rename to apps/web/src/core/hooks/useFavoriteNode.ts diff --git a/packages/web/src/core/hooks/useFeatureFlags.ts b/apps/web/src/core/hooks/useFeatureFlags.ts similarity index 100% rename from packages/web/src/core/hooks/useFeatureFlags.ts rename to apps/web/src/core/hooks/useFeatureFlags.ts diff --git a/packages/web/src/core/hooks/useIgnoreNode.test.ts b/apps/web/src/core/hooks/useIgnoreNode.test.ts similarity index 100% rename from packages/web/src/core/hooks/useIgnoreNode.test.ts rename to apps/web/src/core/hooks/useIgnoreNode.test.ts diff --git a/packages/web/src/core/hooks/useIgnoreNode.ts b/apps/web/src/core/hooks/useIgnoreNode.ts similarity index 100% rename from packages/web/src/core/hooks/useIgnoreNode.ts rename to apps/web/src/core/hooks/useIgnoreNode.ts diff --git a/packages/web/src/core/hooks/useKeyBackupReminder.tsx b/apps/web/src/core/hooks/useKeyBackupReminder.tsx similarity index 100% rename from packages/web/src/core/hooks/useKeyBackupReminder.tsx rename to apps/web/src/core/hooks/useKeyBackupReminder.tsx diff --git a/packages/web/src/core/hooks/useLRUList.ts b/apps/web/src/core/hooks/useLRUList.ts similarity index 100% rename from packages/web/src/core/hooks/useLRUList.ts rename to apps/web/src/core/hooks/useLRUList.ts diff --git a/packages/web/src/core/hooks/useLang.ts b/apps/web/src/core/hooks/useLang.ts similarity index 100% rename from packages/web/src/core/hooks/useLang.ts rename to apps/web/src/core/hooks/useLang.ts diff --git a/packages/web/src/core/hooks/useLocalStorage.test.ts b/apps/web/src/core/hooks/useLocalStorage.test.ts similarity index 100% rename from packages/web/src/core/hooks/useLocalStorage.test.ts rename to apps/web/src/core/hooks/useLocalStorage.test.ts diff --git a/packages/web/src/core/hooks/useLocalStorage.ts b/apps/web/src/core/hooks/useLocalStorage.ts similarity index 100% rename from packages/web/src/core/hooks/useLocalStorage.ts rename to apps/web/src/core/hooks/useLocalStorage.ts diff --git a/packages/web/src/core/hooks/useMapFitting.ts b/apps/web/src/core/hooks/useMapFitting.ts similarity index 100% rename from packages/web/src/core/hooks/useMapFitting.ts rename to apps/web/src/core/hooks/useMapFitting.ts diff --git a/packages/web/src/core/hooks/useNewNodeNum.ts b/apps/web/src/core/hooks/useNewNodeNum.ts similarity index 100% rename from packages/web/src/core/hooks/useNewNodeNum.ts rename to apps/web/src/core/hooks/useNewNodeNum.ts diff --git a/packages/web/src/core/hooks/usePasswordVisibilityToggle.test.ts b/apps/web/src/core/hooks/usePasswordVisibilityToggle.test.ts similarity index 100% rename from packages/web/src/core/hooks/usePasswordVisibilityToggle.test.ts rename to apps/web/src/core/hooks/usePasswordVisibilityToggle.test.ts diff --git a/packages/web/src/core/hooks/usePasswordVisibilityToggle.ts b/apps/web/src/core/hooks/usePasswordVisibilityToggle.ts similarity index 100% rename from packages/web/src/core/hooks/usePasswordVisibilityToggle.ts rename to apps/web/src/core/hooks/usePasswordVisibilityToggle.ts diff --git a/packages/web/src/core/hooks/usePinnedItems.ts b/apps/web/src/core/hooks/usePinnedItems.ts similarity index 100% rename from packages/web/src/core/hooks/usePinnedItems.ts rename to apps/web/src/core/hooks/usePinnedItems.ts diff --git a/packages/web/src/core/hooks/usePositionFlags.ts b/apps/web/src/core/hooks/usePositionFlags.ts similarity index 100% rename from packages/web/src/core/hooks/usePositionFlags.ts rename to apps/web/src/core/hooks/usePositionFlags.ts diff --git a/packages/web/src/core/hooks/useTheme.ts b/apps/web/src/core/hooks/useTheme.ts similarity index 100% rename from packages/web/src/core/hooks/useTheme.ts rename to apps/web/src/core/hooks/useTheme.ts diff --git a/packages/web/src/core/hooks/useToast.test.tsx b/apps/web/src/core/hooks/useToast.test.tsx similarity index 100% rename from packages/web/src/core/hooks/useToast.test.tsx rename to apps/web/src/core/hooks/useToast.test.tsx diff --git a/packages/web/src/core/hooks/useToast.ts b/apps/web/src/core/hooks/useToast.ts similarity index 100% rename from packages/web/src/core/hooks/useToast.ts rename to apps/web/src/core/hooks/useToast.ts diff --git a/packages/web/src/core/hooks/useToggleVisiblility.ts b/apps/web/src/core/hooks/useToggleVisiblility.ts similarity index 100% rename from packages/web/src/core/hooks/useToggleVisiblility.ts rename to apps/web/src/core/hooks/useToggleVisiblility.ts diff --git a/packages/web/src/core/hooks/useWaitForConfig.ts b/apps/web/src/core/hooks/useWaitForConfig.ts similarity index 100% rename from packages/web/src/core/hooks/useWaitForConfig.ts rename to apps/web/src/core/hooks/useWaitForConfig.ts diff --git a/packages/web/src/core/services/dev-overrides.ts b/apps/web/src/core/services/dev-overrides.ts similarity index 100% rename from packages/web/src/core/services/dev-overrides.ts rename to apps/web/src/core/services/dev-overrides.ts diff --git a/packages/web/src/core/services/featureFlags.ts b/apps/web/src/core/services/featureFlags.ts similarity index 100% rename from packages/web/src/core/services/featureFlags.ts rename to apps/web/src/core/services/featureFlags.ts diff --git a/packages/web/src/core/stores/appStore/appStore.test.ts b/apps/web/src/core/stores/appStore/appStore.test.ts similarity index 100% rename from packages/web/src/core/stores/appStore/appStore.test.ts rename to apps/web/src/core/stores/appStore/appStore.test.ts diff --git a/packages/web/src/core/stores/appStore/index.ts b/apps/web/src/core/stores/appStore/index.ts similarity index 100% rename from packages/web/src/core/stores/appStore/index.ts rename to apps/web/src/core/stores/appStore/index.ts diff --git a/packages/web/src/core/stores/appStore/types.ts b/apps/web/src/core/stores/appStore/types.ts similarity index 100% rename from packages/web/src/core/stores/appStore/types.ts rename to apps/web/src/core/stores/appStore/types.ts diff --git a/packages/web/src/core/stores/deviceStore/changeRegistry.ts b/apps/web/src/core/stores/deviceStore/changeRegistry.ts similarity index 98% rename from packages/web/src/core/stores/deviceStore/changeRegistry.ts rename to apps/web/src/core/stores/deviceStore/changeRegistry.ts index cdfcc0b6..a16bbf43 100644 --- a/packages/web/src/core/stores/deviceStore/changeRegistry.ts +++ b/apps/web/src/core/stores/deviceStore/changeRegistry.ts @@ -23,7 +23,11 @@ export type ValidModuleConfigType = | "neighborInfo" | "ambientLighting" | "detectionSensor" - | "paxcounter"; + | "paxcounter" + | "remoteHardware" + | "statusmessage" + | "trafficManagement" + | "tak"; // Admin message types that can be queued export type ValidAdminMessageType = "setFixedPosition" | "other"; diff --git a/packages/web/src/core/stores/deviceStore/deviceStore.mock.ts b/apps/web/src/core/stores/deviceStore/deviceStore.mock.ts similarity index 100% rename from packages/web/src/core/stores/deviceStore/deviceStore.mock.ts rename to apps/web/src/core/stores/deviceStore/deviceStore.mock.ts diff --git a/packages/web/src/core/stores/deviceStore/deviceStore.test.ts b/apps/web/src/core/stores/deviceStore/deviceStore.test.ts similarity index 91% rename from packages/web/src/core/stores/deviceStore/deviceStore.test.ts rename to apps/web/src/core/stores/deviceStore/deviceStore.test.ts index ca0953ba..d2225571 100644 --- a/packages/web/src/core/stores/deviceStore/deviceStore.test.ts +++ b/apps/web/src/core/stores/deviceStore/deviceStore.test.ts @@ -196,6 +196,48 @@ describe("DeviceStore – change registry API", () => { expect(device.hasModuleConfigChange("mqtt")).toBe(false); }); + it("setModuleConfig stores the firmware-current module variants", async () => { + const { useDeviceStore } = await freshStore(false); + const device = useDeviceStore.getState().addDevice(11); + + device.setModuleConfig( + create(Protobuf.ModuleConfig.ModuleConfigSchema, { + payloadVariant: { + case: "trafficManagement", + value: create(Protobuf.ModuleConfig.ModuleConfig_TrafficManagementConfigSchema, { + enabled: true, + rateLimitMaxPackets: 5, + }), + }, + }), + ); + device.setModuleConfig( + create(Protobuf.ModuleConfig.ModuleConfigSchema, { + payloadVariant: { + case: "statusmessage", + value: create(Protobuf.ModuleConfig.ModuleConfig_StatusMessageConfigSchema, { + nodeStatus: "online", + }), + }, + }), + ); + device.setModuleConfig( + create(Protobuf.ModuleConfig.ModuleConfigSchema, { + payloadVariant: { + case: "remoteHardware", + value: create(Protobuf.ModuleConfig.ModuleConfig_RemoteHardwareConfigSchema, { + enabled: true, + }), + }, + }), + ); + + expect(device.getEffectiveModuleConfig("trafficManagement")?.enabled).toBe(true); + expect(device.getEffectiveModuleConfig("trafficManagement")?.rateLimitMaxPackets).toBe(5); + expect(device.getEffectiveModuleConfig("statusmessage")?.nodeStatus).toBe("online"); + expect(device.getEffectiveModuleConfig("remoteHardware")?.enabled).toBe(true); + }); + it("channel change tracking add/update/remove/get", async () => { const { useDeviceStore } = await freshStore(false); const state = useDeviceStore.getState(); diff --git a/packages/web/src/core/stores/deviceStore/index.ts b/apps/web/src/core/stores/deviceStore/index.ts similarity index 98% rename from packages/web/src/core/stores/deviceStore/index.ts rename to apps/web/src/core/stores/deviceStore/index.ts index a226d7af..a852cb9d 100644 --- a/packages/web/src/core/stores/deviceStore/index.ts +++ b/apps/web/src/core/stores/deviceStore/index.ts @@ -341,6 +341,22 @@ function deviceFactory( device.moduleConfig.paxcounter = config.payloadVariant.value; break; } + case "remoteHardware": { + device.moduleConfig.remoteHardware = config.payloadVariant.value; + break; + } + case "statusmessage": { + device.moduleConfig.statusmessage = config.payloadVariant.value; + break; + } + case "trafficManagement": { + device.moduleConfig.trafficManagement = config.payloadVariant.value; + break; + } + case "tak": { + device.moduleConfig.tak = config.payloadVariant.value; + break; + } } } }), diff --git a/packages/web/src/core/stores/deviceStore/selectors.ts b/apps/web/src/core/stores/deviceStore/selectors.ts similarity index 100% rename from packages/web/src/core/stores/deviceStore/selectors.ts rename to apps/web/src/core/stores/deviceStore/selectors.ts diff --git a/packages/web/src/core/stores/deviceStore/types.ts b/apps/web/src/core/stores/deviceStore/types.ts similarity index 100% rename from packages/web/src/core/stores/deviceStore/types.ts rename to apps/web/src/core/stores/deviceStore/types.ts diff --git a/packages/web/src/core/stores/index.ts b/apps/web/src/core/stores/index.ts similarity index 100% rename from packages/web/src/core/stores/index.ts rename to apps/web/src/core/stores/index.ts diff --git a/packages/web/src/core/stores/messageStore/index.ts b/apps/web/src/core/stores/messageStore/index.ts similarity index 100% rename from packages/web/src/core/stores/messageStore/index.ts rename to apps/web/src/core/stores/messageStore/index.ts diff --git a/packages/web/src/core/stores/messageStore/messageStore.test.ts b/apps/web/src/core/stores/messageStore/messageStore.test.ts similarity index 100% rename from packages/web/src/core/stores/messageStore/messageStore.test.ts rename to apps/web/src/core/stores/messageStore/messageStore.test.ts diff --git a/packages/web/src/core/stores/messageStore/types.ts b/apps/web/src/core/stores/messageStore/types.ts similarity index 100% rename from packages/web/src/core/stores/messageStore/types.ts rename to apps/web/src/core/stores/messageStore/types.ts diff --git a/packages/web/src/core/stores/nodeDBStore/index.ts b/apps/web/src/core/stores/nodeDBStore/index.ts similarity index 95% rename from packages/web/src/core/stores/nodeDBStore/index.ts rename to apps/web/src/core/stores/nodeDBStore/index.ts index db8f746b..8123ef40 100644 --- a/packages/web/src/core/stores/nodeDBStore/index.ts +++ b/apps/web/src/core/stores/nodeDBStore/index.ts @@ -29,6 +29,7 @@ export interface NodeDB extends NodeDBData { processPacket: (data: ProcessPacketParams) => void; addUser: (user: Types.PacketMetadata) => void; addPosition: (position: Types.PacketMetadata) => void; + addDeviceMetrics: (metrics: Types.PacketMetadata) => void; updateFavorite: (nodeNum: number, isFavorite: boolean) => void; updateIgnore: (nodeNum: number, isIgnored: boolean) => void; setNodeNum: (nodeNum: number) => void; @@ -327,6 +328,28 @@ function nodeDBFactory( }), ), + addDeviceMetrics: (metrics) => + set( + produce((draft) => { + const nodeDB = draft.nodeDBs.get(id); + if (!nodeDB) { + throw new Error(`No nodeDB found (id: ${id})`); + } + const current = nodeDB.nodeMap.get(metrics.from); + // Only fold live device metrics into nodes we already know about, to + // avoid creating identity-less phantom nodes from a stray telemetry packet. + if (!current) { + return; + } + const updated = { + ...current, + deviceMetrics: metrics.data, + num: metrics.from, + }; + nodeDB.nodeMap = new Map(nodeDB.nodeMap).set(metrics.from, updated); + }), + ), + setNodeNum: (nodeNum) => set( produce((draft) => { diff --git a/packages/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts b/apps/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts similarity index 96% rename from packages/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts rename to apps/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts index f01daa99..7e30b752 100644 --- a/packages/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts +++ b/apps/web/src/core/stores/nodeDBStore/nodeDBStore.mock.ts @@ -14,6 +14,7 @@ export const mockNodeDBStore: NodeDB = { addNode: vi.fn(), addUser: vi.fn(), addPosition: vi.fn(), + addDeviceMetrics: vi.fn(), removeNode: vi.fn(), removeAllNodes: vi.fn(), pruneStaleNodes: vi.fn().mockReturnValue(0), diff --git a/apps/web/src/core/stores/nodeDBStore/nodeDBStore.test.ts b/apps/web/src/core/stores/nodeDBStore/nodeDBStore.test.ts new file mode 100644 index 00000000..f4b22371 --- /dev/null +++ b/apps/web/src/core/stores/nodeDBStore/nodeDBStore.test.ts @@ -0,0 +1,68 @@ +import { create } from "@bufbuild/protobuf"; +import { Protobuf, type Types } from "@meshtastic/core"; +import { describe, expect, it, vi } from "vitest"; + +const idbMem = new Map(); +vi.mock("idb-keyval", () => ({ + get: vi.fn((key: string) => Promise.resolve(idbMem.get(key))), + set: vi.fn((key: string, val: string) => { + idbMem.set(key, val); + return Promise.resolve(); + }), + del: vi.fn((k: string) => { + idbMem.delete(k); + return Promise.resolve(); + }), +})); + +// Load a fresh, non-persisting copy of the nodeDB store. +async function freshNodeDB() { + vi.resetModules(); + vi.spyOn(console, "debug").mockImplementation(() => {}); + vi.spyOn(console, "log").mockImplementation(() => {}); + vi.spyOn(console, "info").mockImplementation(() => {}); + + vi.doMock("@core/services/featureFlags", () => ({ + featureFlags: { get: vi.fn(() => false) }, + })); + + const { useNodeDBStore } = await import("./index.ts"); + return useNodeDBStore; +} + +function metricsPacket( + from: number, + data: Protobuf.Telemetry.DeviceMetrics, +): Types.PacketMetadata { + return { id: 1, rxTime: new Date(), type: "broadcast", from, to: 0, channel: 0, data }; +} + +describe("nodeDBStore – addDeviceMetrics", () => { + it("folds live device metrics into an existing node", async () => { + const useNodeDBStore = await freshNodeDB(); + const db = useNodeDBStore.getState().addNodeDB(1); + db.addNode(create(Protobuf.Mesh.NodeInfoSchema, { num: 5 })); + + db.addDeviceMetrics( + metricsPacket( + 5, + create(Protobuf.Telemetry.DeviceMetricsSchema, { batteryLevel: 80, voltage: 4.1 }), + ), + ); + + expect(db.getNode(5)?.deviceMetrics?.batteryLevel).toBe(80); + expect(db.getNode(5)?.deviceMetrics?.voltage).toBeCloseTo(4.1); + }); + + it("ignores metrics for an unknown node (no phantom node is created)", async () => { + const useNodeDBStore = await freshNodeDB(); + const db = useNodeDBStore.getState().addNodeDB(1); + + db.addDeviceMetrics( + metricsPacket(999, create(Protobuf.Telemetry.DeviceMetricsSchema, { batteryLevel: 50 })), + ); + + expect(db.getNode(999)).toBeUndefined(); + expect(db.getNodesLength()).toBe(0); + }); +}); diff --git a/packages/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx b/apps/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx similarity index 100% rename from packages/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx rename to apps/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx diff --git a/packages/web/src/core/stores/nodeDBStore/nodeValidation.ts b/apps/web/src/core/stores/nodeDBStore/nodeValidation.ts similarity index 100% rename from packages/web/src/core/stores/nodeDBStore/nodeValidation.ts rename to apps/web/src/core/stores/nodeDBStore/nodeValidation.ts diff --git a/packages/web/src/core/stores/nodeDBStore/types.ts b/apps/web/src/core/stores/nodeDBStore/types.ts similarity index 100% rename from packages/web/src/core/stores/nodeDBStore/types.ts rename to apps/web/src/core/stores/nodeDBStore/types.ts diff --git a/packages/web/src/core/stores/sidebarStore/index.tsx b/apps/web/src/core/stores/sidebarStore/index.tsx similarity index 100% rename from packages/web/src/core/stores/sidebarStore/index.tsx rename to apps/web/src/core/stores/sidebarStore/index.tsx diff --git a/packages/web/src/core/stores/utils/bindStoreToDevice.ts b/apps/web/src/core/stores/utils/bindStoreToDevice.ts similarity index 100% rename from packages/web/src/core/stores/utils/bindStoreToDevice.ts rename to apps/web/src/core/stores/utils/bindStoreToDevice.ts diff --git a/packages/web/src/core/stores/utils/evictOldestEntries.ts b/apps/web/src/core/stores/utils/evictOldestEntries.ts similarity index 100% rename from packages/web/src/core/stores/utils/evictOldestEntries.ts rename to apps/web/src/core/stores/utils/evictOldestEntries.ts diff --git a/packages/web/src/core/stores/utils/indexDB.test.ts b/apps/web/src/core/stores/utils/indexDB.test.ts similarity index 100% rename from packages/web/src/core/stores/utils/indexDB.test.ts rename to apps/web/src/core/stores/utils/indexDB.test.ts diff --git a/packages/web/src/core/stores/utils/indexDB.ts b/apps/web/src/core/stores/utils/indexDB.ts similarity index 100% rename from packages/web/src/core/stores/utils/indexDB.ts rename to apps/web/src/core/stores/utils/indexDB.ts diff --git a/packages/web/src/core/subscriptions.ts b/apps/web/src/core/subscriptions.ts similarity index 92% rename from packages/web/src/core/subscriptions.ts rename to apps/web/src/core/subscriptions.ts index d70a88ba..ce9505dc 100644 --- a/packages/web/src/core/subscriptions.ts +++ b/apps/web/src/core/subscriptions.ts @@ -34,8 +34,15 @@ export const subscribeAll = ( } }); - connection.events.onTelemetryPacket.subscribe(() => { - // device.setMetrics(telemetryPacket); + connection.events.onTelemetryPacket.subscribe((telemetryPacket) => { + // Fold live device-metrics telemetry into the node so battery / channel + // utilisation / voltage stay current between NodeInfo broadcasts. + if (telemetryPacket.data.variant.case === "deviceMetrics") { + nodeDB.addDeviceMetrics({ + ...telemetryPacket, + data: telemetryPacket.data.variant.value, + }); + } }); connection.events.onDeviceStatus.subscribe((status) => { diff --git a/packages/web/src/core/utils/bitwise.ts b/apps/web/src/core/utils/bitwise.ts similarity index 100% rename from packages/web/src/core/utils/bitwise.ts rename to apps/web/src/core/utils/bitwise.ts diff --git a/packages/web/src/core/utils/cn.ts b/apps/web/src/core/utils/cn.ts similarity index 100% rename from packages/web/src/core/utils/cn.ts rename to apps/web/src/core/utils/cn.ts diff --git a/packages/web/src/core/utils/color.test.ts b/apps/web/src/core/utils/color.test.ts similarity index 100% rename from packages/web/src/core/utils/color.test.ts rename to apps/web/src/core/utils/color.test.ts diff --git a/packages/web/src/core/utils/color.ts b/apps/web/src/core/utils/color.ts similarity index 100% rename from packages/web/src/core/utils/color.ts rename to apps/web/src/core/utils/color.ts diff --git a/packages/web/src/core/utils/debounce.test.ts b/apps/web/src/core/utils/debounce.test.ts similarity index 100% rename from packages/web/src/core/utils/debounce.test.ts rename to apps/web/src/core/utils/debounce.test.ts diff --git a/packages/web/src/core/utils/debounce.ts b/apps/web/src/core/utils/debounce.ts similarity index 100% rename from packages/web/src/core/utils/debounce.ts rename to apps/web/src/core/utils/debounce.ts diff --git a/packages/web/src/core/utils/deepCompareConfig.test.ts b/apps/web/src/core/utils/deepCompareConfig.test.ts similarity index 100% rename from packages/web/src/core/utils/deepCompareConfig.test.ts rename to apps/web/src/core/utils/deepCompareConfig.test.ts diff --git a/packages/web/src/core/utils/deepCompareConfig.ts b/apps/web/src/core/utils/deepCompareConfig.ts similarity index 100% rename from packages/web/src/core/utils/deepCompareConfig.ts rename to apps/web/src/core/utils/deepCompareConfig.ts diff --git a/packages/web/src/core/utils/dotPath.test.ts b/apps/web/src/core/utils/dotPath.test.ts similarity index 100% rename from packages/web/src/core/utils/dotPath.test.ts rename to apps/web/src/core/utils/dotPath.test.ts diff --git a/packages/web/src/core/utils/dotPath.ts b/apps/web/src/core/utils/dotPath.ts similarity index 100% rename from packages/web/src/core/utils/dotPath.ts rename to apps/web/src/core/utils/dotPath.ts diff --git a/packages/web/src/core/utils/eventBus.test.ts b/apps/web/src/core/utils/eventBus.test.ts similarity index 100% rename from packages/web/src/core/utils/eventBus.test.ts rename to apps/web/src/core/utils/eventBus.test.ts diff --git a/packages/web/src/core/utils/eventBus.ts b/apps/web/src/core/utils/eventBus.ts similarity index 100% rename from packages/web/src/core/utils/eventBus.ts rename to apps/web/src/core/utils/eventBus.ts diff --git a/packages/web/src/core/utils/geo.ts b/apps/web/src/core/utils/geo.ts similarity index 100% rename from packages/web/src/core/utils/geo.ts rename to apps/web/src/core/utils/geo.ts diff --git a/packages/web/src/core/utils/github.ts b/apps/web/src/core/utils/github.ts similarity index 100% rename from packages/web/src/core/utils/github.ts rename to apps/web/src/core/utils/github.ts diff --git a/packages/web/src/core/utils/ip.test.ts b/apps/web/src/core/utils/ip.test.ts similarity index 100% rename from packages/web/src/core/utils/ip.test.ts rename to apps/web/src/core/utils/ip.test.ts diff --git a/packages/web/src/core/utils/ip.ts b/apps/web/src/core/utils/ip.ts similarity index 100% rename from packages/web/src/core/utils/ip.ts rename to apps/web/src/core/utils/ip.ts diff --git a/packages/web/src/core/utils/randId.test.ts b/apps/web/src/core/utils/randId.test.ts similarity index 100% rename from packages/web/src/core/utils/randId.test.ts rename to apps/web/src/core/utils/randId.test.ts diff --git a/packages/web/src/core/utils/randId.ts b/apps/web/src/core/utils/randId.ts similarity index 100% rename from packages/web/src/core/utils/randId.ts rename to apps/web/src/core/utils/randId.ts diff --git a/packages/web/src/core/utils/signalColor.ts b/apps/web/src/core/utils/signalColor.ts similarity index 100% rename from packages/web/src/core/utils/signalColor.ts rename to apps/web/src/core/utils/signalColor.ts diff --git a/packages/web/src/core/utils/sort.ts b/apps/web/src/core/utils/sort.ts similarity index 100% rename from packages/web/src/core/utils/sort.ts rename to apps/web/src/core/utils/sort.ts diff --git a/packages/web/src/core/utils/string.ts b/apps/web/src/core/utils/string.ts similarity index 100% rename from packages/web/src/core/utils/string.ts rename to apps/web/src/core/utils/string.ts diff --git a/packages/web/src/core/utils/x25519.ts b/apps/web/src/core/utils/x25519.ts similarity index 100% rename from packages/web/src/core/utils/x25519.ts rename to apps/web/src/core/utils/x25519.ts diff --git a/packages/web/src/i18n-config.ts b/apps/web/src/i18n-config.ts similarity index 100% rename from packages/web/src/i18n-config.ts rename to apps/web/src/i18n-config.ts diff --git a/packages/web/src/index.css b/apps/web/src/index.css similarity index 100% rename from packages/web/src/index.css rename to apps/web/src/index.css diff --git a/packages/web/src/index.tsx b/apps/web/src/index.tsx similarity index 100% rename from packages/web/src/index.tsx rename to apps/web/src/index.tsx diff --git a/packages/web/src/pages/Connections/index.tsx b/apps/web/src/pages/Connections/index.tsx similarity index 100% rename from packages/web/src/pages/Connections/index.tsx rename to apps/web/src/pages/Connections/index.tsx diff --git a/packages/web/src/pages/Connections/useConnections.ts b/apps/web/src/pages/Connections/useConnections.ts similarity index 100% rename from packages/web/src/pages/Connections/useConnections.ts rename to apps/web/src/pages/Connections/useConnections.ts diff --git a/packages/web/src/pages/Connections/utils.ts b/apps/web/src/pages/Connections/utils.ts similarity index 100% rename from packages/web/src/pages/Connections/utils.ts rename to apps/web/src/pages/Connections/utils.ts diff --git a/packages/web/src/pages/Map/index.tsx b/apps/web/src/pages/Map/index.tsx similarity index 100% rename from packages/web/src/pages/Map/index.tsx rename to apps/web/src/pages/Map/index.tsx diff --git a/packages/web/src/pages/Messages.tsx b/apps/web/src/pages/Messages.tsx similarity index 100% rename from packages/web/src/pages/Messages.tsx rename to apps/web/src/pages/Messages.tsx diff --git a/packages/web/src/pages/Nodes/index.tsx b/apps/web/src/pages/Nodes/index.tsx similarity index 93% rename from packages/web/src/pages/Nodes/index.tsx rename to apps/web/src/pages/Nodes/index.tsx index 394426c5..a86126cf 100644 --- a/packages/web/src/pages/Nodes/index.tsx +++ b/apps/web/src/pages/Nodes/index.tsx @@ -128,6 +128,13 @@ const NodesPage = (): JSX.Element => { last4: shortName, }); + // SNR is reported in dB. Map it to a 0–100% signal-quality heuristic + // (-10 dB → 0%, +10 dB → 100%) for an at-a-glance read, and pick a tone. + const snr = node.snr ?? 0; + const snrQuality = Math.min(Math.max(Math.round((snr + 10) * 5), 0), 100); + const snrTone = + snrQuality >= 67 ? "text-green-500" : snrQuality >= 34 ? "text-yellow-500" : "text-red-500"; + return { id: node.num, isFavorite: node.isFavorite, @@ -199,12 +206,11 @@ const NodesPage = (): JSX.Element => { }, { content: ( - - {node.snr} - {t("unit.dbm")}/{Math.min(Math.max((node.snr + 10) * 5, 0), 100)} - %/{/* Percentage */} - {(node.snr + 10) * 5} - {t("unit.raw")} + + + {Number(snr.toFixed(1))} {t("unit.db")} + + {snrQuality}% ), sortValue: node.snr, diff --git a/packages/web/src/pages/Settings/DeviceConfig.tsx b/apps/web/src/pages/Settings/DeviceConfig.tsx similarity index 100% rename from packages/web/src/pages/Settings/DeviceConfig.tsx rename to apps/web/src/pages/Settings/DeviceConfig.tsx diff --git a/packages/web/src/pages/Settings/ModuleConfig.tsx b/apps/web/src/pages/Settings/ModuleConfig.tsx similarity index 84% rename from packages/web/src/pages/Settings/ModuleConfig.tsx rename to apps/web/src/pages/Settings/ModuleConfig.tsx index 528eb682..f3596865 100644 --- a/packages/web/src/pages/Settings/ModuleConfig.tsx +++ b/apps/web/src/pages/Settings/ModuleConfig.tsx @@ -7,9 +7,13 @@ import { MQTT } from "@components/PageComponents/ModuleConfig/MQTT.tsx"; import { NeighborInfo } from "@components/PageComponents/ModuleConfig/NeighborInfo.tsx"; import { Paxcounter } from "@components/PageComponents/ModuleConfig/Paxcounter.tsx"; import { RangeTest } from "@components/PageComponents/ModuleConfig/RangeTest.tsx"; +import { RemoteHardware } from "@components/PageComponents/ModuleConfig/RemoteHardware.tsx"; import { Serial } from "@components/PageComponents/ModuleConfig/Serial.tsx"; +import { StatusMessage } from "@components/PageComponents/ModuleConfig/StatusMessage.tsx"; import { StoreForward } from "@components/PageComponents/ModuleConfig/StoreForward.tsx"; +import { Tak } from "@components/PageComponents/ModuleConfig/Tak.tsx"; import { Telemetry } from "@components/PageComponents/ModuleConfig/Telemetry.tsx"; +import { TrafficManagement } from "@components/PageComponents/ModuleConfig/TrafficManagement.tsx"; import { Spinner } from "@components/UI/Spinner.tsx"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@components/UI/Tabs.tsx"; import { useDevice, type ValidModuleConfigType } from "@core/stores"; @@ -89,6 +93,22 @@ export const ModuleConfig = ({ onFormInit }: ConfigProps) => { element: DetectionSensor, }, { case: "paxcounter", label: t("page.tabPaxcounter"), element: Paxcounter }, + { + case: "remoteHardware", + label: t("page.tabRemoteHardware"), + element: RemoteHardware, + }, + { + case: "trafficManagement", + label: t("page.tabTrafficManagement"), + element: TrafficManagement, + }, + { + case: "statusmessage", + label: t("page.tabStatusMessage"), + element: StatusMessage, + }, + { case: "tak", label: t("page.tabTak"), element: Tak }, ], [t], ); diff --git a/packages/web/src/pages/Settings/RadioConfig.tsx b/apps/web/src/pages/Settings/RadioConfig.tsx similarity index 100% rename from packages/web/src/pages/Settings/RadioConfig.tsx rename to apps/web/src/pages/Settings/RadioConfig.tsx diff --git a/packages/web/src/pages/Settings/index.tsx b/apps/web/src/pages/Settings/index.tsx similarity index 100% rename from packages/web/src/pages/Settings/index.tsx rename to apps/web/src/pages/Settings/index.tsx diff --git a/packages/web/src/routes.tsx b/apps/web/src/routes.tsx similarity index 100% rename from packages/web/src/routes.tsx rename to apps/web/src/routes.tsx diff --git a/apps/web/src/sdk-preview/README.md b/apps/web/src/sdk-preview/README.md new file mode 100644 index 00000000..454c8849 --- /dev/null +++ b/apps/web/src/sdk-preview/README.md @@ -0,0 +1,69 @@ +# sdk-preview — a proof-of-direction slice + +This folder is a small, self-contained demonstration of the architecture from +**[meshtastic/web#1050](https://github.com/meshtastic/web/pull/1050)** (Dan's +`@meshtastic/sdk` migration), built against the **firmware-current protobufs** +synced in this branch. + +It is **not wired into the live app** and replaces nothing. The goal is to show +the *shape* of the SDK direction — domain-driven slices, signals-backed reactive +state, `Result`-returning use-cases, and ports/adapters — without pulling in the +full SDK + sqlocal/OPFS persistence stack. + +## What it mirrors + +| This slice | `@meshtastic/sdk` (PR #1050) | +| --- | --- | +| `core/signals` (`createStore`, `SignalMap`, `ReadonlySignal`) | `core/signals` | +| `core/errors` (`MeshError`, `toMeshError`) | `core/errors` | +| `core/client/MeshClientPort` (minimal port) | `core/client/MeshClient` | +| `features/config/domain` (`RadioConfig`, `ModuleConfig`, `ConfigEditor`) | same | +| `features/config/application/ConfigUseCases` (`Result`) | same | +| `features/config/infrastructure` (`ConfigMapper`, `configBuilders`) | same | +| `react/useSignal`, `react/useConfigEditor` | `@meshtastic/sdk-react` | +| `adapters/fromMeshDevice` | the SDK's transport/registry wiring | + +## The pattern on display: `ConfigEditor` + +`ConfigEditor` is the piece that replaces today's Zustand `changeRegistry`. It +keeps two reactive views per config section: + +- **baseline** — device truth, updated automatically from `onConfigPacket` / + `onModuleConfigPacket`. +- **working** — the UI's in-flight edits. + +A mid-edit packet from the device updates the baseline but **does not clobber a +section the user is editing**; `commit()` sends only the dirty sections inside a +`beginEdit → setConfig…/setModuleConfig… → commitEdit` envelope and returns a +`Result`; disconnect resets everything so a stale working copy can't leak across +reconnects. See `features/config/__tests__/ConfigEditor.test.ts`. + +## Why this ties the branch together + +`RadioConfigSection` / `ModuleConfigSection` are **derived from the protobufs** +(`Exclude<…payloadVariant["case"]>`), and `ConfigMapper` is fully generic. Because +this branch already synced the firmware-current protobufs, the new modules +(`trafficManagement`, `statusmessage`, `tak`, `remoteHardware`) and new config +fields flow through the domain, mapper, editor, and dirty-tracking **with zero +per-section code** — which is exactly the leverage the SDK migration is built on. + +## Wiring it into a page (illustrative) + +```tsx +import { useConfigEditor, useSignal } from "@app/sdk-preview"; + +function TrafficManagementPanel() { + const editor = useConfigEditor(); + const modules = useSignal(editor?.modules ?? /* empty signal */); + const isDirty = useSignal(editor?.isDirty ?? /* false signal */); + // editor.setModuleSection("trafficManagement", next); … editor.commit(); +} +``` + +## Deliberately out of scope + +- Channels / owner / queued-admin editing (need the channels + nodes slices). +- `@meshtastic/sdk-storage-sqlocal` (OPFS SQLite) persistence. +- The full `MeshClient` / `MeshRegistry` multi-device client. +- Live UI adoption — that's the slice-by-slice migration tracked in PR #1050's + follow-ups. diff --git a/apps/web/src/sdk-preview/adapters/fromMeshDevice.ts b/apps/web/src/sdk-preview/adapters/fromMeshDevice.ts new file mode 100644 index 00000000..45231214 --- /dev/null +++ b/apps/web/src/sdk-preview/adapters/fromMeshDevice.ts @@ -0,0 +1,42 @@ +import type { MeshDevice } from "@meshtastic/core"; +import type { MeshClientPort } from "../core/index.ts"; +import { ConfigEditor } from "../features/config/index.ts"; + +/** + * Adapts the legacy `@meshtastic/core` `MeshDevice` to the slice's + * `MeshClientPort`. + * + * In the real SDK (PR #1050) the client owns explicit begin/commit admin + * messages. The legacy `MeshDevice.setConfig` already opens the edit + * transaction itself (guarded by its `pendingSettingsChanges` flag) and + * `commitEditSettings()` closes it — so `beginEditSettings` here is a no-op and + * the transaction is driven by the existing device methods. + */ +export function meshDeviceToPort(device: MeshDevice): MeshClientPort { + return { + events: { + onConfigPacket: device.events.onConfigPacket, + onModuleConfigPacket: device.events.onModuleConfigPacket, + onDeviceStatus: device.events.onDeviceStatus, + }, + setConfig: (config) => device.setConfig(config), + setModuleConfig: (moduleConfig) => device.setModuleConfig(moduleConfig), + beginEditSettings: () => Promise.resolve(0), + commitEditSettings: () => device.commitEditSettings(), + }; +} + +const editors = new WeakMap(); + +/** + * Returns the `ConfigEditor` for a device connection, creating it lazily and + * caching one per connection (so every consumer binds to the same signals). + */ +export function getConfigEditor(device: MeshDevice): ConfigEditor { + let editor = editors.get(device); + if (!editor) { + editor = new ConfigEditor(meshDeviceToPort(device)); + editors.set(device, editor); + } + return editor; +} diff --git a/apps/web/src/sdk-preview/core/client/MeshClientPort.ts b/apps/web/src/sdk-preview/core/client/MeshClientPort.ts new file mode 100644 index 00000000..333adc29 --- /dev/null +++ b/apps/web/src/sdk-preview/core/client/MeshClientPort.ts @@ -0,0 +1,34 @@ +import type { Protobuf, Types } from "@meshtastic/core"; + +/** + * Minimal subscribe-only view of an event source. `ste-simple-events`' + * `SimpleEventDispatcher` (used by the legacy `MeshDevice`) satisfies this, as + * does a preact signal facade — so the slice doesn't care where events come + * from. + */ +export interface Subscribable { + subscribe(listener: (value: T) => void): unknown; +} + +/** The subset of device events the config slice subscribes to. */ +export interface MeshClientEvents { + onConfigPacket: Subscribable; + onModuleConfigPacket: Subscribable; + onDeviceStatus: Subscribable; +} + +/** + * The port the config slice talks to. + * + * In the real SDK this is the full `MeshClient`; here it is the minimal surface + * `ConfigEditor` needs, so the slice stays decoupled and unit-testable with a + * fake. `adapters/fromMeshDevice.ts` builds one of these from the existing + * `@meshtastic/core` `MeshDevice`. + */ +export interface MeshClientPort { + readonly events: MeshClientEvents; + setConfig(config: Protobuf.Config.Config): Promise; + setModuleConfig(moduleConfig: Protobuf.ModuleConfig.ModuleConfig): Promise; + beginEditSettings(): Promise; + commitEditSettings(): Promise; +} diff --git a/apps/web/src/sdk-preview/core/errors/MeshError.ts b/apps/web/src/sdk-preview/core/errors/MeshError.ts new file mode 100644 index 00000000..88b61cfa --- /dev/null +++ b/apps/web/src/sdk-preview/core/errors/MeshError.ts @@ -0,0 +1,30 @@ +/** + * Typed error hierarchy mirroring `@meshtastic/sdk` (PR #1050). New application + * use-cases return `Result` instead of throwing; transport-level + * failures are represented as concrete subclasses so callers can branch on + * `instanceof` rather than string-matching messages. + */ +export class MeshError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + this.name = "MeshError"; + } +} + +export class ConfigCommitError extends MeshError { + constructor(section: string, options?: ErrorOptions) { + super(`Failed to commit config section "${section}"`, options); + this.name = "ConfigCommitError"; + } +} + +/** Wraps an unknown thrown value into a MeshError without losing the cause. */ +export function toMeshError(value: unknown): MeshError { + if (value instanceof MeshError) { + return value; + } + if (value instanceof Error) { + return new MeshError(value.message, { cause: value }); + } + return new MeshError(String(value)); +} diff --git a/apps/web/src/sdk-preview/core/index.ts b/apps/web/src/sdk-preview/core/index.ts new file mode 100644 index 00000000..70d9a8b5 --- /dev/null +++ b/apps/web/src/sdk-preview/core/index.ts @@ -0,0 +1,3 @@ +export type { MeshClientEvents, MeshClientPort, Subscribable } from "./client/MeshClientPort.ts"; +export { ConfigCommitError, MeshError, toMeshError } from "./errors/MeshError.ts"; +export { createStore, type ReadonlySignal, SignalMap, toReadonly } from "./signals/index.ts"; diff --git a/apps/web/src/sdk-preview/core/signals/createStore.ts b/apps/web/src/sdk-preview/core/signals/createStore.ts new file mode 100644 index 00000000..f607256c --- /dev/null +++ b/apps/web/src/sdk-preview/core/signals/createStore.ts @@ -0,0 +1,104 @@ +import { + type ReadonlySignal as PreactReadonlySignal, + type Signal, + signal, +} from "@preact/signals-core"; + +/** + * Reactive read-only view of a signal. + * + * Compatible with React's `useSyncExternalStore` contract: consumers subscribe + * for change notifications and call `value` / `peek()` to read. + * + * Mirrors `@meshtastic/sdk`'s core signals primitive from PR #1050. The point + * of this preview slice is to show the *shape* of the SDK direction inside the + * current app without pulling in the whole SDK + sqlocal stack. + */ +export interface ReadonlySignal { + readonly value: T; + peek(): T; + subscribe(listener: (value: T) => void): () => void; +} + +/** + * Wraps a preact signal into the SDK's `ReadonlySignal` interface. Returns both + * the writable signal (for slice-internal use) and the readable facade (for + * external consumption). + */ +export function createStore(initial: T): { + write: Signal; + read: ReadonlySignal; +} { + const write = signal(initial); + return { write, read: toReadonly(write) }; +} + +export function toReadonly(s: Signal | PreactReadonlySignal): ReadonlySignal { + return { + get value() { + return s.value; + }, + peek: () => s.peek(), + subscribe: (listener) => { + // Skip the immediate synchronous emit so `subscribe` only fires on change, + // matching the SDK contract (and avoiding a redundant first render). + let first = true; + return s.subscribe((v) => { + if (first) { + first = false; + return; + } + listener(v); + }); + }, + }; +} + +/** + * Keyed collection built on a single backing signal, emitting a new array + * snapshot on each mutation. Sufficient for nodes/messages where consumers + * subscribe to the whole list and filter locally. + */ +export class SignalMap { + private readonly inner: Map = new Map(); + private readonly backing: Signal>; + public readonly read: ReadonlySignal>; + + constructor() { + this.backing = signal>([]); + this.read = toReadonly(this.backing); + } + + get(key: K): V | undefined { + return this.inner.get(key); + } + + has(key: K): boolean { + return this.inner.has(key); + } + + set(key: K, value: V): void { + this.inner.set(key, value); + this.backing.value = Array.from(this.inner.values()); + } + + delete(key: K): boolean { + const removed = this.inner.delete(key); + if (removed) { + this.backing.value = Array.from(this.inner.values()); + } + return removed; + } + + clear(): void { + if (this.inner.size === 0) { + return; + } + this.inner.clear(); + this.backing.value = []; + } + + get size(): number { + return this.inner.size; + } +} diff --git a/apps/web/src/sdk-preview/core/signals/index.ts b/apps/web/src/sdk-preview/core/signals/index.ts new file mode 100644 index 00000000..c660d659 --- /dev/null +++ b/apps/web/src/sdk-preview/core/signals/index.ts @@ -0,0 +1 @@ +export { createStore, type ReadonlySignal, SignalMap, toReadonly } from "./createStore.ts"; diff --git a/apps/web/src/sdk-preview/features/config/__tests__/ConfigEditor.test.ts b/apps/web/src/sdk-preview/features/config/__tests__/ConfigEditor.test.ts new file mode 100644 index 00000000..b0030b18 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/__tests__/ConfigEditor.test.ts @@ -0,0 +1,157 @@ +import { create } from "@bufbuild/protobuf"; +import { Protobuf, Types } from "@meshtastic/core"; +import { Result } from "better-result"; +import { describe, expect, it } from "vitest"; +import type { MeshClientPort, Subscribable } from "../../../core/index.ts"; +import { ConfigEditor } from "../domain/ConfigEditor.ts"; + +/** Controllable in-test emitter satisfying `Subscribable`. */ +function emitter(): Subscribable & { emit: (value: T) => void } { + const listeners = new Set<(value: T) => void>(); + return { + subscribe(listener) { + listeners.add(listener); + return () => listeners.delete(listener); + }, + emit(value) { + for (const listener of [...listeners]) { + listener(value); + } + }, + }; +} + +function makePort() { + const onConfigPacket = emitter(); + const onModuleConfigPacket = emitter(); + const onDeviceStatus = emitter(); + const calls: string[] = []; + const port: MeshClientPort = { + events: { onConfigPacket, onModuleConfigPacket, onDeviceStatus }, + setConfig: (config) => { + calls.push(`setConfig:${config.payloadVariant.case}`); + return Promise.resolve(1); + }, + setModuleConfig: (moduleConfig) => { + calls.push(`setModuleConfig:${moduleConfig.payloadVariant.case}`); + return Promise.resolve(1); + }, + beginEditSettings: () => { + calls.push("begin"); + return Promise.resolve(1); + }, + commitEditSettings: () => { + calls.push("commit"); + return Promise.resolve(1); + }, + }; + return { port, onConfigPacket, onModuleConfigPacket, onDeviceStatus, calls }; +} + +const loraConfig = (hopLimit: number): Protobuf.Config.Config => + create(Protobuf.Config.ConfigSchema, { + payloadVariant: { + case: "lora", + value: create(Protobuf.Config.Config_LoRaConfigSchema, { hopLimit }), + }, + }); + +const lora = (hopLimit: number) => create(Protobuf.Config.Config_LoRaConfigSchema, { hopLimit }); + +const trafficModuleConfig = (enabled: boolean): Protobuf.ModuleConfig.ModuleConfig => + create(Protobuf.ModuleConfig.ModuleConfigSchema, { + payloadVariant: { + case: "trafficManagement", + value: create(Protobuf.ModuleConfig.ModuleConfig_TrafficManagementConfigSchema, { enabled }), + }, + }); + +describe("ConfigEditor (sdk-preview)", () => { + it("hydrates baseline + working from an inbound config packet without becoming dirty", () => { + const { port, onConfigPacket } = makePort(); + const editor = new ConfigEditor(port); + + onConfigPacket.emit(loraConfig(3)); + + expect(editor.radio.peek().lora?.hopLimit).toBe(3); + expect(editor.isDirty.peek()).toBe(false); + expect(editor.dirtyRadioSections.peek()).toEqual([]); + }); + + it("marks a section dirty when edited", () => { + const { port, onConfigPacket } = makePort(); + const editor = new ConfigEditor(port); + + onConfigPacket.emit(loraConfig(3)); + editor.setRadioSection("lora", lora(5)); + + expect(editor.isDirty.peek()).toBe(true); + expect(editor.dirtyRadioSections.peek()).toEqual(["lora"]); + }); + + it("does not clobber a dirty section when a competing baseline packet arrives", () => { + const { port, onConfigPacket } = makePort(); + const editor = new ConfigEditor(port); + + onConfigPacket.emit(loraConfig(3)); + editor.setRadioSection("lora", lora(5)); + onConfigPacket.emit(loraConfig(7)); // device pushes a different value mid-edit + + expect(editor.radio.peek().lora?.hopLimit).toBe(5); // user edit preserved + expect(editor.isDirty.peek()).toBe(true); + }); + + it("commits dirty sections inside a begin/…/commit envelope and clears dirty", async () => { + const { port, onConfigPacket, calls } = makePort(); + const editor = new ConfigEditor(port); + + onConfigPacket.emit(loraConfig(3)); + editor.setRadioSection("lora", lora(5)); + const result = await editor.commit(); + + expect(Result.isError(result)).toBe(false); + expect(calls).toEqual(["begin", "setConfig:lora", "commit"]); + expect(editor.isDirty.peek()).toBe(false); + expect(editor.radio.peek().lora?.hopLimit).toBe(5); // baseline now equals working + }); + + it("supports firmware-current module sections (trafficManagement) end to end", async () => { + const { port, onModuleConfigPacket, calls } = makePort(); + const editor = new ConfigEditor(port); + + onModuleConfigPacket.emit(trafficModuleConfig(false)); + editor.setModuleSection( + "trafficManagement", + create(Protobuf.ModuleConfig.ModuleConfig_TrafficManagementConfigSchema, { enabled: true }), + ); + + expect(editor.dirtyModuleSections.peek()).toEqual(["trafficManagement"]); + const result = await editor.commit(); + expect(Result.isError(result)).toBe(false); + expect(calls).toEqual(["begin", "setModuleConfig:trafficManagement", "commit"]); + }); + + it("reset() discards working edits back to baseline", () => { + const { port, onConfigPacket } = makePort(); + const editor = new ConfigEditor(port); + + onConfigPacket.emit(loraConfig(3)); + editor.setRadioSection("lora", lora(9)); + editor.reset(); + + expect(editor.radio.peek().lora?.hopLimit).toBe(3); + expect(editor.isDirty.peek()).toBe(false); + }); + + it("clears all state on disconnect", () => { + const { port, onConfigPacket, onDeviceStatus } = makePort(); + const editor = new ConfigEditor(port); + + onConfigPacket.emit(loraConfig(3)); + editor.setRadioSection("lora", lora(5)); + onDeviceStatus.emit(Types.DeviceStatusEnum.DeviceDisconnected); + + expect(editor.radio.peek()).toEqual({}); + expect(editor.isDirty.peek()).toBe(false); + }); +}); diff --git a/apps/web/src/sdk-preview/features/config/application/ConfigUseCases.ts b/apps/web/src/sdk-preview/features/config/application/ConfigUseCases.ts new file mode 100644 index 00000000..f5cca125 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/application/ConfigUseCases.ts @@ -0,0 +1,53 @@ +import type { Protobuf } from "@meshtastic/core"; +import { Result } from "better-result"; +import type { ResultType } from "better-result"; +import type { MeshClientPort } from "../../../core/client/MeshClientPort.ts"; +import { type MeshError, toMeshError } from "../../../core/errors/MeshError.ts"; + +/** + * Application use-cases for the config slice. Each wraps a transport call in a + * `Result` instead of throwing — mirroring the SDK's + * use-case layer from PR #1050. The returned number is the sent packet id. + */ + +export async function beginEditSettings( + client: MeshClientPort, +): Promise> { + try { + return Result.ok(await client.beginEditSettings()); + } catch (error) { + return Result.err(toMeshError(error)); + } +} + +export async function commitEditSettings( + client: MeshClientPort, +): Promise> { + try { + return Result.ok(await client.commitEditSettings()); + } catch (error) { + return Result.err(toMeshError(error)); + } +} + +export async function setConfig( + client: MeshClientPort, + config: Protobuf.Config.Config, +): Promise> { + try { + return Result.ok(await client.setConfig(config)); + } catch (error) { + return Result.err(toMeshError(error)); + } +} + +export async function setModuleConfig( + client: MeshClientPort, + moduleConfig: Protobuf.ModuleConfig.ModuleConfig, +): Promise> { + try { + return Result.ok(await client.setModuleConfig(moduleConfig)); + } catch (error) { + return Result.err(toMeshError(error)); + } +} diff --git a/apps/web/src/sdk-preview/features/config/domain/ConfigEditor.ts b/apps/web/src/sdk-preview/features/config/domain/ConfigEditor.ts new file mode 100644 index 00000000..472825c5 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/domain/ConfigEditor.ts @@ -0,0 +1,234 @@ +import { Types } from "@meshtastic/core"; +import { signal } from "@preact/signals-core"; +import { Result } from "better-result"; +import type { ResultType } from "better-result"; +import type { MeshClientPort } from "../../../core/client/MeshClientPort.ts"; +import type { MeshError } from "../../../core/errors/MeshError.ts"; +import { type ReadonlySignal, toReadonly } from "../../../core/signals/index.ts"; +import { + beginEditSettings, + commitEditSettings, + setConfig, + setModuleConfig, +} from "../application/ConfigUseCases.ts"; +import { buildModuleConfig, buildRadioConfig } from "../infrastructure/configBuilders.ts"; +import { ConfigMapper } from "../infrastructure/ConfigMapper.ts"; +import type { ModuleConfig, ModuleConfigSection } from "./ModuleConfig.ts"; +import type { RadioConfig, RadioConfigSection } from "./RadioConfig.ts"; + +/** + * Per-section editor for radio config + module config — a faithful, scoped port + * of `@meshtastic/sdk`'s `ConfigEditor` (PR #1050). Demonstrates the pattern + * that replaces the current Zustand `changeRegistry`: + * + * - **Baseline**: what the device most recently sent. Updated automatically from + * `onConfigPacket` / `onModuleConfigPacket`, and re-applied as post-commit truth. + * - **Working copy**: UI edits via `setRadioSection` / `setModuleSection`. + * Mid-edit baseline updates do NOT clobber a section the user is editing. + * - On disconnect both reset, so a stale working copy can't leak across reconnects. + * + * All state is exposed as `ReadonlySignal`s; React binds via `useSignal`. + */ +export class ConfigEditor { + private readonly client: MeshClientPort; + + private readonly baselineRadio = signal({}); + private readonly baselineModules = signal({}); + private readonly workingRadio = signal({}); + private readonly workingModules = signal({}); + private readonly _dirtyRadioSections = signal([]); + private readonly _dirtyModuleSections = signal([]); + private readonly _isDirty = signal(false); + + public readonly radio: ReadonlySignal = toReadonly(this.workingRadio); + public readonly modules: ReadonlySignal = toReadonly(this.workingModules); + public readonly dirtyRadioSections: ReadonlySignal = toReadonly( + this._dirtyRadioSections, + ); + public readonly dirtyModuleSections: ReadonlySignal = toReadonly( + this._dirtyModuleSections, + ); + public readonly isDirty: ReadonlySignal = toReadonly(this._isDirty); + + constructor(client: MeshClientPort) { + this.client = client; + + client.events.onConfigPacket.subscribe((config) => { + const next = ConfigMapper.mergeRadio(this.baselineRadio.peek(), config); + this.baselineRadio.value = next; + const variant = config.payloadVariant.case; + if (variant) { + // Apply the baseline update to the working copy only if the user hasn't + // already edited this section — their in-flight edit wins. + if (!this._dirtyRadioSections.peek().includes(variant)) { + this.workingRadio.value = { ...this.workingRadio.peek(), [variant]: next[variant] }; + } + } + this.recomputeDirty(); + }); + + client.events.onModuleConfigPacket.subscribe((moduleConfig) => { + const next = ConfigMapper.mergeModule(this.baselineModules.peek(), moduleConfig); + this.baselineModules.value = next; + const variant = moduleConfig.payloadVariant.case; + if (variant) { + if (!this._dirtyModuleSections.peek().includes(variant)) { + this.workingModules.value = { ...this.workingModules.peek(), [variant]: next[variant] }; + } + } + this.recomputeDirty(); + }); + + client.events.onDeviceStatus.subscribe((status) => { + if (status === Types.DeviceStatusEnum.DeviceDisconnected) { + this.baselineRadio.value = {}; + this.baselineModules.value = {}; + this.workingRadio.value = {}; + this.workingModules.value = {}; + this._dirtyRadioSections.value = []; + this._dirtyModuleSections.value = []; + this._isDirty.value = false; + } + }); + } + + public setRadioSection( + key: K, + value: RadioConfig[K], + ): void { + this.workingRadio.value = { ...this.workingRadio.peek(), [key]: value }; + this.recomputeDirty(); + } + + public setModuleSection( + key: K, + value: ModuleConfig[K], + ): void { + this.workingModules.value = { ...this.workingModules.peek(), [key]: value }; + this.recomputeDirty(); + } + + /** Discard all working edits, snapping back to the device's baseline. */ + public reset(): void { + this.workingRadio.value = this.baselineRadio.peek(); + this.workingModules.value = this.baselineModules.peek(); + this.recomputeDirty(); + } + + /** + * Send every dirty section to the device inside a beginEdit/commitEdit pair. + * On success the baseline is replaced with the working copy (optimistic); + * inbound config packets after commit reconcile. Any failure aborts and + * returns the error — the baseline is left untouched. + */ + public async commit(): Promise> { + if (!this._isDirty.peek()) { + return Result.ok(undefined); + } + + const begin = await beginEditSettings(this.client); + if (Result.isError(begin)) { + return Result.err(begin.error); + } + + const radio = this.workingRadio.peek(); + for (const section of this._dirtyRadioSections.peek()) { + const value = radio[section]; + if (value === undefined) { + continue; + } + const result = await setConfig(this.client, buildRadioConfig(section, value)); + if (Result.isError(result)) { + return Result.err(result.error); + } + } + + const modules = this.workingModules.peek(); + for (const section of this._dirtyModuleSections.peek()) { + const value = modules[section]; + if (value === undefined) { + continue; + } + const result = await setModuleConfig(this.client, buildModuleConfig(section, value)); + if (Result.isError(result)) { + return Result.err(result.error); + } + } + + const commit = await commitEditSettings(this.client); + if (Result.isError(commit)) { + return Result.err(commit.error); + } + + this.baselineRadio.value = this.workingRadio.peek(); + this.baselineModules.value = this.workingModules.peek(); + this._dirtyRadioSections.value = []; + this._dirtyModuleSections.value = []; + this._isDirty.value = false; + return Result.ok(undefined); + } + + private recomputeDirty(): void { + const radioBase = this.baselineRadio.peek(); + const radioWorking = this.workingRadio.peek(); + const radioDirty: RadioConfigSection[] = []; + for (const key of new Set([...Object.keys(radioBase), ...Object.keys(radioWorking)])) { + const section = key as RadioConfigSection; + if (!shallowEqual(radioBase[section], radioWorking[section])) { + radioDirty.push(section); + } + } + + const moduleBase = this.baselineModules.peek(); + const moduleWorking = this.workingModules.peek(); + const moduleDirty: ModuleConfigSection[] = []; + for (const key of new Set([ + ...Object.keys(moduleBase), + ...Object.keys(moduleWorking), + ])) { + const section = key as ModuleConfigSection; + if (!shallowEqual(moduleBase[section], moduleWorking[section])) { + moduleDirty.push(section); + } + } + + this._dirtyRadioSections.value = radioDirty; + this._dirtyModuleSections.value = moduleDirty; + this._isDirty.value = radioDirty.length > 0 || moduleDirty.length > 0; + } +} + +/** Recursive value-equality used for dirty detection (matches the SDK helper). */ +function shallowEqual(a: unknown, b: unknown): boolean { + if (a === b) { + return true; + } + if (a === undefined || b === undefined || a === null || b === null) { + return false; + } + if (typeof a !== "object" || typeof b !== "object") { + return false; + } + const ao = a as Record; + const bo = b as Record; + const aKeys = Object.keys(ao); + const bKeys = Object.keys(bo); + if (aKeys.length !== bKeys.length) { + return false; + } + for (const k of aKeys) { + const av = ao[k]; + const bv = bo[k]; + if (av === bv) { + continue; + } + if (typeof av === "object" && typeof bv === "object") { + if (!shallowEqual(av, bv)) { + return false; + } + } else { + return false; + } + } + return true; +} diff --git a/apps/web/src/sdk-preview/features/config/domain/ModuleConfig.ts b/apps/web/src/sdk-preview/features/config/domain/ModuleConfig.ts new file mode 100644 index 00000000..e47215d6 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/domain/ModuleConfig.ts @@ -0,0 +1,20 @@ +import type { Protobuf } from "@meshtastic/core"; + +/** + * The module-config sections keyed by their protobuf variant case. Because this + * is derived from the firmware-current protobufs, the new modules synced in + * this branch — `trafficManagement`, `statusmessage`, `tak`, `remoteHardware` — + * are already members with zero extra code. + */ +export type ModuleConfigSection = Exclude< + Protobuf.ModuleConfig.ModuleConfig["payloadVariant"]["case"], + undefined +>; + +/** Section -> proto-payload map, derived directly from the `ModuleConfig` message. */ +export type ModuleConfig = { + readonly [V in ModuleConfigSection]?: Extract< + Protobuf.ModuleConfig.ModuleConfig["payloadVariant"], + { case: V } + >["value"]; +}; diff --git a/apps/web/src/sdk-preview/features/config/domain/RadioConfig.ts b/apps/web/src/sdk-preview/features/config/domain/RadioConfig.ts new file mode 100644 index 00000000..416918f5 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/domain/RadioConfig.ts @@ -0,0 +1,19 @@ +import type { Protobuf } from "@meshtastic/core"; + +/** + * The radio-config sections keyed by their protobuf variant case (excluding the + * "no variant" undefined case). Derived directly from the `Config` message, so + * new firmware variants stay typed automatically — no per-section maintenance. + */ +export type RadioConfigSection = Exclude< + Protobuf.Config.Config["payloadVariant"]["case"], + undefined +>; + +/** Section -> proto-payload map, derived directly from the `Config` message. */ +export type RadioConfig = { + readonly [V in RadioConfigSection]?: Extract< + Protobuf.Config.Config["payloadVariant"], + { case: V } + >["value"]; +}; diff --git a/apps/web/src/sdk-preview/features/config/index.ts b/apps/web/src/sdk-preview/features/config/index.ts new file mode 100644 index 00000000..3eec5b60 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/index.ts @@ -0,0 +1,4 @@ +export { ConfigEditor } from "./domain/ConfigEditor.ts"; +export type { ModuleConfig, ModuleConfigSection } from "./domain/ModuleConfig.ts"; +export type { RadioConfig, RadioConfigSection } from "./domain/RadioConfig.ts"; +export { ConfigMapper } from "./infrastructure/ConfigMapper.ts"; diff --git a/apps/web/src/sdk-preview/features/config/infrastructure/ConfigMapper.ts b/apps/web/src/sdk-preview/features/config/infrastructure/ConfigMapper.ts new file mode 100644 index 00000000..92e92ab5 --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/infrastructure/ConfigMapper.ts @@ -0,0 +1,26 @@ +import type { Protobuf } from "@meshtastic/core"; +import type { ModuleConfig } from "../domain/ModuleConfig.ts"; +import type { RadioConfig } from "../domain/RadioConfig.ts"; + +/** + * Translates inbound protobuf `Config` / `ModuleConfig` packets into the slice's + * section-keyed domain shape. Fully generic — new firmware sections flow through + * with no code change, exactly like the SDK mapper in PR #1050. + */ +export const ConfigMapper = { + mergeRadio(existing: RadioConfig, incoming: Protobuf.Config.Config): RadioConfig { + const variant = incoming.payloadVariant; + if (!variant.case) { + return existing; + } + return { ...existing, [variant.case]: variant.value }; + }, + + mergeModule(existing: ModuleConfig, incoming: Protobuf.ModuleConfig.ModuleConfig): ModuleConfig { + const variant = incoming.payloadVariant; + if (!variant.case) { + return existing; + } + return { ...existing, [variant.case]: variant.value }; + }, +}; diff --git a/apps/web/src/sdk-preview/features/config/infrastructure/configBuilders.ts b/apps/web/src/sdk-preview/features/config/infrastructure/configBuilders.ts new file mode 100644 index 00000000..43704d2d --- /dev/null +++ b/apps/web/src/sdk-preview/features/config/infrastructure/configBuilders.ts @@ -0,0 +1,27 @@ +import { create } from "@bufbuild/protobuf"; +import { Protobuf } from "@meshtastic/core"; +import type { ModuleConfig, ModuleConfigSection } from "../domain/ModuleConfig.ts"; +import type { RadioConfig, RadioConfigSection } from "../domain/RadioConfig.ts"; + +/** Wrap a single radio-config section value back into a `Config` message. */ +export function buildRadioConfig( + section: K, + value: NonNullable, +): Protobuf.Config.Config { + return create(Protobuf.Config.ConfigSchema, { + payloadVariant: { case: section, value } as Protobuf.Config.Config["payloadVariant"], + }); +} + +/** Wrap a single module-config section value back into a `ModuleConfig` message. */ +export function buildModuleConfig( + section: K, + value: NonNullable, +): Protobuf.ModuleConfig.ModuleConfig { + return create(Protobuf.ModuleConfig.ModuleConfigSchema, { + payloadVariant: { + case: section, + value, + } as Protobuf.ModuleConfig.ModuleConfig["payloadVariant"], + }); +} diff --git a/apps/web/src/sdk-preview/index.ts b/apps/web/src/sdk-preview/index.ts new file mode 100644 index 00000000..d8f30d05 --- /dev/null +++ b/apps/web/src/sdk-preview/index.ts @@ -0,0 +1,12 @@ +// Public surface of the SDK-direction preview slice. See ./README.md. +export * from "./core/index.ts"; +export { ConfigEditor } from "./features/config/index.ts"; +export type { + ModuleConfig, + ModuleConfigSection, + RadioConfig, + RadioConfigSection, +} from "./features/config/index.ts"; +export { getConfigEditor, meshDeviceToPort } from "./adapters/fromMeshDevice.ts"; +export { useConfigEditor } from "./react/useConfigEditor.ts"; +export { useSignal } from "./react/useSignal.ts"; diff --git a/apps/web/src/sdk-preview/react/useConfigEditor.ts b/apps/web/src/sdk-preview/react/useConfigEditor.ts new file mode 100644 index 00000000..7fb2507d --- /dev/null +++ b/apps/web/src/sdk-preview/react/useConfigEditor.ts @@ -0,0 +1,16 @@ +import { useDevice } from "@core/stores"; +import { getConfigEditor } from "../adapters/fromMeshDevice.ts"; +import type { ConfigEditor } from "../features/config/index.ts"; + +/** + * Returns the active connection's `ConfigEditor`, or `undefined` when nothing is + * connected. The editor owns reactive signals — components bind to + * `editor.radio`, `editor.dirtyModuleSections`, `editor.isDirty`, etc. via + * `useSignal` to re-render on change. Mirrors `useConfigEditor` from + * `@meshtastic/sdk-react` (PR #1050), sourced here from the legacy device + * connection rather than a `MeshRegistry`. + */ +export function useConfigEditor(): ConfigEditor | undefined { + const { connection } = useDevice(); + return connection ? getConfigEditor(connection) : undefined; +} diff --git a/apps/web/src/sdk-preview/react/useSignal.ts b/apps/web/src/sdk-preview/react/useSignal.ts new file mode 100644 index 00000000..e1a37b74 --- /dev/null +++ b/apps/web/src/sdk-preview/react/useSignal.ts @@ -0,0 +1,16 @@ +import { useSyncExternalStore } from "react"; +import type { ReadonlySignal } from "../core/index.ts"; + +/** + * Subscribes a component to a `ReadonlySignal` and returns its current value. + * + * Uses `useSyncExternalStore` so concurrent-mode renders see a consistent + * snapshot. Mirrors `@meshtastic/sdk-react`'s `useSignal` (PR #1050). + */ +export function useSignal(sig: ReadonlySignal): T { + return useSyncExternalStore( + sig.subscribe, + () => sig.value, + () => sig.peek(), + ); +} diff --git a/packages/web/src/tests/setup.ts b/apps/web/src/tests/setup.ts similarity index 100% rename from packages/web/src/tests/setup.ts rename to apps/web/src/tests/setup.ts diff --git a/packages/web/src/tests/test-utils.tsx b/apps/web/src/tests/test-utils.tsx similarity index 100% rename from packages/web/src/tests/test-utils.tsx rename to apps/web/src/tests/test-utils.tsx diff --git a/packages/web/src/validation/channel.test.ts b/apps/web/src/validation/channel.test.ts similarity index 100% rename from packages/web/src/validation/channel.test.ts rename to apps/web/src/validation/channel.test.ts diff --git a/packages/web/src/validation/channel.ts b/apps/web/src/validation/channel.ts similarity index 100% rename from packages/web/src/validation/channel.ts rename to apps/web/src/validation/channel.ts diff --git a/packages/web/src/validation/config/bluetooth.ts b/apps/web/src/validation/config/bluetooth.ts similarity index 100% rename from packages/web/src/validation/config/bluetooth.ts rename to apps/web/src/validation/config/bluetooth.ts diff --git a/packages/web/src/validation/config/device.ts b/apps/web/src/validation/config/device.ts similarity index 100% rename from packages/web/src/validation/config/device.ts rename to apps/web/src/validation/config/device.ts diff --git a/packages/web/src/validation/config/display.ts b/apps/web/src/validation/config/display.ts similarity index 96% rename from packages/web/src/validation/config/display.ts rename to apps/web/src/validation/config/display.ts index 46e6c371..852e8410 100644 --- a/packages/web/src/validation/config/display.ts +++ b/apps/web/src/validation/config/display.ts @@ -22,6 +22,7 @@ export const DisplayValidationSchema = z.object({ wakeOnTapOrMotion: z.boolean(), compassOrientation: CompassOrientationEnum, use12hClock: z.boolean(), + enableMessageBubbles: z.boolean(), }); export type DisplayValidation = z.infer; diff --git a/packages/web/src/validation/config/lora.test.ts b/apps/web/src/validation/config/lora.test.ts similarity index 100% rename from packages/web/src/validation/config/lora.test.ts rename to apps/web/src/validation/config/lora.test.ts diff --git a/packages/web/src/validation/config/lora.ts b/apps/web/src/validation/config/lora.ts similarity index 88% rename from packages/web/src/validation/config/lora.ts rename to apps/web/src/validation/config/lora.ts index 2d330b0c..0dbaaef1 100644 --- a/packages/web/src/validation/config/lora.ts +++ b/apps/web/src/validation/config/lora.ts @@ -3,6 +3,7 @@ import { z } from "zod/v4"; const ModemPresetEnum = z.enum(Protobuf.Config.Config_LoRaConfig_ModemPreset); const RegionCodeEnum = z.enum(Protobuf.Config.Config_LoRaConfig_RegionCode); +const FemLnaModeEnum = z.enum(Protobuf.Config.Config_LoRaConfig_FEM_LNA_Mode); export const LoRaValidationSchema = z.object({ usePreset: z.boolean(), @@ -24,6 +25,8 @@ export const LoRaValidationSchema = z.object({ ignoreIncoming: z.coerce.number().array(), ignoreMqtt: z.boolean(), configOkToMqtt: z.boolean(), + femLnaMode: FemLnaModeEnum, + serialHalOnly: z.boolean(), }); export type LoRaValidation = z.infer; diff --git a/packages/web/src/validation/config/network.ts b/apps/web/src/validation/config/network.ts similarity index 100% rename from packages/web/src/validation/config/network.ts rename to apps/web/src/validation/config/network.ts diff --git a/packages/web/src/validation/config/position.ts b/apps/web/src/validation/config/position.ts similarity index 100% rename from packages/web/src/validation/config/position.ts rename to apps/web/src/validation/config/position.ts diff --git a/packages/web/src/validation/config/power.ts b/apps/web/src/validation/config/power.ts similarity index 100% rename from packages/web/src/validation/config/power.ts rename to apps/web/src/validation/config/power.ts diff --git a/packages/web/src/validation/config/security.test.ts b/apps/web/src/validation/config/security.test.ts similarity index 100% rename from packages/web/src/validation/config/security.test.ts rename to apps/web/src/validation/config/security.test.ts diff --git a/packages/web/src/validation/config/security.ts b/apps/web/src/validation/config/security.ts similarity index 100% rename from packages/web/src/validation/config/security.ts rename to apps/web/src/validation/config/security.ts diff --git a/packages/web/src/validation/config/user.ts b/apps/web/src/validation/config/user.ts similarity index 100% rename from packages/web/src/validation/config/user.ts rename to apps/web/src/validation/config/user.ts diff --git a/packages/web/src/validation/moduleConfig/ambientLighting.ts b/apps/web/src/validation/moduleConfig/ambientLighting.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/ambientLighting.ts rename to apps/web/src/validation/moduleConfig/ambientLighting.ts diff --git a/packages/web/src/validation/moduleConfig/audio.ts b/apps/web/src/validation/moduleConfig/audio.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/audio.ts rename to apps/web/src/validation/moduleConfig/audio.ts diff --git a/packages/web/src/validation/moduleConfig/cannedMessage.ts b/apps/web/src/validation/moduleConfig/cannedMessage.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/cannedMessage.ts rename to apps/web/src/validation/moduleConfig/cannedMessage.ts diff --git a/packages/web/src/validation/moduleConfig/detectionSensor.ts b/apps/web/src/validation/moduleConfig/detectionSensor.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/detectionSensor.ts rename to apps/web/src/validation/moduleConfig/detectionSensor.ts diff --git a/packages/web/src/validation/moduleConfig/externalNotification.ts b/apps/web/src/validation/moduleConfig/externalNotification.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/externalNotification.ts rename to apps/web/src/validation/moduleConfig/externalNotification.ts diff --git a/packages/web/src/validation/moduleConfig/mqtt.ts b/apps/web/src/validation/moduleConfig/mqtt.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/mqtt.ts rename to apps/web/src/validation/moduleConfig/mqtt.ts diff --git a/packages/web/src/validation/moduleConfig/neighborInfo.ts b/apps/web/src/validation/moduleConfig/neighborInfo.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/neighborInfo.ts rename to apps/web/src/validation/moduleConfig/neighborInfo.ts diff --git a/packages/web/src/validation/moduleConfig/paxcounter.ts b/apps/web/src/validation/moduleConfig/paxcounter.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/paxcounter.ts rename to apps/web/src/validation/moduleConfig/paxcounter.ts diff --git a/packages/web/src/validation/moduleConfig/rangeTest.ts b/apps/web/src/validation/moduleConfig/rangeTest.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/rangeTest.ts rename to apps/web/src/validation/moduleConfig/rangeTest.ts diff --git a/apps/web/src/validation/moduleConfig/remoteHardware.ts b/apps/web/src/validation/moduleConfig/remoteHardware.ts new file mode 100644 index 00000000..878cef39 --- /dev/null +++ b/apps/web/src/validation/moduleConfig/remoteHardware.ts @@ -0,0 +1,11 @@ +import { z } from "zod/v4"; + +export const RemoteHardwareValidationSchema = z.object({ + enabled: z.boolean(), + allowUndefinedPinAccess: z.boolean(), + // Preserved untouched: the form does not yet edit the available-pins list, + // so round-trip it to avoid clearing pins configured elsewhere. + availablePins: z.array(z.any()), +}); + +export type RemoteHardwareValidation = z.infer; diff --git a/packages/web/src/validation/moduleConfig/serial.ts b/apps/web/src/validation/moduleConfig/serial.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/serial.ts rename to apps/web/src/validation/moduleConfig/serial.ts diff --git a/apps/web/src/validation/moduleConfig/statusMessage.ts b/apps/web/src/validation/moduleConfig/statusMessage.ts new file mode 100644 index 00000000..cd2f5cde --- /dev/null +++ b/apps/web/src/validation/moduleConfig/statusMessage.ts @@ -0,0 +1,7 @@ +import { z } from "zod/v4"; + +export const StatusMessageValidationSchema = z.object({ + nodeStatus: z.string().max(200), +}); + +export type StatusMessageValidation = z.infer; diff --git a/packages/web/src/validation/moduleConfig/storeForward.ts b/apps/web/src/validation/moduleConfig/storeForward.ts similarity index 100% rename from packages/web/src/validation/moduleConfig/storeForward.ts rename to apps/web/src/validation/moduleConfig/storeForward.ts diff --git a/apps/web/src/validation/moduleConfig/tak.ts b/apps/web/src/validation/moduleConfig/tak.ts new file mode 100644 index 00000000..5ffb055f --- /dev/null +++ b/apps/web/src/validation/moduleConfig/tak.ts @@ -0,0 +1,12 @@ +import { Protobuf } from "@meshtastic/core"; +import { z } from "zod/v4"; + +const TeamEnum = z.enum(Protobuf.ATAK.Team); +const MemberRoleEnum = z.enum(Protobuf.ATAK.MemberRole); + +export const TakValidationSchema = z.object({ + team: TeamEnum, + role: MemberRoleEnum, +}); + +export type TakValidation = z.infer; diff --git a/packages/web/src/validation/moduleConfig/telemetry.ts b/apps/web/src/validation/moduleConfig/telemetry.ts similarity index 94% rename from packages/web/src/validation/moduleConfig/telemetry.ts rename to apps/web/src/validation/moduleConfig/telemetry.ts index 9298368f..5dbee3bf 100644 --- a/packages/web/src/validation/moduleConfig/telemetry.ts +++ b/apps/web/src/validation/moduleConfig/telemetry.ts @@ -11,6 +11,7 @@ export const TelemetryValidationSchema = z.object({ powerMeasurementEnabled: z.boolean(), powerUpdateInterval: z.coerce.number().int().min(0), powerScreenEnabled: z.boolean(), + airQualityScreenEnabled: z.boolean(), }); export type TelemetryValidation = z.infer; diff --git a/apps/web/src/validation/moduleConfig/trafficManagement.ts b/apps/web/src/validation/moduleConfig/trafficManagement.ts new file mode 100644 index 00000000..6c6acfb2 --- /dev/null +++ b/apps/web/src/validation/moduleConfig/trafficManagement.ts @@ -0,0 +1,20 @@ +import { z } from "zod/v4"; + +export const TrafficManagementValidationSchema = z.object({ + enabled: z.boolean(), + positionDedupEnabled: z.boolean(), + positionPrecisionBits: z.coerce.number().int().min(0).max(32), + positionMinIntervalSecs: z.coerce.number().int().min(0), + nodeinfoDirectResponse: z.boolean(), + nodeinfoDirectResponseMaxHops: z.coerce.number().int().min(0).max(7), + rateLimitEnabled: z.boolean(), + rateLimitWindowSecs: z.coerce.number().int().min(0), + rateLimitMaxPackets: z.coerce.number().int().min(0), + dropUnknownEnabled: z.boolean(), + unknownPacketThreshold: z.coerce.number().int().min(0), + exhaustHopTelemetry: z.boolean(), + exhaustHopPosition: z.boolean(), + routerPreserveHops: z.boolean(), +}); + +export type TrafficManagementValidation = z.infer; diff --git a/packages/web/src/validation/pskSchema.test.ts b/apps/web/src/validation/pskSchema.test.ts similarity index 100% rename from packages/web/src/validation/pskSchema.test.ts rename to apps/web/src/validation/pskSchema.test.ts diff --git a/packages/web/src/validation/pskSchema.ts b/apps/web/src/validation/pskSchema.ts similarity index 100% rename from packages/web/src/validation/pskSchema.ts rename to apps/web/src/validation/pskSchema.ts diff --git a/packages/web/src/validation/validate.ts b/apps/web/src/validation/validate.ts similarity index 100% rename from packages/web/src/validation/validate.ts rename to apps/web/src/validation/validate.ts diff --git a/packages/web/tsconfig.json b/apps/web/tsconfig.json similarity index 100% rename from packages/web/tsconfig.json rename to apps/web/tsconfig.json diff --git a/packages/web/vercel.json b/apps/web/vercel.json similarity index 100% rename from packages/web/vercel.json rename to apps/web/vercel.json diff --git a/packages/web/vite-env.d.ts b/apps/web/vite-env.d.ts similarity index 100% rename from packages/web/vite-env.d.ts rename to apps/web/vite-env.d.ts diff --git a/packages/web/vite.config.ts b/apps/web/vite.config.ts similarity index 100% rename from packages/web/vite.config.ts rename to apps/web/vite.config.ts diff --git a/packages/web/vitest.config.ts b/apps/web/vitest.config.ts similarity index 100% rename from packages/web/vitest.config.ts rename to apps/web/vitest.config.ts diff --git a/package.json b/package.json index 1a7eee2d..20f50fda 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ }, "dependencies": { "@bufbuild/protobuf": "^2.12.0", - "@meshtastic/protobufs": "jsr:^2.7.20", + "@meshtastic/protobufs": "workspace:*", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" }, diff --git a/packages/core/package.json b/packages/core/package.json index da934343..08e6fdc9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -45,6 +45,7 @@ "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" }, "dependencies": { + "@meshtastic/protobufs": "workspace:*", "crc": "npm:crc@^4.3.2" } } diff --git a/packages/core/src/meshDevice.ts b/packages/core/src/meshDevice.ts index c9083e81..ad290b3d 100755 --- a/packages/core/src/meshDevice.ts +++ b/packages/core/src/meshDevice.ts @@ -312,6 +312,61 @@ export class MeshDevice { ); } + /** + * Sends a key verification admin message to the connected node, driving the + * manual public-key verification handshake (see firmware KeyVerificationModule). + * The node correlates each exchange by nonce, so a response message only needs + * to echo the nonce supplied by the matching ClientNotification; remoteNodenum + * is only meaningful for the initial INITIATE_VERIFICATION request. + */ + public async sendKeyVerification( + messageType: Protobuf.Admin.KeyVerificationAdmin_MessageType, + remoteNodenum: number, + nonce: bigint, + securityNumber?: number, + ): Promise { + this.log.debug("sendKeyVerification", "🔑 Sending key verification message"); + + const keyVerificationMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "keyVerification", + value: create(Protobuf.Admin.KeyVerificationAdminSchema, { + messageType, + remoteNodenum, + nonce, + securityNumber, + }), + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, keyVerificationMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + + /** + * Toggles the muted state of a node (by node number) on the connected device. + * Muted nodes are silenced for notification purposes. + */ + public async toggleMutedNode(nodeNum: number): Promise { + this.log.debug("toggleMutedNode", "🔇 Toggling muted node"); + + const toggleMutedMessage = create(Protobuf.Admin.AdminMessageSchema, { + payloadVariant: { + case: "toggleMutedNode", + value: nodeNum, + }, + }); + + return await this.sendPacket( + toBinary(Protobuf.Admin.AdminMessageSchema, toggleMutedMessage), + Protobuf.Portnums.PortNum.ADMIN_APP, + "self", + ); + } + /** * Sets devices ChannelSettings */ @@ -575,7 +630,9 @@ export class MeshDevice { const resetNodes = create(Protobuf.Admin.AdminMessageSchema, { payloadVariant: { case: "nodedbReset", - value: 1, + // nodedb_reset is now a bool (proto >= 2.7): setting the oneof case + // triggers the reset; `true` preserves favorites through it. + value: true, }, }); @@ -1154,7 +1211,16 @@ export class MeshDevice { } default: - throw new Error(`Unhandled case ${dataPacket.portnum}`); + // Unknown / newer portnums (e.g. firmware modules this client predates) + // are ignored rather than throwing, so a single unsupported packet can't + // break decoding of the rest of the stream. + this.log.debug( + Emitter[Emitter.HandleMeshPacket], + `📦 Ignoring unhandled ${ + Protobuf.Portnums.PortNum[dataPacket.portnum] ?? dataPacket.portnum + } packet`, + ); + break; } } } diff --git a/packages/protobufs/meshtastic/admin.proto b/packages/protobufs/meshtastic/admin.proto index 8dc1dc29..cfbea729 100644 --- a/packages/protobufs/meshtastic/admin.proto +++ b/packages/protobufs/meshtastic/admin.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package meshtastic; +/* trunk-ignore(buf-lint/COMPILE) */ import "meshtastic/channel.proto"; import "meshtastic/config.proto"; import "meshtastic/connection_status.proto"; @@ -12,7 +13,7 @@ import "meshtastic/module_config.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "AdminProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -151,6 +152,21 @@ message AdminMessage { * TODO: REPLACE */ PAXCOUNTER_CONFIG = 12; + + /* + * TODO: REPLACE + */ + STATUSMESSAGE_CONFIG = 13; + + /* + * Traffic management module config + */ + TRAFFICMANAGEMENT_CONFIG = 14; + + /* + * TAK module config + */ + TAK_CONFIG = 15; } enum BackupLocation { @@ -187,6 +203,23 @@ message AdminMessage { uint32 touch_y = 4; } + /* + * User is requesting an over the air update. + * Node will reboot into the OTA loader + */ + message OTAEvent { + /* + * Tell the node to reboot into OTA mode for firmware update via BLE or WiFi (ESP32 only for now) + */ + OTAMode reboot_ota_mode = 1; + + /* + * A 32 byte hash of the OTA firmware. + * Used to verify the integrity of the firmware before applying an update. + */ + bytes ota_hash = 2; + } + /* * TODO: REPLACE */ @@ -414,6 +447,11 @@ message AdminMessage { */ uint32 remove_ignored_node = 48; + /* + * Set specified node-num to be muted + */ + uint32 toggle_muted_node = 49; + /* * Begins an edit transaction for config, module config, owner, and channel settings changes * This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings) @@ -443,8 +481,9 @@ message AdminMessage { /* * Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot) * Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth. + * Deprecated in favor of reboot_ota_mode in 2.7.17 */ - int32 reboot_ota_seconds = 95; + int32 reboot_ota_seconds = 95 [deprecated = true]; /* * This message is only supported for the simulator Portduino build. @@ -469,11 +508,164 @@ message AdminMessage { /* * Tell the node to reset the nodedb. + * When true, favorites are preserved through reset. */ - int32 nodedb_reset = 100; + bool nodedb_reset = 100; + + /* + * Tell the node to reset into the OTA Loader + */ + OTAEvent ota_request = 102; + + /* + * Parameters and sensor configuration + */ + SensorConfig sensor_config = 103; + + /* + * Lockdown passphrase delivery / unlock / lock-now command for hardened + * firmware builds (see MESHTASTIC_LOCKDOWN). Used to provision the + * passphrase on first boot, unlock encrypted storage on subsequent + * reboots, re-verify on already-unlocked devices to authorize a new + * client connection, or immediately re-lock the device. + * + * Replaces the earlier scheme that repurposed SecurityConfig.private_key + * to carry passphrase bytes; that hack is retired. + */ + LockdownAuth lockdown_auth = 104; } } +/* + * Lockdown passphrase delivery payload. + * + * One message handles three operations distinguished by content: + * - Provision (first-time): passphrase set, lock_now=false. Firmware + * generates DEK, wraps with passphrase-derived KEK, persists. + * - Unlock: passphrase set, lock_now=false. Firmware verifies + * passphrase against stored DEK, unlocks storage, authorizes the + * connection that delivered this packet. + * - Lock now: lock_now=true, passphrase ignored. Firmware revokes + * all client auth and reboots into the locked state. + * + * Firmware decides between provision and unlock based on its own state + * (whether a DEK file already exists). Clients do not need to track + * which case applies. + */ +message LockdownAuth { + /* + * Passphrase bytes (1-32). Empty when lock_now is true. + * Capped to 32 to match the proto cap on related security fields. + */ + bytes passphrase = 1; + + /* + * Optional override of the boot-count token TTL granted on success. + * 0 = use firmware default (TOKEN_DEFAULT_BOOTS). + * On reboot the firmware decrements this; when it reaches 0 the + * device boots fully locked and requires a fresh passphrase. + */ + uint32 boots_remaining = 2; + + /* + * Optional wall-clock expiry for the unlock token, as absolute + * Unix-epoch seconds. 0 = no time limit (only the boot-count TTL + * applies). On boot, if the device RTC is set and now > this value, + * the token is treated as expired. + */ + uint32 valid_until_epoch = 3; + + /* + * If true, ignore passphrase fields, immediately revoke all + * connection-level admin authorization, and reboot the device into + * the locked state. Always honoured regardless of current lock state. + */ + bool lock_now = 4; + + /* + * Optional per-boot uptime cap on the unlocked session, in seconds. + * 0 = unlimited (token-only enforcement, suitable for unattended + * tower / infrastructure nodes). + * + * When non-zero, the firmware arms an uptime timer at unlock. On + * each expiry, while there is still boot-count budget, the firmware + * decrements the on-flash boot count in place, revokes per- + * connection admin auth (clients must re-authenticate to see + * content), re-engages the screen lock, and re-arms the timer + * without rebooting. Mesh routing keeps running across session + * boundaries; only when the boot-count budget reaches zero does + * the device hard-lock and reboot. + * + * Total exposure ceiling = ((resolved boot count) + 1) * max_session_seconds. + * The +1 accounts for the initial passphrase-unlocked session + * itself, since boots_remaining is the number of subsequent + * session rolls (each consuming one boot from the rollback ledger). + * The resolved boot count is the value the firmware writes into the + * token at unlock time: the client-supplied boots_remaining when + * non-zero, otherwise the firmware default (TOKEN_DEFAULT_BOOTS). + * Note that boots_remaining == 0 in this message means "use firmware + * default", NOT "zero boots" — a client computing the ceiling for + * display should mirror that resolution rather than multiplying the + * raw request value. + * + * The cap is persisted in the token, so it survives token-based + * auto-unlock across reboots. Explicit operator Lock Now still + * deletes the token and forces passphrase re-entry. + * + * Uses millis() (CPU uptime), not wall-clock time, so the cap is + * immune to GPS spoofing, RTC backup-battery removal, and Faraday + * cage isolation — none of those move the uptime counter. The only + * way to reset the session clock is a reboot, which costs a boot + * from the on-flash, HMAC-bound counter. + */ + uint32 max_session_seconds = 5; + + /* + * Disable lockdown mode. Requires a valid passphrase in the same + * message (the device must prove the operator owns it before + * reverting at-rest encryption). On success the firmware decrypts + * every stored config / channel / nodedb file back to plaintext, + * removes the wrapped DEK, unlock token, monotonic-counter, and + * backoff files, and reboots out of lockdown. + * + * This is the inverse of the provision/unlock path: it is how the + * client app's "lockdown mode" toggle returns a device to normal + * operation. + * + * NOT reversed by this operation: APPROTECT. Once the debug port + * lockout has been burned (on silicon where it is effective) it is + * permanent — disabling lockdown decrypts your data and removes the + * access gates, but the SWD/JTAG port stays locked for the life of + * the device (recoverable only via a full chip erase over a debug + * probe, which destroys all data). Clients should make this + * irreversibility clear at the moment lockdown is first enabled. + * + * When true the passphrase field is still required; boots_remaining, + * valid_until_epoch, max_session_seconds, and lock_now are ignored. + */ + bool disable = 6; +} + +/* + * Firmware update mode for OTA updates + */ +enum OTAMode { + /* + * Do not reboot into OTA mode + */ + NO_REBOOT_OTA = 0; + + /* + * Reboot into OTA mode for BLE firmware update + */ + OTA_BLE = 1; + + /* + * Reboot into OTA mode for WiFi firmware update + */ + OTA_WIFI = 2; +} + /* * Parameters for setting up Meshtastic for ameteur radio usage */ @@ -499,6 +691,12 @@ message HamParameters { * Optional short name of user */ string short_name = 4; + + /* + * Optional long name of user + * Appended to callsign + */ + string long_name = 5; } /* @@ -580,3 +778,113 @@ message KeyVerificationAdmin { */ optional uint32 security_number = 4; } + +message SensorConfig { + /* + * SCD4X CO2 Sensor configuration + */ + SCD4X_config scd4x_config = 1; + + /* + * SEN5X PM Sensor configuration + */ + SEN5X_config sen5x_config = 2; + + /* + * SCD30 CO2 Sensor configuration + */ + SCD30_config scd30_config = 3; + + /* + * SHTXX temperature and relative humidity sensor configuration + */ + SHTXX_config shtxx_config = 4; +} + +message SCD4X_config { + /* + * Set Automatic self-calibration enabled + */ + optional bool set_asc = 1; + + /* + * Recalibration target CO2 concentration in ppm (FRC or ASC) + */ + optional uint32 set_target_co2_conc = 2; + + /* + * Reference temperature in degC + */ + optional float set_temperature = 3; + + /* + * Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) + */ + optional uint32 set_altitude = 4; + + /* + * Sensor ambient pressure in Pa. 70000 - 120000 Pa (overrides altitude) + */ + optional uint32 set_ambient_pressure = 5; + + /* + * Perform a factory reset of the sensor + */ + optional bool factory_reset = 6; + + /* + * Power mode for sensor (true for low power, false for normal) + */ + optional bool set_power_mode = 7; +} + +message SEN5X_config { + /* + * Reference temperature in degC + */ + optional float set_temperature = 1; + + /* + * One-shot mode (true for low power - one-shot mode, false for normal - continuous mode) + */ + optional bool set_one_shot_mode = 2; +} + +message SCD30_config { + /* + * Set Automatic self-calibration enabled + */ + optional bool set_asc = 1; + + /* + * Recalibration target CO2 concentration in ppm (FRC or ASC) + */ + optional uint32 set_target_co2_conc = 2; + + /* + * Reference temperature in degC + */ + optional float set_temperature = 3; + + /* + * Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) + */ + optional uint32 set_altitude = 4; + + /* + * Power mode for sensor (true for low power, false for normal) + */ + optional uint32 set_measurement_interval = 5; + + /* + * Perform a factory reset of the sensor + */ + optional bool soft_reset = 6; +} + +message SHTXX_config { + /* + * Accuracy mode (0 = low, 1 = medium, 2 = high) + */ + optional uint32 set_accuracy = 1; +} diff --git a/packages/protobufs/meshtastic/apponly.proto b/packages/protobufs/meshtastic/apponly.proto index 100833f4..2612ed67 100644 --- a/packages/protobufs/meshtastic/apponly.proto +++ b/packages/protobufs/meshtastic/apponly.proto @@ -8,7 +8,7 @@ import "meshtastic/config.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "AppOnlyProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/atak.proto b/packages/protobufs/meshtastic/atak.proto index 5dc08c9a..7eaec5fe 100644 --- a/packages/protobufs/meshtastic/atak.proto +++ b/packages/protobufs/meshtastic/atak.proto @@ -1,11 +1,12 @@ syntax = "proto3"; +/* trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH) */ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "ATAKProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -54,7 +55,21 @@ message TAKPacket { */ message GeoChat { /* - * The text message + * Receipt discriminator. Set alongside cot_type_id = b-t-f-d (delivered) + * or b-t-f-r (read). ReceiptType_None is the default for a normal chat + * message (cot_type_id = b-t-f). + * + * Receivers can detect a receipt by checking receipt_type != ReceiptType_None + * without re-parsing the envelope cot_type_id. + */ + enum ReceiptType { + ReceiptType_None = 0; // normal chat message + ReceiptType_Delivered = 1; // b-t-f-d delivered receipt + ReceiptType_Read = 2; // b-t-f-r read receipt + } + + /* + * The text message. Empty for receipts. */ string message = 1; @@ -67,6 +82,57 @@ message GeoChat { * Callsign of the recipient for the message */ optional string to_callsign = 3; + + /* + * UID of the chat message this event is acknowledging. Empty for a + * normal chat message; set for delivered / read receipts. Paired with + * receipt_type so receivers can match the ack back to the original + * outbound GeoChat by its event uid. + */ + string receipt_for_uid = 4; + + /* + * Receipt kind discriminator. See ReceiptType doc. Default ReceiptType_None + * means this is a regular chat message, not a receipt. + */ + ReceiptType receipt_type = 5; + + /* + * --- TAKTALK-flavored b-t-f extensions --- + * + * Set when the ATAK TAKTALK plugin originates the chat, so the message + * carries the room/language metadata TAKTALK uses to thread its UI. + * These fields are absent / empty for non-TAKTALK CoT chat, so the wire + * cost is paid only when TAKTALK is actually involved. + * + * Wire shape in source XML (inside /): + * English - lang + * UUID - room_id + * X - voice_profile_id + * - empty marker; encoded as + * present-but-empty string + */ + + /* + * BCP-47-ish language tag or human-readable name (e.g. "en", "English") + * that the originator's TAKTALK plugin recorded for the message. + */ + optional string lang = 6; + + /* + * TAKTALK chatroom UUID (e.g. "30b2755c-c547-44ef-a0cc-cdbd8a15616f") that + * the receiver's TAKTALK plugin uses to thread the message under the + * right room. Resolved to a friendly name via TakTalkRoomData broadcasts. + */ + optional string room_id = 7; + + /* + * TAKTALK voice profile pointer. Often empty in practice (the empty + * marker `` still signals TAKTALK origination), so + * receivers should treat empty-but-present as the equivalent of the + * marker rather than a missing field. + */ + optional string voice_profile_id = 8; } /* @@ -261,3 +327,1907 @@ message PLI { */ uint32 course = 5; } + +/* + * CoT how field values. + * Represents how the coordinates were generated. + */ +enum CotHow { + /* + * Unspecified + */ + CotHow_Unspecified = 0; + /* + * Human entered + */ + CotHow_h_e = 1; + /* + * Machine generated + */ + CotHow_m_g = 2; + /* + * Human GPS/INS derived + */ + CotHow_h_g_i_g_o = 3; + /* + * Machine relayed (imported from another system/gateway) + */ + CotHow_m_r = 4; + /* + * Machine fused (corroborated from multiple sources) + */ + CotHow_m_f = 5; + /* + * Machine predicted + */ + CotHow_m_p = 6; + /* + * Machine simulated + */ + CotHow_m_s = 7; +} + +/* + * Well-known CoT event types. + * When the type is known, use the enum value for efficient encoding. + * For unknown types, set cot_type_id to CotType_Other and populate cot_type_str. + */ +enum CotType { + /* + * Unknown or unmapped type, use cot_type_str + */ + CotType_Other = 0; + /* + * a-f-G-U-C: Friendly ground unit combat + */ + CotType_a_f_G_U_C = 1; + /* + * a-f-G-U-C-I: Friendly ground unit combat infantry + */ + CotType_a_f_G_U_C_I = 2; + /* + * a-n-A-C-F: Neutral aircraft civilian fixed-wing + */ + CotType_a_n_A_C_F = 3; + /* + * a-n-A-C-H: Neutral aircraft civilian helicopter + */ + CotType_a_n_A_C_H = 4; + /* + * a-n-A-C: Neutral aircraft civilian + */ + CotType_a_n_A_C = 5; + /* + * a-f-A-M-H: Friendly aircraft military helicopter + */ + CotType_a_f_A_M_H = 6; + /* + * a-f-A-M: Friendly aircraft military + */ + CotType_a_f_A_M = 7; + /* + * a-f-A-M-F-F: Friendly aircraft military fixed-wing fighter + */ + CotType_a_f_A_M_F_F = 8; + /* + * a-f-A-M-H-A: Friendly aircraft military helicopter attack + */ + CotType_a_f_A_M_H_A = 9; + /* + * a-f-A-M-H-U-M: Friendly aircraft military helicopter utility medium + */ + CotType_a_f_A_M_H_U_M = 10; + /* + * a-h-A-M-F-F: Hostile aircraft military fixed-wing fighter + */ + CotType_a_h_A_M_F_F = 11; + /* + * a-h-A-M-H-A: Hostile aircraft military helicopter attack + */ + CotType_a_h_A_M_H_A = 12; + /* + * a-u-A-C: Unknown aircraft civilian + */ + CotType_a_u_A_C = 13; + /* + * t-x-d-d: Tasking delete/disconnect + */ + CotType_t_x_d_d = 14; + /* + * a-f-G-E-S-E: Friendly ground equipment sensor + */ + CotType_a_f_G_E_S_E = 15; + /* + * a-f-G-E-V-C: Friendly ground equipment vehicle + */ + CotType_a_f_G_E_V_C = 16; + /* + * a-f-S: Friendly sea + */ + CotType_a_f_S = 17; + /* + * a-f-A-M-F: Friendly aircraft military fixed-wing + */ + CotType_a_f_A_M_F = 18; + /* + * a-f-A-M-F-C-H: Friendly aircraft military fixed-wing cargo heavy + */ + CotType_a_f_A_M_F_C_H = 19; + /* + * a-f-A-M-F-U-L: Friendly aircraft military fixed-wing utility light + */ + CotType_a_f_A_M_F_U_L = 20; + /* + * a-f-A-M-F-L: Friendly aircraft military fixed-wing liaison + */ + CotType_a_f_A_M_F_L = 21; + /* + * a-f-A-M-F-P: Friendly aircraft military fixed-wing patrol + */ + CotType_a_f_A_M_F_P = 22; + /* + * a-f-A-C-H: Friendly aircraft civilian helicopter + */ + CotType_a_f_A_C_H = 23; + /* + * a-n-A-M-F-Q: Neutral aircraft military fixed-wing drone + */ + CotType_a_n_A_M_F_Q = 24; + + // --- Chat / messaging --- + + /* + * b-t-f: GeoChat message + */ + CotType_b_t_f = 25; + + // --- CASEVAC / MEDEVAC --- + + /* + * b-r-f-h-c: CASEVAC/MEDEVAC report + */ + CotType_b_r_f_h_c = 26; + + // --- Alerts --- + + /* + * b-a-o-pan: Ring the bell / alert all + */ + CotType_b_a_o_pan = 27; + /* + * b-a-o-opn: Troops in contact + */ + CotType_b_a_o_opn = 28; + /* + * b-a-o-can: Cancel alert + */ + CotType_b_a_o_can = 29; + /* + * b-a-o-tbl: 911 alert + */ + CotType_b_a_o_tbl = 30; + /* + * b-a-g: Geofence breach alert + */ + CotType_b_a_g = 31; + + // --- Generic ground atoms (simplified affiliation types) --- + + /* + * a-f-G: Friendly ground (generic) + */ + CotType_a_f_G = 32; + /* + * a-f-G-U: Friendly ground unit (generic) + */ + CotType_a_f_G_U = 33; + /* + * a-h-G: Hostile ground (generic) + */ + CotType_a_h_G = 34; + /* + * a-u-G: Unknown ground (generic) + */ + CotType_a_u_G = 35; + /* + * a-n-G: Neutral ground (generic) + */ + CotType_a_n_G = 36; + + // --- Routes and waypoints --- + + /* + * b-m-r: Route + */ + CotType_b_m_r = 37; + /* + * b-m-p-w: Route waypoint + */ + CotType_b_m_p_w = 38; + /* + * b-m-p-s-p-i: Self-position marker + */ + CotType_b_m_p_s_p_i = 39; + + // --- Drawing / tactical graphics --- + + /* + * u-d-f: Freeform shape (line/polygon) + */ + CotType_u_d_f = 40; + /* + * u-d-r: Rectangle + */ + CotType_u_d_r = 41; + /* + * u-d-c-c: Circle + */ + CotType_u_d_c_c = 42; + /* + * u-rb-a: Range/bearing line + */ + CotType_u_rb_a = 43; + + // --- Additional hostile/unknown aircraft --- + + /* + * a-h-A: Hostile aircraft (generic) + */ + CotType_a_h_A = 44; + /* + * a-u-A: Unknown aircraft (generic) + */ + CotType_a_u_A = 45; + /* + * a-f-A-M-H-Q: Friendly aircraft military helicopter observation + */ + CotType_a_f_A_M_H_Q = 46; + + // Friendly aircraft civilian + + /* + * a-f-A-C-F: Friendly aircraft civilian fixed-wing + */ + CotType_a_f_A_C_F = 47; + /* + * a-f-A-C: Friendly aircraft civilian (generic) + */ + CotType_a_f_A_C = 48; + /* + * a-f-A-C-L: Friendly aircraft civilian lighter-than-air + */ + CotType_a_f_A_C_L = 49; + /* + * a-f-A: Friendly aircraft (generic) + */ + CotType_a_f_A = 50; + + // Friendly aircraft military helicopter variants + + /* + * a-f-A-M-H-C: Friendly aircraft military helicopter cargo + */ + CotType_a_f_A_M_H_C = 51; + + // Neutral aircraft military + + /* + * a-n-A-M-F-F: Neutral aircraft military fixed-wing fighter + */ + CotType_a_n_A_M_F_F = 52; + + // Unknown aircraft civilian + + /* + * a-u-A-C-F: Unknown aircraft civilian fixed-wing + */ + CotType_a_u_A_C_F = 53; + + // Friendly ground unit subtypes + + /* + * a-f-G-U-C-F-T-A: Friendly ground unit combat forces theater aviation + */ + CotType_a_f_G_U_C_F_T_A = 54; + /* + * a-f-G-U-C-V-S: Friendly ground unit combat vehicle support + */ + CotType_a_f_G_U_C_V_S = 55; + /* + * a-f-G-U-C-R-X: Friendly ground unit combat reconnaissance exploitation + */ + CotType_a_f_G_U_C_R_X = 56; + /* + * a-f-G-U-C-I-Z: Friendly ground unit combat infantry mechanized + */ + CotType_a_f_G_U_C_I_Z = 57; + /* + * a-f-G-U-C-E-C-W: Friendly ground unit combat engineer construction wheeled + */ + CotType_a_f_G_U_C_E_C_W = 58; + /* + * a-f-G-U-C-I-L: Friendly ground unit combat infantry light + */ + CotType_a_f_G_U_C_I_L = 59; + /* + * a-f-G-U-C-R-O: Friendly ground unit combat reconnaissance other + */ + CotType_a_f_G_U_C_R_O = 60; + /* + * a-f-G-U-C-R-V: Friendly ground unit combat reconnaissance cavalry + */ + CotType_a_f_G_U_C_R_V = 61; + /* + * a-f-G-U-H: Friendly ground unit headquarters + */ + CotType_a_f_G_U_H = 62; + /* + * a-f-G-U-U-M-S-E: Friendly ground unit support medical surgical evacuation + */ + CotType_a_f_G_U_U_M_S_E = 63; + /* + * a-f-G-U-S-M-C: Friendly ground unit support maintenance collection + */ + CotType_a_f_G_U_S_M_C = 64; + + // Friendly ground equipment + + /* + * a-f-G-E-S: Friendly ground equipment sensor (generic) + */ + CotType_a_f_G_E_S = 65; + /* + * a-f-G-E: Friendly ground equipment (generic) + */ + CotType_a_f_G_E = 66; + /* + * a-f-G-E-V-C-U: Friendly ground equipment vehicle utility + */ + CotType_a_f_G_E_V_C_U = 67; + /* + * a-f-G-E-V-C-ps: Friendly ground equipment vehicle public safety + */ + CotType_a_f_G_E_V_C_ps = 68; + + // Unknown ground + + /* + * a-u-G-E-V: Unknown ground equipment vehicle + */ + CotType_a_u_G_E_V = 69; + + // Sea + + /* + * a-f-S-N-N-R: Friendly sea surface non-naval rescue + */ + CotType_a_f_S_N_N_R = 70; + + // Friendly force (non-domain-specific) + + /* + * a-f-F-B: Friendly force boundary + */ + CotType_a_f_F_B = 71; + + // Bits / data messages + + /* + * b-m-p-s-p-loc: Self-position location marker + */ + CotType_b_m_p_s_p_loc = 72; + /* + * b-i-v: Imagery/video + */ + CotType_b_i_v = 73; + /* + * b-f-t-r: File transfer request + */ + CotType_b_f_t_r = 74; + /* + * b-f-t-a: File transfer acknowledgment + */ + CotType_b_f_t_a = 75; + + // --- Additional drawing / tactical graphics --- + + /* + * u-d-f-m: Freehand telestration / annotation. Anchor at event point, + * geometry carried via DrawnShape.vertices. May be truncated to + * MAX_VERTICES by the sender. + */ + CotType_u_d_f_m = 76; + /* + * u-d-p: Closed polygon. Geometry carried via DrawnShape.vertices, + * implicitly closed (receiver duplicates first vertex as needed). + */ + CotType_u_d_p = 77; + + // --- Additional markers --- + + /* + * b-m-p-s-m: Spot map marker (colored dot at a point of interest). + */ + CotType_b_m_p_s_m = 78; + /* + * b-m-p-c: Checkpoint (intermediate route control point). + */ + CotType_b_m_p_c = 79; + + // --- Ranging tools --- + + /* + * u-r-b-c-c: Ranging circle (range rings centered on the event point). + */ + CotType_u_r_b_c_c = 80; + /* + * u-r-b-bullseye: Bullseye with configurable range rings and bearing + * reference (magnetic / true / grid). + */ + CotType_u_r_b_bullseye = 81; + + // ====================================================================== + // Expanded coverage from the ATAK-CIV quick-drop pallet (values 82-124). + // ====================================================================== + // + // All of these types existed as cot_type_str strings; promoting them to + // enum values turns a ~10-byte string into a 1-byte varint on the wire + // for every event that uses them. Grouped below by pallet section. + + // --- PLI self-reporting (1) ------------------------------------------ + /* + * a-f-G-E-V-A: Friendly armored vehicle, user-selectable self PLI. + */ + CotType_a_f_G_E_V_A = 82; + + // --- 2525 quick-drop: basic affiliation gaps ------------------------- + /* + * a-n-A: Neutral aircraft (friendly/hostile/unknown already present). + */ + CotType_a_n_A = 83; + + // --- 2525 quick-drop: artillery (4) ---------------------------------- + CotType_a_u_G_U_C_F = 84; + CotType_a_n_G_U_C_F = 85; + CotType_a_h_G_U_C_F = 86; + CotType_a_f_G_U_C_F = 87; + + // --- 2525 quick-drop: building (4) ----------------------------------- + CotType_a_u_G_I = 88; + CotType_a_n_G_I = 89; + CotType_a_h_G_I = 90; + CotType_a_f_G_I = 91; + + // --- 2525 quick-drop: mine (4) --------------------------------------- + CotType_a_u_G_E_X_M = 92; + CotType_a_n_G_E_X_M = 93; + CotType_a_h_G_E_X_M = 94; + CotType_a_f_G_E_X_M = 95; + + // --- 2525 quick-drop: ship (3; a-f-S already at 17) ------------------ + CotType_a_u_S = 96; + CotType_a_n_S = 97; + CotType_a_h_S = 98; + + // --- 2525 quick-drop: sniper (4) ------------------------------------- + CotType_a_u_G_U_C_I_d = 99; + CotType_a_n_G_U_C_I_d = 100; + CotType_a_h_G_U_C_I_d = 101; + CotType_a_f_G_U_C_I_d = 102; + + // --- 2525 quick-drop: tank (4) --------------------------------------- + CotType_a_u_G_E_V_A_T = 103; + CotType_a_n_G_E_V_A_T = 104; + CotType_a_h_G_E_V_A_T = 105; + CotType_a_f_G_E_V_A_T = 106; + + // --- 2525 quick-drop: troops (3; a-f-G-U-C-I already at 2) ----------- + CotType_a_u_G_U_C_I = 107; + CotType_a_n_G_U_C_I = 108; + CotType_a_h_G_U_C_I = 109; + + // --- 2525 quick-drop: generic vehicle (3; a-u-G-E-V already at 69) --- + CotType_a_n_G_E_V = 110; + CotType_a_h_G_E_V = 111; + CotType_a_f_G_E_V = 112; + + // --- Mission-specific points (4) ------------------------------------- + /* + * b-m-p-w-GOTO: Go To / bloodhound navigation target. + */ + CotType_b_m_p_w_GOTO = 113; + /* + * b-m-p-c-ip: Initial point (mission planning). + */ + CotType_b_m_p_c_ip = 114; + /* + * b-m-p-c-cp: Contact point (mission planning). + */ + CotType_b_m_p_c_cp = 115; + /* + * b-m-p-s-p-op: Observation post. + */ + CotType_b_m_p_s_p_op = 116; + + // --- Vehicle drawings (2) -------------------------------------------- + /* + * u-d-v: 2D vehicle outline drawn on the map. + */ + CotType_u_d_v = 117; + /* + * u-d-v-m: 3D vehicle model reference. + */ + CotType_u_d_v_m = 118; + + // --- Drawing shapes (1) ---------------------------------------------- + /* + * u-d-c-e: Non-circular ellipse (circle with distinct major/minor axes). + */ + CotType_u_d_c_e = 119; + + // --- Image / media marker (1) ---------------------------------------- + /* + * b-i-x-i: Quick Pic geotagged image marker. The image itself does not + * ride on LoRa; this event references the image via iconset metadata. + */ + CotType_b_i_x_i = 120; + + // --- GeoChat receipts (2) -------------------------------------------- + /* + * b-t-f-d: GeoChat delivered receipt. Carried on the existing `chat` + * payload_variant via GeoChat.receipt_for_uid + receipt_type. + */ + CotType_b_t_f_d = 121; + /* + * b-t-f-r: GeoChat read receipt. Same wire slot as b-t-f-d. + */ + CotType_b_t_f_r = 122; + + // --- Custom emergency (1) -------------------------------------------- + /* + * b-a-o-c: Custom / generic emergency beacon. + */ + CotType_b_a_o_c = 123; + + // --- Tasking (1) ----------------------------------------------------- + /* + * t-s: Task / engage request. Structured payload carried via the new + * TaskRequest typed variant. + */ + CotType_t_s = 124; + + // -- TAKTALK plugin shapes -- + // CoT types unique to the TAKTALK ATAK plugin. Note `y-` has a literal + // trailing dash and no second atom — that's the wire format ATAK emits + // for TAKTALK room broadcasts. The CotType enum encodes the literal + // string verbatim (CotType_y -> "y-") so receivers reconstruct the + // original event type byte-for-byte without consulting cot_type_str. + + /* + * m-t-t: TAKTALK voice/text chat message. Payload carried via the + * TakTalkMessage typed variant (text, chatroom_id, lang, from_voice). + */ + CotType_m_t_t = 125; + + /* + * y-: TAKTALK room/membership broadcast. Payload carried via the + * TakTalkRoomData typed variant (sender_callsign, room_id, room_name, + * participants). The CoT type literally has a trailing dash and no + * second atom — not a typo. + */ + CotType_y = 126; +} + +/* + * Geopoint and altitude source + */ +enum GeoPointSource { + /* + * Unspecified + */ + GeoPointSource_Unspecified = 0; + /* + * GPS derived + */ + GeoPointSource_GPS = 1; + /* + * User entered + */ + GeoPointSource_USER = 2; + /* + * Network/external + */ + GeoPointSource_NETWORK = 3; +} + +/* + * Aircraft track information from ADS-B or military air tracking. + * Covers the majority of observed real-world CoT traffic. + */ +message AircraftTrack { + /* + * ICAO hex identifier (e.g. "AD237C") + */ + string icao = 1; + /* + * Aircraft registration (e.g. "N946AK") + */ + string registration = 2; + /* + * Flight number/callsign (e.g. "ASA864") + */ + string flight = 3; + /* + * ICAO aircraft type designator (e.g. "B39M") + */ + string aircraft_type = 4; + /* + * Transponder squawk code (0-7777 octal) + */ + uint32 squawk = 5; + /* + * ADS-B emitter category (e.g. "A3") + */ + string category = 6; + /* + * Received signal strength * 10 (e.g. -194 for -19.4 dBm) + */ + sint32 rssi_x10 = 7; + /* + * Whether receiver has GPS fix + */ + bool gps = 8; + /* + * CoT host ID for source attribution + */ + string cot_host_id = 9; +} + +/* + * Compact geographic vertex used by repeated vertex lists in TAK geometry + * payloads. Named with a `Cot` prefix to avoid a namespace collision with + * `meshtastic.GeoPoint` in `device_ui.proto`, which is an unrelated zoom/ + * latitude/longitude type used by the on-device map UI. + * + * Encoded as a signed DELTA from TAKPacketV2.latitude_i / longitude_i (the + * enclosing event's anchor point). The absolute coordinate is recovered by + * the receiver as `event.latitude_i + vertex.lat_delta_i` (and likewise for + * longitude). + * + * Why deltas: a 32-vertex telestration with vertices clustered within a few + * hundred meters of the anchor has per-vertex deltas in the ±10^4 range. + * Under sint32+zigzag those encode as 2 bytes each (tag+varint), versus the + * 4 bytes that sfixed32 would always require. At 32 vertices that is ~128 + * bytes of savings — the difference between fitting under the LoRa MTU or + * not. Absolute coordinates (values ~10^9) would cost sint32 varint 5 bytes + * per field, which is why TAKPacketV2's top-level latitude_i / longitude_i + * stay sfixed32 — only small values win with sint32. + */ +message CotGeoPoint { + /* + * Latitude delta from TAKPacketV2.latitude_i, in 1e-7 degree units. + * Add to the enclosing event's latitude_i to recover the absolute latitude. + */ + sint32 lat_delta_i = 1; + /* + * Longitude delta from TAKPacketV2.longitude_i, in 1e-7 degree units. + */ + sint32 lon_delta_i = 2; +} + +/* + * User-drawn tactical graphic: circle, rectangle, polygon, polyline, freehand + * telestration, ranging circle, or bullseye. + * + * Covers CoT types u-d-c-c, u-d-r, u-d-f, u-d-f-m, u-d-p, u-r-b-c-c, + * u-r-b-bullseye. The shape's anchor position is carried on + * TAKPacketV2.latitude_i/longitude_i; polyline/polygon vertices are in the + * `vertices` repeated field as `CotGeoPoint` deltas from that anchor. + * + * Colors use the Team enum as a 14-color palette (see color encoding below) + * with a fixed32 exact-ARGB fallback for custom user-picked colors that + * don't map to a palette entry. + */ +message DrawnShape { + /* + * Shape kind discriminator. Drives receiver rendering and also controls + * which optional fields below are meaningful. + */ + enum Kind { + /* + * Unspecified (do not use on the wire) + */ + Kind_Unspecified = 0; + /* + * u-d-c-c: User-drawn circle (uses major/minor/angle, anchor = event point) + */ + Kind_Circle = 1; + /* + * u-d-r: User-drawn rectangle (uses vertices = 4 corners) + */ + Kind_Rectangle = 2; + /* + * u-d-f: User-drawn polyline (uses vertices, not closed) + */ + Kind_Freeform = 3; + /* + * u-d-f-m: Freehand telestration / annotation (uses vertices, may be truncated) + */ + Kind_Telestration = 4; + /* + * u-d-p: Closed polygon (uses vertices, implicitly closed) + */ + Kind_Polygon = 5; + /* + * u-r-b-c-c: Ranging circle (major/minor/angle, stroke + optional fill) + */ + Kind_RangingCircle = 6; + /* + * u-r-b-bullseye: Bullseye ring with range rings and bearing reference + */ + Kind_Bullseye = 7; + /* + * u-d-c-e: Ellipse with distinct major/minor axes (same storage as + * Kind_Circle — uses major_cm/minor_cm/angle_deg — but receivers + * render it as a non-circular ellipse rather than a round circle). + */ + Kind_Ellipse = 8; + /* + * u-d-v: 2D vehicle outline drawn on the map. Vertices carry the + * outline polygon; receivers draw it as a filled polygon. + */ + Kind_Vehicle2D = 9; + /* + * u-d-v-m: 3D vehicle model reference. Same vertex polygon as + * Kind_Vehicle2D; receivers that support 3D rendering extrude it. + */ + Kind_Vehicle3D = 10; + } + /* + * Explicit stroke/fill/both discriminator. + * + * ATAK's source XML distinguishes "stroke-only polyline" from "closed shape + * with both stroke and fill" by the presence of the element. + * Both states can hash to all-zero color fields, so we carry the signal + * explicitly. Parser sets this from (sawStrokeColor, sawFillColor) at the + * end of parse; builder uses it to decide which of / + * to emit in the reconstructed XML. + */ + enum StyleMode { + /* + * Unspecified — receiver infers from which color fields are non-zero. + */ + StyleMode_Unspecified = 0; + /* + * Stroke only. No in the source XML. Used for polylines, + * ranging lines, bullseye rings. + */ + StyleMode_StrokeOnly = 1; + /* + * Fill only. No in the source XML. Rare but valid in + * ATAK (solid region with no outline). + */ + StyleMode_FillOnly = 2; + /* + * Both stroke and fill present. Closed shapes: circle, rectangle, + * polygon, ranging circle. + */ + StyleMode_StrokeAndFill = 3; + } + /* + * Shape kind (circle, rectangle, freeform, etc.) + */ + Kind kind = 1; + /* + * Explicit stroke/fill/both discriminator. See StyleMode doc. + */ + StyleMode style = 2; + /* + * Ellipse major radius in centimeters. 0 for non-ellipse kinds. + */ + uint32 major_cm = 3; + /* + * Ellipse minor radius in centimeters. 0 for non-ellipse kinds. + */ + uint32 minor_cm = 4; + /* + * Ellipse rotation angle in degrees. Valid values are 0..360 inclusive; + * 0 and 360 are equivalent rotations. In proto3, an unset uint32 reads + * as 0, so senders should emit 0 when the angle is unspecified. + */ + uint32 angle_deg = 5; + /* + * Stroke color as a named palette entry from the Team enum. If + * Unspecifed_Color, the exact ARGB is carried in stroke_argb. + * Valid only when style is StrokeOnly or StrokeAndFill. + */ + Team stroke_color = 6; + /* + * Stroke color as an exact 32-bit ARGB bit pattern. Always populated + * on the wire; readers MUST use this value when stroke_color == + * Unspecifed_Color and MAY use it to recover the exact original bytes + * even when a palette entry is set. + */ + fixed32 stroke_argb = 7; + /* + * Stroke weight in tenths of a unit (e.g. 30 = 3.0). Typical ATAK + * range 10..60. + */ + uint32 stroke_weight_x10 = 8; + /* + * Fill color as a named palette entry. See stroke_color docs. + * Valid only when style is FillOnly or StrokeAndFill. + */ + Team fill_color = 9; + /* + * Fill color exact ARGB fallback. See stroke_argb docs. + */ + fixed32 fill_argb = 10; + /* + * Whether labels are rendered on this shape. + */ + bool labels_on = 11; + /* + * Vertex list for polyline/polygon/rectangle/telestration shapes, stored as + * two PACKED parallel columns of signed deltas from the event anchor + * (TAKPacketV2.latitude_i/longitude_i), in 1e-7 degree units. vertex N is + * (lat_deltas[N], lon_deltas[N]); the two columns MUST stay the same length. + * + * Replaces the former `repeated CotGeoPoint vertices = 12` (one length- + * delimited sub-message per vertex = ~2 B framing each). Packing into two + * `repeated sint32` columns pays the field framing ONCE per column instead + * of once per vertex — ~58 B saved on a 32-vertex telestration — while + * keeping the same zigzag small-delta win CotGeoPoint had. Capped at 32 by + * the nanopb pool; senders MUST truncate longer inputs and set `truncated`. + * + * Tag 12 (the old repeated-message field) is reserved to prevent reuse. + */ + reserved 12; + repeated sint32 vertex_lat_deltas = 18; + repeated sint32 vertex_lon_deltas = 19; + /* + * True if the sender truncated the vertex columns to fit the pool. + */ + bool truncated = 13; + // --- Bullseye-only fields. All ignored unless kind == Kind_Bullseye. --- + /* + * Bullseye distance in meters * 10 (e.g. 3285 = 328.5 m). 0 = unset. + */ + uint32 bullseye_distance_dm = 14; + /* + * Bullseye bearing reference: 0 unset, 1 Magnetic, 2 True, 3 Grid. + */ + uint32 bullseye_bearing_ref = 15; + /* + * Bullseye attribute bit flags: + * bit 0: rangeRingVisible + * bit 1: hasRangeRings + * bit 2: edgeToCenter + * bit 3: mils + */ + uint32 bullseye_flags = 16; + /* + * Bullseye reference UID (anchor marker). Empty = anchor is self. + */ + string bullseye_uid_ref = 17; +} + +/* + * Fixed point of interest: spot marker, waypoint, checkpoint, 2525 symbol, + * or custom icon. + * + * Covers CoT types b-m-p-s-m, b-m-p-w, b-m-p-c, b-m-p-s-p-i, b-m-p-s-p-loc, + * plus a-u-G / a-f-G / a-h-G / a-n-G with iconset paths. The marker position + * is carried on TAKPacketV2.latitude_i/longitude_i; fields below carry only + * the marker-specific metadata. + */ +message Marker { + /* + * Marker kind. Used to pick sensible receiver defaults when the CoT type + * alone is ambiguous (e.g. a-u-G could be a 2525 symbol or a custom icon + * depending on the iconset path). + */ + enum Kind { + /* + * Unspecified — fall back to TAKPacketV2.cot_type_id + */ + Kind_Unspecified = 0; + /* + * b-m-p-s-m: Spot map marker + */ + Kind_Spot = 1; + /* + * b-m-p-w: Route waypoint + */ + Kind_Waypoint = 2; + /* + * b-m-p-c: Checkpoint + */ + Kind_Checkpoint = 3; + /* + * b-m-p-s-p-i / b-m-p-s-p-loc: Self-position marker + */ + Kind_SelfPosition = 4; + /* + * 2525B/C military symbol (iconsetpath = COT_MAPPING_2525B/...) + */ + Kind_Symbol2525 = 5; + /* + * COT_MAPPING_SPOTMAP icon (e.g. colored dot) + */ + Kind_SpotMap = 6; + /* + * Custom icon set (UUID/GroupName/filename.png) + */ + Kind_CustomIcon = 7; + /* + * b-m-p-w-GOTO: Go To / bloodhound navigation waypoint. + */ + Kind_GoToPoint = 8; + /* + * b-m-p-c-ip: Initial point (mission planning control point). + */ + Kind_InitialPoint = 9; + /* + * b-m-p-c-cp: Contact point (mission planning control point). + */ + Kind_ContactPoint = 10; + /* + * b-m-p-s-p-op: Observation post. + */ + Kind_ObservationPost = 11; + /* + * b-i-x-i: Quick Pic geotagged image marker. iconset carries the + * image reference (local filename or remote URL); the image itself + * does not ride on the LoRa wire. + */ + Kind_ImageMarker = 12; + } + /* + * Marker kind + */ + Kind kind = 1; + /* + * Marker color as a named palette entry. If Unspecifed_Color, the exact + * ARGB is in color_argb. + */ + Team color = 2; + /* + * Marker color exact ARGB bit pattern. Always populated on the wire. + */ + fixed32 color_argb = 3; + /* + * Status readiness flag (ATAK ). + */ + bool readiness = 4; + /* + * Parent link UID (ATAK ). Empty = no parent. + * For spot/waypoint markers this is typically the producing TAK user's UID. + */ + string parent_uid = 5; + /* + * Parent CoT type (e.g. "a-f-G-U-C"). Usually the parent TAK user's type. + */ + string parent_type = 6; + /* + * Parent callsign (e.g. "HOPE"). + */ + string parent_callsign = 7; + /* + * Iconset path stored verbatim. ATAK emits three flavors: + * Kind_Symbol2525 -> "COT_MAPPING_2525B//" + * Kind_SpotMap -> "COT_MAPPING_SPOTMAP//" + * Kind_CustomIcon -> "//.png" + * Stored end-to-end without prefix stripping; the ~19 bytes saved by + * stripping well-known prefixes are not worth the builder-side bug + * surface, and the dict compresses the repetition effectively. + */ + string iconset = 8; +} + +/* + * Range and bearing measurement line from the event anchor to a target point. + * + * Covers CoT type u-rb-a. The anchor position is on + * TAKPacketV2.latitude_i/longitude_i; the target endpoint is carried as a + * CotGeoPoint — same delta-from-anchor encoding used by DrawnShape.vertices + * so a self-anchored RAB (common case) encodes in zero bytes. + */ +message RangeAndBearing { + /* + * Target/anchor endpoint (delta-encoded from TAKPacketV2.latitude_i/longitude_i). + */ + CotGeoPoint anchor = 1; + /* + * Anchor UID (from ). Empty = free-standing. + */ + string anchor_uid = 2; + /* + * Range in centimeters (value * 100). Range 0..4294 km. + */ + uint32 range_cm = 3; + /* + * Bearing in degrees * 100 (0..36000). + */ + uint32 bearing_cdeg = 4; + /* + * Stroke color as a Team palette entry. See DrawnShape.stroke_color doc. + */ + Team stroke_color = 5; + /* + * Stroke color exact ARGB fallback. + */ + fixed32 stroke_argb = 6; + /* + * Stroke weight * 10 (e.g. 30 = 3.0). + */ + uint32 stroke_weight_x10 = 7; +} + +/* + * Named route consisting of ordered waypoints and control points. + * + * Covers CoT type b-m-r. The first waypoint's position is on + * TAKPacketV2.latitude_i/longitude_i; subsequent waypoints and checkpoints + * are in `links`. Link count is capped at 16 by the nanopb pool; senders + * MUST truncate longer routes and set `truncated = true`. + */ +message Route { + /* + * Travel method for the route. + */ + enum Method { + /* + * Unspecified / unknown + */ + Method_Unspecified = 0; + /* + * Driving / vehicle + */ + Method_Driving = 1; + /* + * Walking / foot + */ + Method_Walking = 2; + /* + * Flying + */ + Method_Flying = 3; + /* + * Swimming (individual) + */ + Method_Swimming = 4; + /* + * Watercraft (boat) + */ + Method_Watercraft = 5; + } + /* + * Route direction (infil = ingress, exfil = egress). + */ + enum Direction { + /* + * Unspecified + */ + Direction_Unspecified = 0; + /* + * Infiltration (ingress) + */ + Direction_Infil = 1; + /* + * Exfiltration (egress) + */ + Direction_Exfil = 2; + } + /* + * Route waypoint or control point. Each link corresponds to one ATAK + * entry inside the b-m-r event. + */ + message Link { + /* + * Waypoint position (delta-encoded from TAKPacketV2.latitude_i/longitude_i). + */ + CotGeoPoint point = 1; + /* + * Optional UID (empty = receiver derives). + */ + string uid = 2; + /* + * Optional display callsign (e.g. "CP1"). Empty for unnamed control points. + */ + string callsign = 3; + /* + * Link role: 0 = waypoint (b-m-p-w), 1 = checkpoint (b-m-p-c). + */ + uint32 link_type = 4; + } + /* + * Travel method + */ + Method method = 1; + /* + * Direction (infil/exfil) + */ + Direction direction = 2; + /* + * Waypoint name prefix (e.g. "CP"). + */ + string prefix = 3; + /* + * Stroke weight * 10 (e.g. 30 = 3.0). 0 = default. + */ + uint32 stroke_weight_x10 = 4; + /* + * Ordered list of route control points. Capped at 16. + */ + repeated Link links = 5; + /* + * True if the sender truncated `links` to fit the pool. + */ + bool truncated = 6; +} + +/* + * 9-line MEDEVAC request (CoT type b-r-f-h-c). + * + * Mirrors the ATAK MedLine tool's <_medevac_> detail element. Every field + * is optional (proto3 default); senders omit lines they don't have. The + * envelope (TAKPacketV2.uid, cot_type_id=b-r-f-h-c, latitude_i/longitude_i, + * altitude, callsign) carries Line 1 (location) and Line 2 (callsign). + * + * All numeric fields are tight varints so a complete 9-line request fits + * in well under 100 bytes of proto on the wire. + */ +message CasevacReport { + /* + * Line 3: precedence / urgency. + */ + enum Precedence { + Precedence_Unspecified = 0; + Precedence_Urgent = 1; // A - immediate, life-threatening + Precedence_UrgentSurgical = 2; // B - needs surgery + Precedence_Priority = 3; // C - within 4 hours + Precedence_Routine = 4; // D - within 24 hours + Precedence_Convenience = 5; // E - convenience + } + /* + * Line 7: HLZ marking method. + */ + enum HlzMarking { + HlzMarking_Unspecified = 0; + HlzMarking_Panels = 1; + HlzMarking_PyroSignal = 2; + HlzMarking_Smoke = 3; + HlzMarking_None = 4; + HlzMarking_Other = 5; + } + /* + * Line 6: security situation at the pickup zone. + */ + enum Security { + Security_Unspecified = 0; + Security_NoEnemy = 1; // N - no enemy activity + Security_PossibleEnemy = 2; // P - possible enemy + Security_EnemyInArea = 3; // E - enemy, approach with caution + Security_EnemyInArmedContact = 4; // X - armed escort required + } + + /* + * Line 3: precedence / urgency. + */ + Precedence precedence = 1; + /* + * Line 4: special equipment required, as a bitfield. + * bit 0: none + * bit 1: hoist + * bit 2: extraction equipment + * bit 3: ventilator + * bit 4: blood + */ + uint32 equipment_flags = 2; + /* + * Line 5: number of litter (stretcher-bound) patients. + */ + uint32 litter_patients = 3; + /* + * Line 5: number of ambulatory (walking-wounded) patients. + */ + uint32 ambulatory_patients = 4; + /* + * Line 6: security situation at the PZ. + */ + Security security = 5; + /* + * Line 7: HLZ marking method. + */ + HlzMarking hlz_marking = 6; + /* + * Line 7 supplementary: short free-text describing the zone marker + * (e.g. "Green smoke", "VS-17 panel west"). Capped tight in options. + */ + string zone_marker = 7; + // --- Line 8: patient nationality counts --- + uint32 us_military = 8; + uint32 us_civilian = 9; + uint32 non_us_military = 10; + uint32 non_us_civilian = 11; + uint32 epw = 12; // enemy prisoner of war + uint32 child = 13; + /* + * Line 9: terrain and obstacles at the PZ, as a bitfield. + * bit 0: slope + * bit 1: rough + * bit 2: loose + * bit 3: trees + * bit 4: wires + * bit 5: other + */ + uint32 terrain_flags = 14; + /* + * Line 2: radio frequency / callsign metadata (e.g. "38.90 Mhz" or + * "Victor 6"). Capped tight in options. + */ + string frequency = 15; + + // --- v2.x medline extensions (tags 16–33) -------------------------------- + // + // Fields 16+ cost a 2-byte tag instead of 1 byte, but they're usually + // sparse so the on-wire delta is modest when most stay unset. A fully + // populated CASEVAC with 13 free-text fields + 2 ZMIST entries can run + // 200-400 bytes compressed, i.e. potentially over the 237 B LoRa MTU. + // Callers that hit the MTU on the `compressWithRemarksFallback` path + // SHOULD strip the tier-2 situational fields (tags 28-32 + terrain_other_detail) + // before dropping the packet entirely. See README "CASEVAC tier-2 stripping". + + /* + * Short title / MEDEVAC identifier (e.g. "EAGLE.15.181230"). Usually the + * same as the envelope callsign but ATAK sometimes carries a distinct + * ops-number here. + */ + string title = 16; + /* + * Primary medline free-text — the single most clinically important line + * on a MEDLINE form (e.g. "2 urgent litter patients, smoke on approach"). + * MUST be preserved under MTU pressure as long as any casevac is sent. + */ + string medline_remarks = 17; + + /* + * Line 3 (newer ATAK format): patient counts by precedence level. + * Coexists with the enum-style `precedence` field (tag 1) — older ATAK + * emits a single enum, newer ATAK emits these counts, and both can be + * set simultaneously. Senders populate whichever style(s) the source + * XML had; receivers prefer counts when non-zero. + */ + uint32 urgent_count = 18; + uint32 urgent_surgical_count = 19; + uint32 priority_count = 20; + uint32 routine_count = 21; + uint32 convenience_count = 22; + + /* + * Line 4 supplementary: free-text description of non-standard equipment + * (e.g. "Blood warmer"). Pairs with the `equipment_flags` bitfield. + */ + string equipment_detail = 23; + /* + * Line 1 override: MGRS grid when distinct from the event anchor point + * (e.g. "34T CQ 12345 67890"). Event lat/lon/hae still carries the + * numeric location; this field preserves the exact MGRS string the + * medic entered. + */ + string zone_protected_coord = 24; + /* + * Line 9 supplementary: slope direction (e.g. "N", "NE", "SSW") when + * `terrain_flags` bit 0 (slope) is set. + */ + string terrain_slope_dir = 25; + /* + * Line 9 supplementary: free-text description of "other" terrain hazards + * (e.g. "Loose debris on west edge") when `terrain_flags` bit 5 (other) + * is set. Tier-2 strippable under MTU pressure. + */ + string terrain_other_detail = 26; + /* + * Line 7 supplementary: how the zone is being marked right now + * (e.g. "Orange smoke", "VS-17 panel"). Complements the structured + * `hlz_marking` enum with a specific human-readable description. + */ + string marked_by = 27; + + // --- Tier-2 situational awareness (stripped first under MTU pressure) --- + // These fields are free-text context that helps the receiver plan the + // approach but aren't strictly required to evacuate the patient. + + /* + * Nearby obstacles on the approach (e.g. "Power lines north of HLZ"). + */ + string obstacles = 28; + /* + * Wind direction and speed (e.g. "270 at 12 kts"). + */ + string winds_are_from = 29; + /* + * Friendly forces posture near the pickup zone + * (e.g. "Squad east of HLZ"). + */ + string friendlies = 30; + /* + * Known or suspected enemy positions near the pickup zone + * (e.g. "Possible enemy on south ridge"). + */ + string enemy = 31; + /* + * Free-text description of the HLZ itself + * (e.g. "Primary HLZ is soccer field"). + */ + string hlz_remarks = 32; + + /* + * Per-patient clinical records. Each entry is one patient's ZMIST card + * (Zap number / Mechanism / Injuries / Signs / Treatment). Repeatable — + * a mass-casualty event can carry 1-6 entries in practice, limited by + * the 237 B LoRa MTU. + */ + repeated ZMistEntry zmist = 33; +} + +/* + * Per-patient clinical summary record — one entry per patient in a CASEVAC. + * Maps directly to ATAK's child element inside . + * All fields are optional free-text; senders populate what they have. + */ +message ZMistEntry { + /* + * Patient identifier / sequence label (e.g. "ZMIST-1", "ZMIST-2"). + */ + string title = 1; + /* + * Zap number — unique patient tracking ID (often a terse code like + * "Gunshot" or a serial). + */ + string z = 2; + /* + * Mechanism of injury (e.g. "Penetrating trauma", "Blast injury"). + */ + string m = 3; + /* + * Injuries observed (e.g. "Left thigh", "Concussion"). + */ + string i = 4; + /* + * Signs / vital stats (e.g. "Stable", "Priority", "BP 110/70"). + */ + string s = 5; + /* + * Treatment given (e.g. "Tourniquet 1810Z", "O2 administered"). + */ + string t = 6; +} + +/* + * Emergency alert / 911 beacon (CoT types b-a-o-tbl, b-a-o-pan, b-a-o-opn, + * b-a-o-can, b-a-o-c, b-a-g). + * + * Small, high-priority structured record. The CoT type string is still set + * on cot_type_id so receivers that ignore payload_variant can still display + * the alert from the enum alone; the typed fields let modern receivers show + * the authoring unit and handle cancel-referencing without XML parsing. + */ +message EmergencyAlert { + enum Type { + Type_Unspecified = 0; + Type_Alert911 = 1; // b-a-o-tbl + Type_RingTheBell = 2; // b-a-o-pan + Type_InContact = 3; // b-a-o-opn + Type_GeoFenceBreached = 4; // b-a-g + Type_Custom = 5; // b-a-o-c + Type_Cancel = 6; // b-a-o-can + } + /* + * Alert discriminator. + */ + Type type = 1; + /* + * UID of the unit that raised the alert. Often the same as + * TAKPacketV2.uid but can be a parent device uid when a tracker raises + * an alert on behalf of a dismount. + */ + string authoring_uid = 2; + /* + * For Type_Cancel: the uid of the alert being cancelled. Empty for + * non-cancel alert types. + */ + string cancel_reference_uid = 3; +} + +/* + * Task / engage request (CoT type t-s). + * + * Mirrors ATAK's TaskCotReceiver / CotTaskBuilder workflow. The envelope + * carries the task's originating uid (implicit requester), position, and + * creation time; the fields below carry structured metadata the raw-detail + * fallback currently loses. + * + * Fields are deliberately lean — this variant is closer to the MTU ceiling + * than the others, so every string is capped in options. + */ +message TaskRequest { + enum Priority { + Priority_Unspecified = 0; + Priority_Low = 1; + Priority_Normal = 2; + Priority_High = 3; + Priority_Critical = 4; + } + enum Status { + Status_Unspecified = 0; + Status_Pending = 1; // assigned, not yet acknowledged + Status_Acknowledged = 2; // assignee has seen it + Status_InProgress = 3; // assignee is working it + Status_Completed = 4; // task done + Status_Cancelled = 5; // cancelled before completion + } + + /* + * Short tag for the task category (e.g. "engage", "observe", "recon", + * "rescue"). Free text on the wire so ATAK-specific task taxonomies + * don't need proto coordination; capped tight in options. + */ + string task_type = 1; + /* + * UID of the target / map item being tasked. + */ + string target_uid = 2; + /* + * UID of the assigned unit. Empty = unassigned / broadcast task. + */ + string assignee_uid = 3; + Priority priority = 4; + Status status = 5; + /* + * Optional short note (reason, constraints, grid reference). Capped + * tight in options to keep the worst-case under the LoRa MTU. + */ + string note = 6; +} + +/* + * Weather annotation from CoT detail element. + * + * Attaches to any TAKPacketV2 regardless of payload_variant — an Aircraft, + * PLI, or Marker can all carry observed conditions at the emitting station. + * ATAK-CIV ships an XSD for but no dedicated handler, so the + * element round-trips through the generic detail pipeline; this message + * promotes it to a first-class structured field. + * + * Target wire cost: ~6-8 bytes compressed with a fully populated instance. + * + * Named `TAKEnvironment` (not just `Environment`) because the bare name + * collides with `SwiftUI.Environment` — every SwiftUI view in a consuming + * iOS app uses the `@Environment` property wrapper, and importing the + * generated proto module would make `Environment` ambiguous in every one + * of those files. The `TAK` prefix matches the convention used by the + * outer `TAKPacketV2` wrapper and is unambiguous across all target + * languages (Swift, Kotlin, Python, TypeScript, C#). + */ +message TAKEnvironment { + /* + * Temperature in deci-degrees Celsius. 225 = 22.5°C. + * Range covers -50°C to +50°C (-500 to +500) which spans every realistic + * outdoor TAK deployment. sint32 because negative temps are common in + * cold-weather ops. + */ + sint32 temperature_c_x10 = 1; + /* + * Wind direction in whole degrees, 0-359. "Direction FROM" per + * meteorological convention (matches CoT / ATAK). + */ + uint32 wind_direction_deg = 2; + /* + * Wind speed in cm/s. Matches the unit of TAKPacketV2.speed for + * consistency. 1200 = 12.00 m/s = ~27 mph. + */ + uint32 wind_speed_cm_s = 3; +} + +/* + * Sensor field-of-view cone from CoT detail element. + * + * Encodes the 8 geometry attributes that ATAK-CIV's SensorDetailHandler + * reads from the wire; drops the 9 visual-styling attributes that are + * receiver-side render hints (fovAlpha, fovRed/Green/Blue, strokeColor, + * strokeWeight, displayMagneticReference, hideFov, fovLabels, rangeLines). + * The receiving ATAK client restores those from its own defaults, same as + * every other CoT carried over Meshtastic today. + * + * Attaches to any TAKPacketV2 — a PLI with a sensor on the operator's head, + * an Aircraft with a FLIR turret, a Marker dropped on a UAV. + * Target wire cost: ~7-14 bytes compressed (dominated by model string). + */ +message SensorFov { + /* + * Coarse sensor category, inferred from `model` on parse when the source + * XML doesn't label it. Receivers that render differently per sensor + * class (thermal overlay vs daylight cone) use this. + */ + enum SensorType { + SensorType_Unspecified = 0; + SensorType_Camera = 1; // daylight / general optical + SensorType_Thermal = 2; // FLIR, thermal imager + SensorType_Laser = 3; // rangefinder, LRF, designator + SensorType_Nvg = 4; // night vision goggles + SensorType_Rf = 5; // radio/radar direction-finding + SensorType_Other = 6; + } + + SensorType type = 1; + /* + * Azimuth in whole degrees, 0-359. "Pointing direction" of the cone axis, + * measured clockwise from true north. Whole degrees match ATAK-CIV's + * SensorDetailHandler default (270°) and save varint bytes over centi-deg. + */ + uint32 azimuth_deg = 2; + /* + * Maximum range of the cone in meters. + * Optional — if unset, receivers should use the ATAK-CIV default of 100m. + */ + optional uint32 range_m = 3; + /* + * Horizontal field of view in whole degrees (cone's angular width). + * ATAK-CIV default is 45°. + */ + uint32 fov_horizontal_deg = 4; + /* + * Vertical field of view in whole degrees. ATAK-CIV default is 45°. + * Optional — a value of 0 means "not set / use horizontal FOV". + */ + uint32 fov_vertical_deg = 5; + /* + * Elevation angle in whole degrees. Positive = up, negative = down. + * Range -90 to +90. sint32 for varint efficiency on small negatives. + */ + sint32 elevation_deg = 6; + /* + * Roll (camera tilt) in whole degrees, -180 to +180. + * Optional — use 0 if the sensor doesn't track roll. + */ + sint32 roll_deg = 7; + /* + * Free-form device model identifier, e.g. "FLIR-Boson-640", "SEEK". + * Optional — empty string means "unknown model" (ATAK-CIV default). + */ + string model = 8; +} + +/* + * TAKTALK chat message payload (CoT type m-t-t). + * + * TAKTALK is an ATAK plugin for voice + text team messaging. The voice + * audio stream goes over UDP/RTP and is NOT carried by the mesh — only + * the text envelope (this message) is. `from_voice` marks messages sent + * via push-to-talk speech-to-text so receivers can render a mic icon + * next to the text. + * + * Wire shape inside /: + * ... - mapped to TAKPacketV2.callsign + * English - lang + * ... - text + * 1 - chatroom_id + * - presence sets from_voice = true + */ +message TakTalkMessage { + /* + * The text body of the TAKTALK message (speech-to-text transcript when + * from_voice = true, typed message otherwise). + */ + string text = 1; + + /* + * TAKTALK chatroom identifier. May be a short id like "1" for the + * default room or a UUID like "30b2755c-c547-44ef-a0cc-cdbd8a15616f" + * for custom rooms (resolved by TakTalkRoomData broadcasts). + * Empty = broadcast room. + */ + string chatroom_id = 2; + + /* + * BCP-47-ish language tag or human-readable name (e.g. "en", "English"). + * Empty = unspecified. + */ + string lang = 3; + + /* + * True when the source CoT carried a marker, i.e. the message + * originated as push-to-talk speech-to-text. Lets receivers show a mic + * icon. Proto3 only encodes when true so empty payload cost is 0 bytes. + */ + bool from_voice = 4; +} + +/* + * TAKTALK room/membership broadcast (CoT type y-). + * + * Announces a TAKTALK chatroom's friendly name and roster so peers can + * resolve room UUIDs (used in TakTalkMessage.chatroom_id and + * GeoChat.room_id) to a display name and participant list. Not a chat + * message itself — these events are emitted by TAKTALK when rooms are + * created or memberships change. + */ +message TakTalkRoomData { + /* + * Callsign of the device broadcasting the room state (typically the + * room owner / latest writer). + * + * DEPRECATED in v0.3.2: always equals TAKPacketV2.callsign, so the wire + * byte was redundant. Builders stop emitting this field in v0.3.2; + * parsers still read it for one release so v0.3.1-encoded packets decode + * cleanly. To be removed entirely in v0.4.x. + */ + string sender_callsign = 1 [deprecated = true]; + + /* + * Room UUID, matches TakTalkMessage.chatroom_id / GeoChat.room_id on + * messages routed into this room. + */ + string room_id = 2; + + /* + * Friendly display name for the room (e.g. "test", "Alpha Team"). + */ + string room_name = 3; + + /* + * Member callsigns. Wire-encoded as repeated strings; the underlying + * CoT carries them as a single A,B,C element + * which parsers split / builders join on ','. + */ + repeated string participants = 4; +} + +/* + * ATAK directed-routing recipient list (CoT …). + * + * Present when an event is addressed to specific TAK users rather than the + * broadcast group. TAKTALK gates voice TTS on this element matching the + * receiver's callsign; directed b-t-f chats use it for the same purpose. A + * missing means "broadcast to all peers", which is the default for + * PLI, alerts, drawings, and most situational-awareness events. + * + * Carried as repeated strings (not indexes into a per-packet table) because + * the typical event has 1-2 destinations and table overhead would erase the + * savings. Receivers that need the original XML element rebuild it from + * dest_callsign on emit. + */ +message Marti { + /* + * Recipient callsigns. Order is preserved end-to-end so receivers can show + * primary-vs-cc distinction the same way ATAK does. + * + * If dest_callsign is [TAKPacketV2.callsign] (self-addressed, unusual but + * legal — e.g. ATAK echoing back to its own room), the builder still emits + * the element so loopback shapes round-trip cleanly. + */ + repeated string dest_callsign = 1; +} + +/* + * ATAK v2 packet with expanded CoT field support and zstd dictionary compression. + * Sent on ATAK_PLUGIN_V2 port. The wire payload is: + * [1 byte flags][zstd-compressed TAKPacketV2 protobuf] + * Flags byte: bits 0-5 = dictionary ID, bits 6-7 = reserved. + */ +message TAKPacketV2 { + /* + * Well-known CoT event type enum. + * Use CotType_Other with cot_type_str for unknown types. + */ + CotType cot_type_id = 1; + /* + * How the coordinates were generated + */ + CotHow how = 2; + /* + * Callsign + */ + string callsign = 3; + /* + * Team color assignment + */ + Team team = 4; + /* + * Role of the group member + */ + MemberRole role = 5; + /* + * Latitude, multiply by 1e-7 to get degrees in floating point + */ + sfixed32 latitude_i = 6; + /* + * Longitude, multiply by 1e-7 to get degrees in floating point + */ + sfixed32 longitude_i = 7; + /* + * Altitude in meters (HAE). ATAK's "no altitude" sentinel is hae=9999999.0. + * + * NOTE: an earlier v0.4.0 attempt made this `optional` to omit the 9999999 + * sentinel from the wire, but measurement showed it was net-negative: the + * zstd dictionary already compresses the literal 9999999 to ~nothing, while + * proto3 `optional` forces a genuine 0 m HAE (common on routes/drawings that + * carry hae="0.0" or omit hae → parsed as 0) to encode explicitly (+2 bytes), + * which REGRESSED the worst-case route fixture. Kept as a plain field. + */ + sint32 altitude = 8; + /* + * Speed in cm/s + */ + uint32 speed = 9; + /* + * Course in degrees * 100 (0-36000) + */ + uint32 course = 10; + /* + * Battery level 0-100 + */ + uint32 battery = 11; + /* + * Geopoint source + */ + GeoPointSource geo_src = 12; + /* + * Altitude source + */ + GeoPointSource alt_src = 13; + /* + * Device UID (UUID string or device ID like "ANDROID-xxxx") + */ + string uid = 14; + /* + * Device callsign + */ + string device_callsign = 15; + /* + * Stale time as seconds offset from event time + */ + uint32 stale_seconds = 16; + /* + * TAK client version string + */ + string tak_version = 17; + /* + * TAK device model + */ + string tak_device = 18; + /* + * TAK platform (ATAK-CIV, WebTAK, etc.) + */ + string tak_platform = 19; + /* + * TAK OS version + */ + string tak_os = 20; + /* + * Connection endpoint + */ + string endpoint = 21; + /* + * Phone number + */ + string phone = 22; + /* + * CoT event type string, only populated when cot_type_id is CotType_Other + */ + string cot_type_str = 23; + /* + * Optional remarks / free-text annotation from the element. + * Populated for non-GeoChat payload types (shapes, markers, routes, etc.) + * when the original CoT event carried non-empty remarks text. + * GeoChat messages carry their text in GeoChat.message instead. + * Empty string (proto3 default) means no remarks were present. + */ + string remarks = 24; + + // --- Sensor / environment annotations ---------------------------------- + // + // Both fields are OPTIONAL and attach to any payload_variant. They + // describe observed conditions at the emitting station — a PLI with + // environment data, an Aircraft with a sensor cone, a Marker with both. + // Absent by default; presence is signaled by the message being non-null. + + /* + * Observed weather conditions (temperature, wind). From . + * Type is `TAKEnvironment`, not `Environment`, to avoid colliding with + * SwiftUI's `@Environment` property wrapper in iOS consumers. + */ + optional TAKEnvironment environment = 25; + /* + * Sensor field-of-view cone (camera, FLIR, laser, etc.). From . + */ + optional SensorFov sensor_fov = 26; + + reserved 27, 28, 30; + // Tags 27, 28 reserved for future top-level annotations. Tag 29 is consumed + // by `marti` below. Tag 30 was the former `bool pli` oneof arm — dropped + // (PLI is now the implicit payload); reserved here at the message level + // because proto3 forbids `reserved` inside a oneof. + + /* + * Directed-routing recipient list (CoT …). + * Empty / unset = broadcast to all peers (the default for situational-awareness + * events). Populated for TAKTALK m-t-t, directed b-t-f DMs, and any other CoT + * shape that ATAK addresses to specific recipients. TAKTALK gates voice TTS + * playback on this element matching the receiver's callsign, so dropping it + * silently breaks voice messaging end-to-end. + * + * See Marti. + */ + optional Marti marti = 29; + + /* + * The payload of the packet + */ + oneof payload_variant { + // Tag 30 was `bool pli` — a PLI carries no fields beyond the common + // envelope (position is in latitude_i/longitude_i), so the boolean was + // pure overhead (~3 wire bytes on every position beacon, the highest- + // frequency packet). PLI is now the IMPLICIT payload: a packet with NO + // payload_variant set decodes as a position report. Tag 30 is reserved at + // the message level (proto3 forbids `reserved` inside a oneof). + /* + * ATAK GeoChat message + */ + GeoChat chat = 31; + /* + * Aircraft track data (ADS-B, military air) + */ + AircraftTrack aircraft = 32; + /* + * Generic CoT detail XML for unmapped types. Kept as a fallback for CoT + * types not yet promoted to a typed variant; drawings, markers, ranging + * tools, and routes have dedicated variants below and should not land here. + */ + bytes raw_detail = 33; + /* + * User-drawn tactical graphic: circle, rectangle, polygon, polyline, + * telestration, ranging circle, or bullseye. See DrawnShape. + */ + DrawnShape shape = 34; + /* + * Fixed point of interest: spot marker, waypoint, checkpoint, 2525 + * symbol, or custom icon. See Marker. + */ + Marker marker = 35; + /* + * Range and bearing measurement line. See RangeAndBearing. + */ + RangeAndBearing rab = 36; + /* + * Named route with ordered waypoints and control points. See Route. + */ + Route route = 37; + /* + * 9-line MEDEVAC request. See CasevacReport. + */ + CasevacReport casevac = 38; + /* + * Emergency beacon / 911 alert. See EmergencyAlert. + */ + EmergencyAlert emergency = 39; + /* + * Task / engage request. See TaskRequest. + */ + TaskRequest task = 40; + /* + * TAKTALK chat message (CoT type m-t-t). See TakTalkMessage. + * Voice audio itself rides UDP/RTP outside the mesh; this carries the + * text envelope plus a from_voice marker for receiver UX. + */ + TakTalkMessage taktalk = 41; + /* + * TAKTALK room/membership broadcast (CoT type y-). See TakTalkRoomData. + * Resolves room UUIDs (used in TakTalkMessage.chatroom_id and + * GeoChat.room_id) to display name + roster on receivers. + */ + TakTalkRoomData taktalk_room = 42; + } +} diff --git a/packages/protobufs/meshtastic/cannedmessages.proto b/packages/protobufs/meshtastic/cannedmessages.proto index baa51343..59f3dcc9 100644 --- a/packages/protobufs/meshtastic/cannedmessages.proto +++ b/packages/protobufs/meshtastic/cannedmessages.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "CannedMessageConfigProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/channel.proto b/packages/protobufs/meshtastic/channel.proto index 4b772421..f49895a3 100644 --- a/packages/protobufs/meshtastic/channel.proto +++ b/packages/protobufs/meshtastic/channel.proto @@ -1,11 +1,12 @@ syntax = "proto3"; +/* trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH) */ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "ChannelProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -86,11 +87,6 @@ message ChannelSettings { * Per-channel module settings. */ ModuleSettings module_settings = 7; - - /* - * Whether or not we should receive notifactions / alerts through this channel - */ - bool mute = 8; } /* @@ -103,10 +99,10 @@ message ModuleSettings { uint32 position_precision = 1; /* - * Controls whether or not the phone / clients should mute the current channel + * Controls whether or not the client / device should mute the current channel * Useful for noisy public channels you don't necessarily want to disable */ - bool is_client_muted = 2; + bool is_muted = 2; } /* diff --git a/packages/protobufs/meshtastic/clientonly.proto b/packages/protobufs/meshtastic/clientonly.proto index 2b919ef7..c80f4289 100644 --- a/packages/protobufs/meshtastic/clientonly.proto +++ b/packages/protobufs/meshtastic/clientonly.proto @@ -8,7 +8,7 @@ import "meshtastic/mesh.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "ClientOnlyProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/config.proto b/packages/protobufs/meshtastic/config.proto index f17a0785..aa5264e2 100644 --- a/packages/protobufs/meshtastic/config.proto +++ b/packages/protobufs/meshtastic/config.proto @@ -7,7 +7,7 @@ import "meshtastic/device_ui.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "ConfigProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; message Config { @@ -111,7 +111,7 @@ message Config { ROUTER_LATE = 11; /* - * Description: Treats packets from or to favorited nodes as ROUTER, and all other packets as CLIENT. + * Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. * Technical Details: Used for stronger attic/roof nodes to distribute messages more widely * from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes * where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. @@ -648,6 +648,11 @@ message Config { * Can not be auto detected but set by proto. Used for 128x128 screens */ OLED_SH1107_128_128 = 4; + + /* + * Can not be auto detected but set by proto. Used for 64x128 rotated screens + */ + OLED_SH1107_ROTATED = 5; } /* @@ -783,6 +788,11 @@ message Config { * If true, node names will show in long format */ bool use_long_node_name = 13; + + /* + * If true, the device will display message bubbles on screen. + */ + bool enable_message_bubbles = 14; } /* @@ -924,6 +934,62 @@ message Config { * Brazil 902MHz */ BR_902 = 26; + + /* + * ITU Region 1 Amateur Radio 2m band (144-146 MHz) + */ + ITU1_2M = 27; + + /* + * ITU Region 2 Amateur Radio 2m band (144-148 MHz) + */ + ITU2_2M = 28; + + /* + * EU 866MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD) + */ + EU_866 = 29; + + /* + * EU 874MHz and 917MHz bands (Band no. 1 and 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD) + */ + EU_874 = 30; + EU_917 = 31; + + /* + * EU 868MHz band, with narrow presets + */ + EU_N_868 = 32; + + /* + * ITU Region 3 Amateur Radio 2m band (144-148 MHz) + */ + ITU3_2M = 33; + + /* + * ITU Region 1 Amateur Radio 70cm band (430-440 MHz) + */ + ITU1_70CM = 34; + + /* + * ITU Region 2 Amateur Radio 70cm band (420-450 MHz) + * Note: Some countries do not allocate 420-430 MHz or 440-450 MHz. + * Check local law! + */ + ITU2_70CM = 35; + + /* + * ITU Region 3 Amateur Radio 70cm band (430-450 MHz) + * Note: Some countries do not allocate 440-450 MHz. Check local law! + */ + ITU3_70CM = 36; + + /* + * ITU Region 2 Amateur Radio 1.25m '125cm' band (220-225 MHz) + * Note: Some countries do not allocate 220-222 MHz (Ex: USA/Canada). + * Check local law! + */ + ITU2_125CM = 37; } /* @@ -938,8 +1004,9 @@ message Config { /* * Long Range - Slow + * Deprecated in 2.7: Unpopular slow preset. */ - LONG_SLOW = 1; + LONG_SLOW = 1 [deprecated = true]; /* * Very Long Range - Slow @@ -978,6 +1045,78 @@ message Config { * It is not legal to use in all regions due to this wider bandwidth. */ SHORT_TURBO = 8; + + /* + * Long Range - Turbo + * This preset performs similarly to LongFast, but with 500Khz bandwidth. + */ + LONG_TURBO = 9; + + /* + * Lite Fast + * Medium range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. + * Comparable link budget to MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC. + */ + LITE_FAST = 10; + + /* + * Lite Slow + * Medium-to-moderate range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. + * Comparable link budget to LONG_FAST but compliant with Band no. 47b of 2006/771/EC. + */ + LITE_SLOW = 11; + + /* + * Narrow Fast + * Medium-to-moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. + * Comparable link budget to SHORT_SLOW, but with half the data rate. + * Intended to avoid interference with other devices. + */ + NARROW_FAST = 12; + + /* + * Narrow Slow + * Moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. + * Comparable link budget and data rate to LONG_FAST. + */ + NARROW_SLOW = 13; + + /* + * Tiny Fast + * Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + * Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + * Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + * Only compatible with SX127x and SX126x chipsets. + * Comparable link budget and data rate to LONG_FAST. + */ + TINY_FAST = 14; + + /* + * Tiny Slow + * Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + * Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + * Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + * Only compatible with SX127x and SX126x chipsets. + * Comparable link budget and data rate to LONG_MODERATE. + */ + TINY_SLOW = 15; + } + + enum FEM_LNA_Mode { + /* + * FEM_LNA is present but disabled + */ + DISABLED = 0; + + /* + * FEM_LNA is present and enabled + */ + ENABLED = 1; + + /* + * FEM_LNA is not present on the device + */ + NOT_PRESENT = 2; } /* @@ -1100,6 +1239,16 @@ message Config { * Sets the ok_to_mqtt bit on outgoing packets */ bool config_ok_to_mqtt = 105; + + /* + * Set where LORA FEM is enabled, disabled, or not present + */ + FEM_LNA_Mode fem_lna_mode = 106; + + /* + * Don't use radiolib to initialize the radio, instead listen for a serialHal connection + */ + bool serial_hal_only = 107; } message BluetoothConfig { diff --git a/packages/protobufs/meshtastic/connection_status.proto b/packages/protobufs/meshtastic/connection_status.proto index 75515965..641e916b 100644 --- a/packages/protobufs/meshtastic/connection_status.proto +++ b/packages/protobufs/meshtastic/connection_status.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "ConnStatusProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; message DeviceConnectionStatus { diff --git a/packages/protobufs/meshtastic/device_ui.proto b/packages/protobufs/meshtastic/device_ui.proto index 5b6bb5dd..28d2910a 100644 --- a/packages/protobufs/meshtastic/device_ui.proto +++ b/packages/protobufs/meshtastic/device_ui.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "DeviceUIProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/deviceonly.proto b/packages/protobufs/meshtastic/deviceonly.proto index d449373d..ec28b59d 100644 --- a/packages/protobufs/meshtastic/deviceonly.proto +++ b/packages/protobufs/meshtastic/deviceonly.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package meshtastic; +/* trunk-ignore(buf-lint/COMPILE) */ import "meshtastic/channel.proto"; import "meshtastic/config.proto"; import "meshtastic/localonly.proto"; @@ -12,7 +13,7 @@ import "nanopb.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "DeviceOnly"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; option (nanopb_fileopt).include = ""; @@ -49,6 +50,11 @@ message PositionLite { * TODO: REPLACE */ Position.LocSource location_source = 5; + + /* + * Indicates the bits of precision set by the sending node + */ + uint32 precision_bits = 6; } message UserLite { @@ -106,20 +112,15 @@ message NodeInfoLite { */ uint32 num = 1; - /* - * The user info for this node - */ - UserLite user = 2; + // Tag 2 was UserLite user; flattened into tags 14..18 (presence via + // NODEINFO_BITFIELD_HAS_USER). + // Tag 3 was PositionLite position; moved to NodeDatabase.positions. + reserved 2, 3; + reserved "user", "position"; /* - * This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true. - * Position.time now indicates the last time we received a POSITION from that node. - */ - PositionLite position = 3; - - /* - * Returns the Signal-to-noise ratio (SNR) of the last received message, - * as measured by the receiver. Return SNR of the last received message in dB + * In-memory SNR of the last received message in dB. Not serialised directly: + * always zeroed before encode; persisted as snr_q4 = 19 below. */ float snr = 4; @@ -127,48 +128,69 @@ message NodeInfoLite { * Set to indicate the last time we received a packet from this node */ fixed32 last_heard = 5; - /* - * The latest device metrics for the node. - */ - DeviceMetrics device_metrics = 6; + + // Tag 6 was DeviceMetrics device_metrics; moved to NodeDatabase.telemetry. + reserved 6; + reserved "device_metrics"; /* * local channel index we heard that node on. Only populated if its not the default channel. */ uint32 channel = 7; - /* - * True if we witnessed the node over MQTT instead of LoRA transport - */ - bool via_mqtt = 8; + // Tags 8/10/11 were via_mqtt/is_favorite/is_ignored bools; packed into bitfield. + reserved 8, 10, 11; + reserved "via_mqtt", "is_favorite", "is_ignored"; /* * Number of hops away from us this node is (0 if direct neighbor) */ optional uint32 hops_away = 9; - /* - * True if node is in our favorites list - * Persists between NodeDB internal clean ups - */ - bool is_favorite = 10; - - /* - * True if node is in our ignored list - * Persists between NodeDB internal clean ups - */ - bool is_ignored = 11; - /* * Last byte of the node number of the node that should be used as the next hop to reach this node. */ uint32 next_hop = 12; /* - * Bitfield for storing booleans. - * LSB 0 is_key_manually_verified + * Bitfield for storing booleans. See NODEINFO_BITFIELD_* in src/mesh/NodeDB.h. */ uint32 bitfield = 13; + + // Flattened user fields (formerly UserLite). macaddr dropped (deprecated 1.2.11). + + /* + * A full name for this user, i.e. "Kevin Hester". + */ + string long_name = 14; + + /* + * A VERY short name, ideally two characters or an emoji. + * Suitable for a tiny OLED screen. + */ + string short_name = 15; + + /* + * Hardware model the user's device is running. + */ + HardwareModel hw_model = 16; + + /* + * The user's role in the mesh. + */ + Config.DeviceConfig.Role role = 17; + + /* + * The public key of the user's device, for PKI-based encrypted DMs. + */ + bytes public_key = 18; + + /* + * Q4-encoded SNR: dB × 4, sint32 zigzag. Matches RouteDiscovery convention. + * Encode: snr_q4 = (int32_t)(snr * 4.0f). Decode: snr = snr_q4 / 4.0f. + * float snr is always zeroed on disk; this field carries all persisted SNR. + */ + sint32 snr_q4 = 19; } /* @@ -234,6 +256,29 @@ message DeviceState { repeated NodeRemoteHardwarePin node_remote_hardware_pins = 13; } +// Satellite per-node entries; stored alongside the slim NodeInfoLite so nodes +// that never report don't pay the embedded cost. + +message NodePositionEntry { + uint32 num = 1; + PositionLite position = 2; +} + +message NodeTelemetryEntry { + uint32 num = 1; + DeviceMetrics device_metrics = 2; +} + +message NodeEnvironmentEntry { + uint32 num = 1; + EnvironmentMetrics environment_metrics = 2; +} + +message NodeStatusEntry { + uint32 num = 1; + StatusMessage status = 2; +} + message NodeDatabase { /* * A version integer used to invalidate old save files when we make @@ -246,6 +291,13 @@ message NodeDatabase { * New lite version of NodeDB to decrease memory footprint */ repeated NodeInfoLite nodes = 2 [(nanopb).callback_datatype = "std::vector"]; + + // Per-NodeNum satellite arrays. Constrained platforms (e.g. STM32WL) omit + // these via MESHTASTIC_EXCLUDE_*DB build flags. + repeated NodePositionEntry positions = 3 [(nanopb).callback_datatype = "std::vector"]; + repeated NodeTelemetryEntry telemetry = 4 [(nanopb).callback_datatype = "std::vector"]; + repeated NodeStatusEntry status = 5 [(nanopb).callback_datatype = "std::vector"]; + repeated NodeEnvironmentEntry environment = 6 [(nanopb).callback_datatype = "std::vector"]; } /* diff --git a/packages/protobufs/meshtastic/deviceonly_legacy.proto b/packages/protobufs/meshtastic/deviceonly_legacy.proto new file mode 100644 index 00000000..a4bb0240 --- /dev/null +++ b/packages/protobufs/meshtastic/deviceonly_legacy.proto @@ -0,0 +1,50 @@ +syntax = "proto3"; + +package meshtastic; + +/* trunk-ignore(buf-lint/COMPILE) */ +import "meshtastic/deviceonly.proto"; +import "meshtastic/telemetry.proto"; +import "nanopb.proto"; + +option csharp_namespace = "Meshtastic.Protobufs"; +option go_package = "github.com/meshtastic/go/generated"; +option java_outer_classname = "DeviceOnlyLegacy"; +option java_package = "org.meshtastic.proto"; +option swift_prefix = ""; +option (nanopb_fileopt).include = ""; + +/* + * Legacy NodeInfoLite descriptor used only to decode pre-split + * /prefs/nodes.proto saves during the v24 -> v25 migration boot. + * This preserves the original NodeInfoLite-compatible field numbers needed + * to parse old wire bytes cleanly, including user (2), position (3), + * device_metrics (6), and the legacy-only compatibility fields via_mqtt (8), + * is_favorite (10), and is_ignored (11). Steady-state code does not use + * this struct; it is dropped after migration completes. This file should be + * removed once DEVICESTATE_MIN_VER advances past 24. + */ +message NodeInfoLite_Legacy { + uint32 num = 1; + UserLite user = 2; + PositionLite position = 3; + float snr = 4; + fixed32 last_heard = 5; + DeviceMetrics device_metrics = 6; + uint32 channel = 7; + bool via_mqtt = 8; + optional uint32 hops_away = 9; + bool is_favorite = 10; + bool is_ignored = 11; + uint32 next_hop = 12; + uint32 bitfield = 13; +} + +/* + * Legacy NodeDatabase shape: one repeated array of fat NodeInfoLite_Legacy + * with no satellite position/telemetry arrays. + */ +message NodeDatabase_Legacy { + uint32 version = 1; + repeated NodeInfoLite_Legacy nodes = 2 [(nanopb).callback_datatype = "std::vector"]; +} diff --git a/packages/protobufs/meshtastic/interdevice.proto b/packages/protobufs/meshtastic/interdevice.proto index 4616c087..f646368b 100644 --- a/packages/protobufs/meshtastic/interdevice.proto +++ b/packages/protobufs/meshtastic/interdevice.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "InterdeviceProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; // encapsulate up to 1k of NMEA string data diff --git a/packages/protobufs/meshtastic/localonly.proto b/packages/protobufs/meshtastic/localonly.proto index bcb27964..2a6c7cac 100644 --- a/packages/protobufs/meshtastic/localonly.proto +++ b/packages/protobufs/meshtastic/localonly.proto @@ -8,7 +8,7 @@ import "meshtastic/module_config.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "LocalOnlyProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -131,6 +131,21 @@ message LocalModuleConfig { */ ModuleConfig.PaxcounterConfig paxcounter = 14; + /* + * StatusMessage Config + */ + ModuleConfig.StatusMessageConfig statusmessage = 15; + + /* + * The part of the config that is specific to the Traffic Management module + */ + ModuleConfig.TrafficManagementConfig traffic_management = 16; + + /* + * TAK Config + */ + ModuleConfig.TAKConfig tak = 17; + /* * A version integer used to invalidate old save files when we make * incompatible changes This integer is set at build time and is private to diff --git a/packages/protobufs/meshtastic/mesh.proto b/packages/protobufs/meshtastic/mesh.proto index 59f8c101..ecfdadd9 100644 --- a/packages/protobufs/meshtastic/mesh.proto +++ b/packages/protobufs/meshtastic/mesh.proto @@ -13,7 +13,7 @@ import "meshtastic/xmodem.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "MeshProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -388,9 +388,9 @@ enum HardwareModel { LORA_RELAY_V1 = 32; /* - * TODO: REPLACE + * T-Echo Plus device from LilyGo */ - NRF52840DK = 33; + T_ECHO_PLUS = 33; /* * TODO: REPLACE @@ -700,9 +700,9 @@ enum HardwareModel { HELTEC_SENSOR_HUB = 92; /* - * Reserved Fried Chicken ID for future use + * Muzi Works Muzi-Base device */ - RESERVED_FRIED_CHICKEN = 93; + MUZI_BASE = 93; /* * Heltec Magnetic Power Bank with Meshtastic compatible @@ -810,6 +810,129 @@ enum HardwareModel { */ T_WATCH_ULTRA = 114; + /* + * Elecrow ThinkNode M3 + */ + THINKNODE_M3 = 115; + + /* + * RAK WISMESH_TAP_V2 with ESP32-S3 CPU + */ + WISMESH_TAP_V2 = 116; + + /* + * RAK3401 + */ + RAK3401 = 117; + + /* + * RAK6421 Hat+ + */ + RAK6421 = 118; + + /* + * Elecrow ThinkNode M4 + */ + THINKNODE_M4 = 119; + + /* + * Elecrow ThinkNode M6 + */ + THINKNODE_M6 = 120; + + /* + * Elecrow Meshstick 1262 + */ + MESHSTICK_1262 = 121; + + /* + * LilyGo T-Beam 1W + */ + TBEAM_1_WATT = 122; + + /* + * LilyGo T5 S3 ePaper Pro (V1 and V2) + */ + T5_S3_EPAPER_PRO = 123; + + /* + * LilyGo T-Beam BPF (144-148Mhz) + */ + TBEAM_BPF = 124; + + /* + * LilyGo T-Mini E-paper S3 Kit + */ + MINI_EPAPER_S3 = 125; + + /* + * LilyGo T-Display S3 Pro LR1121 + */ + TDISPLAY_S3_PRO = 126; + + /* + * Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen. + */ + HELTEC_MESH_NODE_T096 = 127; + + /* + * Seeed studio T1000-E Pro tracker card. NRF52840 w/ LR2021 radio, + * GPS, button, buzzer, and sensors. + */ + TRACKER_T1000_E_PRO = 128; + + /* + * Elecrow ThinkNode M7, M8 and M9 + */ + THINKNODE_M7 = 129; + THINKNODE_M8 = 130; + THINKNODE_M9 = 131; + + /* + * The Heltec-V4-R8 uses an ESP32S3R8 chip, plus an SX1262. + */ + HELTEC_V4_R8 = 132; + + /* + * The HELTEC_MESH_NODE_T1 uses an NRF52840 chip, plus an SX1262. + */ + HELTEC_MESH_NODE_T1 = 133; + + /* + * B&Q Consulting Station G3: TBD + */ + STATION_G3 = 134; + + /* + * Lilygo T-Impulse-Plus + */ + T_IMPULSE_PLUS = 135; + + /* + * Lilygo T-Echo Card + */ + T_ECHO_CARD = 136; + + /* + * Seeed Tracker L2 + */ + SEEED_WIO_TRACKER_L2 = 137; + + /* + * Elecrow CrowPanel Advance P4 models, ESP32-P4 and TFT with SX1262 radio plugin + */ + CROWPANEL_P4 = 138; + + /* + * Heltec Mesh Tower V2 + */ + HELTEC_MESH_TOWER_V2 = 139; + + /* + * Meshnology W10 + */ + MESHNOLOGY_W10 = 140; + /* * ------------------------------------------------------------------------------------------------------------------------------------------ * Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. @@ -851,6 +974,9 @@ message User { /* * A full name for this user, i.e. "Kevin Hester" + * Limited to 24 bytes of UTF-8: longer names are accepted from senders + * built against the older 39-byte limit, but devices truncate them before + * storing or rebroadcasting. Clients should enforce 24 bytes in their UI. */ string long_name = 2; @@ -1020,6 +1146,12 @@ message Routing { * This typically enforced per portnum and is used to prevent a single node from monopolizing airtime */ RATE_LIMIT_EXCEEDED = 38; + + /* + * PKI encryption failed, due to no public key for the remote node + * This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet + */ + PKI_SEND_FAIL_PUBLIC_KEY = 39; } oneof variant { @@ -1101,6 +1233,11 @@ message Data { * Bitfield for extra flags. First use is to indicate that user approves the packet being uploaded to MQTT. */ optional uint32 bitfield = 9; + + /* + * XEdDSA signature for the payload + */ + bytes xeddsa_signature = 10; } /* @@ -1124,6 +1261,176 @@ message KeyVerification { bytes hash2 = 3; } +/* + * The actual over-the-mesh message doing store and forward++ + */ +message StoreForwardPlusPlus { + /* + * Enum of message types + */ + enum SFPP_message_type { + /* + * Send an announcement of the canonical tip of a chain + */ + CANON_ANNOUNCE = 0; + + /* + * Query whether a specific link is on the chain + */ + CHAIN_QUERY = 1; + + /* + * Request the next link in the chain + */ + LINK_REQUEST = 3; + + /* + * Provide a link to add to the chain + */ + LINK_PROVIDE = 4; + + /* + * If we must fragment, send the first half + */ + LINK_PROVIDE_FIRSTHALF = 5; + + /* + * If we must fragment, send the second half + */ + LINK_PROVIDE_SECONDHALF = 6; + } + + /* + * Which message type is this + */ + SFPP_message_type sfpp_message_type = 1; + + /* + * The hash of the specific message + */ + bytes message_hash = 2; + + /* + * The hash of a link on a chain + */ + bytes commit_hash = 3; + + /* + * the root hash of a chain + */ + bytes root_hash = 4; + + /* + * The encrypted bytes from a message + */ + bytes message = 5; + + /* + * Message ID of the contained message + */ + uint32 encapsulated_id = 6; + + /* + * Destination of the contained message + */ + uint32 encapsulated_to = 7; + + /* + * Sender of the contained message + */ + uint32 encapsulated_from = 8; + + /* + * The receive time of the message in question + */ + uint32 encapsulated_rxtime = 9; + + /* + * Used in a LINK_REQUEST to specify the message X spots back from head + */ + uint32 chain_count = 10; +} + +/* + * The actual over-the-mesh message doing RemoteShell + */ +message RemoteShell { + /* + * Frame op code for PTY session control and stream transport. + * + * Values 1-63 are client->server requests. + * Values 64-127 are server->client responses/events. + */ + enum OpCode { + OP_UNSET = 0; + + // Client -> server + OPEN = 1; + INPUT = 2; + RESIZE = 3; + CLOSE = 4; + PING = 5; + ACK = 6; + + // Server -> client + OPEN_OK = 64; + OUTPUT = 65; + CLOSED = 66; + ERROR = 67; + PONG = 68; + } + + /* + * Structured frame operation. + */ + OpCode op = 1; + + /* + * Logical PTY session identifier. + */ + uint32 session_id = 2; + + /* + * Monotonic sequence number for this frame. + */ + uint32 seq = 3; + + /* + * Cumulative ack sequence number. + */ + uint32 ack_seq = 4; + + /* + * Opaque bytes payload for INPUT/OUTPUT/ERROR and other frame bodies. + */ + bytes payload = 5; + + /* + * Terminal size columns used for OPEN/RESIZE signaling. + */ + uint32 cols = 6; + + /* + * Terminal size rows used for OPEN/RESIZE signaling. + */ + uint32 rows = 7; + + /* + * Bit flags for protocol extensions. + */ + uint32 flags = 8; + + /* + * The last sequence number TX'd. + */ + uint32 last_tx_seq = 9; + + /* + * The last sequence number RX'd. + */ + uint32 last_rx_seq = 10; +} + /* * Waypoint message, used to share arbitrary locations across the mesh */ @@ -1170,6 +1477,13 @@ message Waypoint { fixed32 icon = 8; } +/* + * Message for node status + */ +message StatusMessage { + string status = 1; +} + /* * This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server */ @@ -1345,6 +1659,11 @@ message MeshPacket { * Arrived via API connection */ TRANSPORT_API = 7; + + /* + * Arrived via Unicast UDP + */ + TRANSPORT_UNICAST_UDP = 8; } /* @@ -1356,6 +1675,10 @@ message MeshPacket { /* * The (immediate) destination for this packet + * If the value is 4,294,967,295 (maximum value of an unsigned 32bit integer), this indicates that the packet was + * not destined for a specific node, but for a channel as indicated by the value of `channel` below. + * If the value is another, this indicates that the packet was destined for a specific + * node (i.e. a kind of "Direct Message" to this node) and not broadcast on a channel. */ fixed32 to = 2; @@ -1499,6 +1822,11 @@ message MeshPacket { * Indicates which transport mechanism this packet arrived over */ TransportMechanism transport_mechanism = 21; + + /* + * Indicates whether the packet has a valid signature + */ + bool xeddsa_signed = 22; } /* @@ -1629,6 +1957,19 @@ message NodeInfo { * LSB 0 of the bitfield */ bool is_key_manually_verified = 12; + + /* + * True if node has been muted + * Persistes between NodeDB internal clean ups + */ + bool is_muted = 13; + + /* + * True if node is signing its packets via XEdDSA + * Persists between NodeDB internal clean ups + * LSB 1 of the bitfield + */ + bool has_xeddsa_signed = 14; } /* @@ -1987,9 +2328,105 @@ message FromRadio { * Persistent data for device-ui */ DeviceUIConfig deviceuiConfig = 17; + + /* + * Lockdown state notification for hardened firmware builds. + * Sent post-config (so unauthorized clients learn they must + * provision/unlock) and after each LockdownAuth admin command + * to report success or failure. Replaces the earlier scheme of + * encoding state as magic-string prefixes inside ClientNotification. + */ + LockdownStatus lockdown_status = 18; } } +/* + * Lockdown state report from firmware to client (for hardened builds + * with MESHTASTIC_LOCKDOWN). Sent immediately after config_complete_id + * to inform a freshly-connected unauthorized client what it must do, + * and again in response to each LockdownAuth admin command. + */ +message LockdownStatus { + enum State { + /* Default; should not be sent. */ + STATE_UNSPECIFIED = 0; + + /* + * No passphrase has ever been provisioned on this device. + * Client should prompt the operator to set one. + */ + NEEDS_PROVISION = 1; + + /* + * Storage is locked or this client has not authenticated yet. + * lock_reason carries a machine-readable detail string. + * Client should present (or auto-replay) a passphrase via + * AdminMessage.lockdown_auth. + */ + LOCKED = 2; + + /* + * Passphrase accepted; client is now authorized for this connection. + * boots_remaining and valid_until_epoch describe the active session + * token's TTL. + */ + UNLOCKED = 3; + + /* + * Passphrase rejected. backoff_seconds is non-zero when rate-limited. + */ + UNLOCK_FAILED = 4; + + /* + * Lockdown is supported by this firmware but not currently active + * (no passphrase has been provisioned, or it was disabled via + * AdminMessage.lockdown_auth.disable). The device is operating in + * normal, non-encrypted mode. Clients render the lockdown-mode + * toggle as OFF on receiving this. Distinct from NEEDS_PROVISION, + * which is only used during an in-progress enable flow. + */ + DISABLED = 5; + } + + /* Current lockdown state being reported. */ + State state = 1; + + /* + * For LOCKED: machine-readable reason. Known values: + * "needs_auth" — storage already unlocked, client must auth + * "token_missing" — no boot token on flash + * "token_expired" — boot token wall-clock TTL elapsed + * "token_boots_zero" — boot token boot-count TTL exhausted + * "token_hmac_fail" — token tampered or wrong device + * "token_dek_fail" — token DEK decrypt failed + * "token_wrong_size" — token file corrupted + * "token_bad_magic" — token file corrupted + * "not_provisioned" — should generally use NEEDS_PROVISION state instead + * Other values may be added; clients should treat unknown values as + * "locked, ask for passphrase". + */ + string lock_reason = 2; + + /* + * For UNLOCKED: remaining boots on the issued session token. + * Decrements by 1 on each subsequent boot. + */ + uint32 boots_remaining = 3; + + /* + * For UNLOCKED: wall-clock expiry of the issued session token, + * absolute Unix-epoch seconds. 0 = no time limit. + */ + uint32 valid_until_epoch = 4; + + /* + * For UNLOCK_FAILED: seconds the client must wait before another + * passphrase attempt will be accepted. 0 = wrong passphrase, no + * backoff (immediate retry allowed but advisable to prompt user). + */ + uint32 backoff_seconds = 5; +} + /* * A notification message from the device to the client * To be used for important messages that should to be displayed to the user diff --git a/packages/protobufs/meshtastic/module_config.proto b/packages/protobufs/meshtastic/module_config.proto index be8a6937..a134f74c 100644 --- a/packages/protobufs/meshtastic/module_config.proto +++ b/packages/protobufs/meshtastic/module_config.proto @@ -2,10 +2,12 @@ syntax = "proto3"; package meshtastic; +import "meshtastic/atak.proto"; + option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "ModuleConfigProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -51,9 +53,9 @@ message ModuleConfig { bool encryption_enabled = 5; /* - * Whether to send / consume json packets on MQTT + * Deprecated: JSON packet support on MQTT was removed, and this field is ignored. */ - bool json_enabled = 6; + bool json_enabled = 6 [deprecated = true]; /* * If true, we attempt to establish a secure connection using TLS @@ -295,6 +297,82 @@ message ModuleConfig { int32 ble_threshold = 4; } + /* + * Config for the Traffic Management module. + * Provides packet inspection and traffic shaping to help reduce channel utilization + */ + message TrafficManagementConfig { + /* + * Master enable for traffic management module + */ + bool enabled = 1; + + /* + * Enable position deduplication to drop redundant position broadcasts + */ + bool position_dedup_enabled = 2; + + /* + * Number of bits of precision for position deduplication (0-32) + */ + uint32 position_precision_bits = 3; + + /* + * Minimum interval in seconds between position updates from the same node + */ + uint32 position_min_interval_secs = 4; + + /* + * Enable direct response to NodeInfo requests from local cache + */ + bool nodeinfo_direct_response = 5; + + /* + * Minimum hop distance from requestor before responding to NodeInfo requests + */ + uint32 nodeinfo_direct_response_max_hops = 6; + + /* + * Enable per-node rate limiting to throttle chatty nodes + */ + bool rate_limit_enabled = 7; + + /* + * Time window in seconds for rate limiting calculations + */ + uint32 rate_limit_window_secs = 8; + + /* + * Maximum packets allowed per node within the rate limit window + */ + uint32 rate_limit_max_packets = 9; + + /* + * Enable dropping of unknown/undecryptable packets per rate_limit_window_secs + */ + bool drop_unknown_enabled = 10; + + /* + * Number of unknown packets before dropping from a node + */ + uint32 unknown_packet_threshold = 11; + + /* + * Set hop_limit to 0 for relayed telemetry broadcasts (own packets unaffected) + */ + bool exhaust_hop_telemetry = 12; + + /* + * Set hop_limit to 0 for relayed position broadcasts (own packets unaffected) + */ + bool exhaust_hop_position = 13; + + /* + * Preserve hop_limit for router-to-router traffic + */ + bool router_preserve_hops = 14; + } + /* * Serial Config */ @@ -337,9 +415,12 @@ message ModuleConfig { // VE.Direct is a serial protocol used by Victron Energy products // https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable VE_DIRECT = 7; - //Used to configure and view some parameters of MeshSolar. - //https://heltec.org/project/meshsolar/ + // Used to configure and view some parameters of MeshSolar. + // https://heltec.org/project/meshsolar/ MS_CONFIG = 8; + // Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. + LOG = 9; // includes other packets + LOGTEXT = 10; // only text (channel & DM) } /* @@ -621,6 +702,11 @@ message ModuleConfig { * Note: We will still send telemtry to the connected phone / client every minute over the API */ bool device_telemetry_enabled = 14; + + /* + * Enable/Disable the air quality telemetry measurement module on-device display + */ + bool air_quality_screen_enabled = 15; } /* @@ -761,6 +847,16 @@ message ModuleConfig { uint32 blue = 5; } + /* + * StatusMessage config - Allows setting a status message for a node to periodically rebroadcast + */ + message StatusMessageConfig { + /* + * The actual status string + */ + string node_status = 1; + } + /* * TODO: REPLACE */ @@ -829,6 +925,37 @@ message ModuleConfig { * TODO: REPLACE */ PaxcounterConfig paxcounter = 13; + + /* + * TODO: REPLACE + */ + StatusMessageConfig statusmessage = 14; + + /* + * Traffic management module config for mesh network optimization + */ + TrafficManagementConfig traffic_management = 15; + + /* + * TAK team/role configuration for TAK_TRACKER + */ + TAKConfig tak = 16; + } + + /* + * TAK team/role configuration + */ + message TAKConfig { + /* + * Team color. + * Default Unspecifed_Color -> firmware uses Cyan + */ + Team team = 1; + /* + * Member role. + * Default Unspecifed -> firmware uses TeamMember + */ + MemberRole role = 2; } } diff --git a/packages/protobufs/meshtastic/mqtt.proto b/packages/protobufs/meshtastic/mqtt.proto index 4edf0c43..616780df 100644 --- a/packages/protobufs/meshtastic/mqtt.proto +++ b/packages/protobufs/meshtastic/mqtt.proto @@ -8,7 +8,7 @@ import "meshtastic/mesh.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "MQTTProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/paxcount.proto b/packages/protobufs/meshtastic/paxcount.proto index 47b26398..5084f9dc 100644 --- a/packages/protobufs/meshtastic/paxcount.proto +++ b/packages/protobufs/meshtastic/paxcount.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "PaxcountProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/portnums.proto b/packages/protobufs/meshtastic/portnums.proto index e388a6f2..61412cfe 100644 --- a/packages/protobufs/meshtastic/portnums.proto +++ b/packages/protobufs/meshtastic/portnums.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "Portnums"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -115,6 +115,11 @@ enum PortNum { */ KEY_VERIFICATION_APP = 12; + /* + * Module/port for handling primitive remote shell access. + */ + REMOTE_SHELL_APP = 13; + /* * Provides a 'ping' service that replies to any packet it receives. * Also serves as a small example module. @@ -134,6 +139,22 @@ enum PortNum { */ PAXCOUNTER_APP = 34; + /* + * Store and Forward++ module included in the firmware + * ENCODING: protobuf + * This module is specifically for Native Linux nodes, and provides a Git-style + * chain of messages. + */ + STORE_FORWARD_PLUSPLUS_APP = 35; + + /* + * Node Status module + * ENCODING: protobuf + * This module allows setting an extra string of status for a node. + * Broadcasts on change and on a timer, possibly once a day. + */ + NODE_STATUS_APP = 36; + /* * Provides a hardware serial interface to send and receive from the Meshtastic network. * Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic @@ -211,6 +232,12 @@ enum PortNum { */ POWERSTRESS_APP = 74; + /* + * LoraWAN Payload Transport + * ENCODING: compact binary LoRaWAN uplink (10-byte RF metadata + PHY payload) - see LoRaWANBridgeModule + */ + LORAWAN_BRIDGE = 75; + /* * Reticulum Network Stack Tunnel App * ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface @@ -224,6 +251,20 @@ enum PortNum { */ CAYENNE_APP = 77; + /* + * ATAK Plugin V2 + * Portnum for payloads from the official Meshtastic ATAK plugin using + * TAKPacketV2 with zstd dictionary compression. + */ + ATAK_PLUGIN_V2 = 78; + + /* + * GroupAlarm integration + * Used for transporting GroupAlarm-related messages between Meshtastic nodes + * and companion applications/services. + */ + GROUPALARM_APP = 112; + /* * Private applications should use portnums >= 256. * To simplify initial development and testing you can use "PRIVATE_APP" diff --git a/packages/protobufs/meshtastic/powermon.proto b/packages/protobufs/meshtastic/powermon.proto index 77206f4c..5973b16f 100644 --- a/packages/protobufs/meshtastic/powermon.proto +++ b/packages/protobufs/meshtastic/powermon.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "PowerMonProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs). diff --git a/packages/protobufs/meshtastic/remote_hardware.proto b/packages/protobufs/meshtastic/remote_hardware.proto index ba4a6930..d9192035 100644 --- a/packages/protobufs/meshtastic/remote_hardware.proto +++ b/packages/protobufs/meshtastic/remote_hardware.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "RemoteHardware"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/rtttl.proto b/packages/protobufs/meshtastic/rtttl.proto index 11c8b925..06d94fc3 100644 --- a/packages/protobufs/meshtastic/rtttl.proto +++ b/packages/protobufs/meshtastic/rtttl.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "RTTTLConfigProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/serial_hal.proto b/packages/protobufs/meshtastic/serial_hal.proto new file mode 100644 index 00000000..3483a5f5 --- /dev/null +++ b/packages/protobufs/meshtastic/serial_hal.proto @@ -0,0 +1,63 @@ +syntax = "proto3"; + +package meshtastic; + +option csharp_namespace = "Meshtastic.Protobufs"; +option go_package = "github.com/meshtastic/go/generated"; +option java_outer_classname = "SerialHal"; +option java_package = "org.meshtastic.proto"; +option swift_prefix = ""; + +// SerialHalCommand messages are sent from host to device over the SerialHal +// framing stream. Responses normally come back as SerialHalResponse with the +// same transaction_id. +// +// Interrupt notifications are the one asynchronous exception: the device emits +// an unsolicited SerialHalResponse with transaction_id == 0 and value == pin. +// Host implementations should treat those frames as interrupt events rather +// than replies to an outstanding request. + +message SerialHalCommand { + enum Type { + UNSET = 0; + PIN_MODE = 1; + DIGITAL_WRITE = 2; + DIGITAL_READ = 3; + ATTACH_INTERRUPT = 4; + DETACH_INTERRUPT = 5; + SPI_TRANSFER = 6; + NOOP = 7; + } + + // Host-assigned request id. Replies echo this id back in + // SerialHalResponse.transaction_id. + uint32 transaction_id = 1; + Type type = 2; + uint32 pin = 3; + uint32 value = 4; + uint32 mode = 5; + bytes data = 6; +} + +message SerialHalResponse { + enum Result { + OK = 0; + ERROR = 1; + BAD_REQUEST = 2; + UNSUPPORTED = 3; + } + + // Matches the originating SerialHalCommand.transaction_id for normal + // request/response traffic. + // + // A value of 0 indicates an unsolicited interrupt notification generated by + // the device. In that case, the host should interpret value as the GPIO pin + // that triggered. + uint32 transaction_id = 1; + Result result = 2; + // Used by DIGITAL_READ replies and interrupt notifications. For interrupt + // notifications (transaction_id == 0), this carries the pin number. + uint32 value = 3; + bytes data = 4; + string error = 5; +} diff --git a/packages/protobufs/meshtastic/storeforward.proto b/packages/protobufs/meshtastic/storeforward.proto index 651eae57..a4a18b2a 100644 --- a/packages/protobufs/meshtastic/storeforward.proto +++ b/packages/protobufs/meshtastic/storeforward.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "StoreAndForwardProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* diff --git a/packages/protobufs/meshtastic/telemetry.proto b/packages/protobufs/meshtastic/telemetry.proto index 448adf32..dccf1b6d 100644 --- a/packages/protobufs/meshtastic/telemetry.proto +++ b/packages/protobufs/meshtastic/telemetry.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "TelemetryProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; /* @@ -153,6 +153,11 @@ message EnvironmentMetrics { * Soil temperature measured (*C) */ optional float soil_temperature = 22; + + /* + * One-wire temperature (*C) + */ + repeated float one_wire_temperature = 23; } /* @@ -443,6 +448,51 @@ message LocalStats { * Number of packets that were dropped because the transmit queue was full. */ uint32 num_tx_dropped = 14; + + /* + * Noise floor value measured in dBm + */ + int32 noise_floor = 15; +} + +/* + * Traffic management statistics for mesh network optimization + */ +message TrafficManagementStats { + /* + * Total number of packets inspected by traffic management + */ + uint32 packets_inspected = 1; + + /* + * Number of position packets dropped due to deduplication + */ + uint32 position_dedup_drops = 2; + + /* + * Number of NodeInfo requests answered from cache + */ + uint32 nodeinfo_cache_hits = 3; + + /* + * Number of packets dropped due to rate limiting + */ + uint32 rate_limit_drops = 4; + + /* + * Number of unknown/undecryptable packets dropped + */ + uint32 unknown_packet_drops = 5; + + /* + * Number of packets with hop_limit exhausted for local-only broadcast + */ + uint32 hop_exhausted_packets = 6; + + /* + * Number of times router hop preservation was applied + */ + uint32 router_hops_preserved = 7; } /* @@ -560,6 +610,11 @@ message Telemetry { * Linux host metrics */ HostMetrics host_metrics = 8; + + /* + * Traffic management statistics + */ + TrafficManagementStats traffic_management_stats = 9; } } @@ -603,7 +658,7 @@ enum TelemetrySensorType { BMP280 = 6; /* - * High accuracy temperature and humidity + * TODO - REMOVE High accuracy temperature and humidity */ SHTC3 = 7; @@ -628,7 +683,7 @@ enum TelemetrySensorType { QMC5883L = 11; /* - * High accuracy temperature and humidity + * TODO - REMOVE High accuracy temperature and humidity */ SHT31 = 12; @@ -653,7 +708,7 @@ enum TelemetrySensorType { RCWL9620 = 16; /* - * Sensirion High accuracy temperature and humidity + * TODO - REMOVE Sensirion High accuracy temperature and humidity */ SHT4X = 17; @@ -786,10 +841,56 @@ enum TelemetrySensorType { * SEN5X PM SENSORS */ SEN5X = 43; + /* * TSL2561 light sensor */ TSL2561 = 44; + + /* + * BH1750 light sensor + */ + BH1750 = 45; + + /* + * HDC1080 Temperature and Humidity Sensor + */ + HDC1080 = 46; + + /* + * TODO - REMOVE STH21 Temperature and R. Humidity sensor + */ + SHT21 = 47; + + /* + * Sensirion STC31 CO2 sensor + */ + STC31 = 48; + + /* + * SCD30 CO2, humidity, temperature sensor + */ + SCD30 = 49; + + /* + * SHT family of sensors for temperature and humidity + */ + SHTXX = 50; + + /* + * DS248X Bridge for one-wire temperature sensors + */ + DS248X = 51; + + /* + * MMC5983MA 3-Axis Digital Magnetic Sensor + */ + MMC5983MA = 52; + + /* + * ICM-42607-P 6‑Axis IMU + */ + ICM42607P = 53; } /* @@ -806,3 +907,38 @@ message Nau7802Config { */ float calibrationFactor = 2; } + +/* + * SEN5X State, for saving to flash + */ +message SEN5XState { + /* + * Last cleaning time for SEN5X + */ + uint32 last_cleaning_time = 1; + + /* + * Last cleaning time for SEN5X - valid flag + */ + bool last_cleaning_valid = 2; + + /* + * Config flag for one-shot mode (see admin.proto) + */ + bool one_shot_mode = 3; + + /* + * Last VOC state time for SEN55 + */ + optional uint32 voc_state_time = 4; + + /* + * Last VOC state validity flag for SEN55 + */ + optional bool voc_state_valid = 5; + + /* + * VOC state array (8x uint8t) for SEN55 + */ + optional fixed64 voc_state_array = 6; +} diff --git a/packages/protobufs/meshtastic/xmodem.proto b/packages/protobufs/meshtastic/xmodem.proto index 732780a3..2a049d18 100644 --- a/packages/protobufs/meshtastic/xmodem.proto +++ b/packages/protobufs/meshtastic/xmodem.proto @@ -5,7 +5,7 @@ package meshtastic; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; option java_outer_classname = "XmodemProtos"; -option java_package = "com.geeksville.mesh"; +option java_package = "org.meshtastic.proto"; option swift_prefix = ""; message XModem { diff --git a/packages/protobufs/package.json b/packages/protobufs/package.json index ee31ed5e..8349b99b 100644 --- a/packages/protobufs/package.json +++ b/packages/protobufs/package.json @@ -1,5 +1,5 @@ { - "name": "@meshtastic/protobufs-ws", + "name": "@meshtastic/protobufs", "private": true, "version": "0.0.0", "type": "module", @@ -9,20 +9,18 @@ "./packages/ts/dist/" ], "exports": { - ".": { - "types": "./packages/ts/dist/mod.d.ts", - "default": "./packages/ts/dist/mod.js" - }, - "./*": "./packages/ts/dist/*" + ".": "./packages/ts/mod.ts" }, - "types": "./packages/ts/dist/mod.d.ts", + "types": "./packages/ts/mod.ts", "sideEffects": false, "scripts": { "gen": "buf generate", - "clean": "rimraf dist", + "clean": "rimraf packages/ts/dist", "build": "pnpm run clean && pnpm run gen" }, - "dependencies": {}, + "dependencies": { + "@bufbuild/protobuf": "^2.9.0" + }, "devDependencies": { "@bufbuild/protoc-gen-es": "^1.9.0", "rimraf": "^6.0.0" diff --git a/packages/protobufs/packages/ts/dist/meshtastic/admin_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/admin_pb.ts new file mode 100644 index 00000000..9861594b --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/admin_pb.ts @@ -0,0 +1,1559 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/admin.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Channel } from "./channel_pb"; +import { file_meshtastic_channel } from "./channel_pb"; +import type { Config } from "./config_pb"; +import { file_meshtastic_config } from "./config_pb"; +import type { DeviceConnectionStatus } from "./connection_status_pb"; +import { file_meshtastic_connection_status } from "./connection_status_pb"; +import type { DeviceUIConfig } from "./device_ui_pb"; +import { file_meshtastic_device_ui } from "./device_ui_pb"; +import type { DeviceMetadata, NodeRemoteHardwarePin, Position, User } from "./mesh_pb"; +import { file_meshtastic_mesh } from "./mesh_pb"; +import type { ModuleConfig } from "./module_config_pb"; +import { file_meshtastic_module_config } from "./module_config_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/admin.proto. + */ +export const file_meshtastic_admin: GenFile = /*@__PURE__*/ + fileDesc("ChZtZXNodGFzdGljL2FkbWluLnByb3RvEgptZXNodGFzdGljIqsbCgxBZG1pbk1lc3NhZ2USFwoPc2Vzc2lvbl9wYXNza2V5GGUgASgMEh0KE2dldF9jaGFubmVsX3JlcXVlc3QYASABKA1IABIzChRnZXRfY2hhbm5lbF9yZXNwb25zZRgCIAEoCzITLm1lc2h0YXN0aWMuQ2hhbm5lbEgAEhsKEWdldF9vd25lcl9yZXF1ZXN0GAMgASgISAASLgoSZ2V0X293bmVyX3Jlc3BvbnNlGAQgASgLMhAubWVzaHRhc3RpYy5Vc2VySAASQQoSZ2V0X2NvbmZpZ19yZXF1ZXN0GAUgASgOMiMubWVzaHRhc3RpYy5BZG1pbk1lc3NhZ2UuQ29uZmlnVHlwZUgAEjEKE2dldF9jb25maWdfcmVzcG9uc2UYBiABKAsyEi5tZXNodGFzdGljLkNvbmZpZ0gAEk4KGWdldF9tb2R1bGVfY29uZmlnX3JlcXVlc3QYByABKA4yKS5tZXNodGFzdGljLkFkbWluTWVzc2FnZS5Nb2R1bGVDb25maWdUeXBlSAASPgoaZ2V0X21vZHVsZV9jb25maWdfcmVzcG9uc2UYCCABKAsyGC5tZXNodGFzdGljLk1vZHVsZUNvbmZpZ0gAEjQKKmdldF9jYW5uZWRfbWVzc2FnZV9tb2R1bGVfbWVzc2FnZXNfcmVxdWVzdBgKIAEoCEgAEjUKK2dldF9jYW5uZWRfbWVzc2FnZV9tb2R1bGVfbWVzc2FnZXNfcmVzcG9uc2UYCyABKAlIABIlChtnZXRfZGV2aWNlX21ldGFkYXRhX3JlcXVlc3QYDCABKAhIABJCChxnZXRfZGV2aWNlX21ldGFkYXRhX3Jlc3BvbnNlGA0gASgLMhoubWVzaHRhc3RpYy5EZXZpY2VNZXRhZGF0YUgAEh4KFGdldF9yaW5ndG9uZV9yZXF1ZXN0GA4gASgISAASHwoVZ2V0X3Jpbmd0b25lX3Jlc3BvbnNlGA8gASgJSAASLgokZ2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXR1c19yZXF1ZXN0GBAgASgISAASUwolZ2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXR1c19yZXNwb25zZRgRIAEoCzIiLm1lc2h0YXN0aWMuRGV2aWNlQ29ubmVjdGlvblN0YXR1c0gAEjEKDHNldF9oYW1fbW9kZRgSIAEoCzIZLm1lc2h0YXN0aWMuSGFtUGFyYW1ldGVyc0gAEi8KJWdldF9ub2RlX3JlbW90ZV9oYXJkd2FyZV9waW5zX3JlcXVlc3QYEyABKAhIABJcCiZnZXRfbm9kZV9yZW1vdGVfaGFyZHdhcmVfcGluc19yZXNwb25zZRgUIAEoCzIqLm1lc2h0YXN0aWMuTm9kZVJlbW90ZUhhcmR3YXJlUGluc1Jlc3BvbnNlSAASIAoWZW50ZXJfZGZ1X21vZGVfcmVxdWVzdBgVIAEoCEgAEh0KE2RlbGV0ZV9maWxlX3JlcXVlc3QYFiABKAlIABITCglzZXRfc2NhbGUYFyABKA1IABJFChJiYWNrdXBfcHJlZmVyZW5jZXMYGCABKA4yJy5tZXNodGFzdGljLkFkbWluTWVzc2FnZS5CYWNrdXBMb2NhdGlvbkgAEkYKE3Jlc3RvcmVfcHJlZmVyZW5jZXMYGSABKA4yJy5tZXNodGFzdGljLkFkbWluTWVzc2FnZS5CYWNrdXBMb2NhdGlvbkgAEkwKGXJlbW92ZV9iYWNrdXBfcHJlZmVyZW5jZXMYGiABKA4yJy5tZXNodGFzdGljLkFkbWluTWVzc2FnZS5CYWNrdXBMb2NhdGlvbkgAEj8KEHNlbmRfaW5wdXRfZXZlbnQYGyABKAsyIy5tZXNodGFzdGljLkFkbWluTWVzc2FnZS5JbnB1dEV2ZW50SAASJQoJc2V0X293bmVyGCAgASgLMhAubWVzaHRhc3RpYy5Vc2VySAASKgoLc2V0X2NoYW5uZWwYISABKAsyEy5tZXNodGFzdGljLkNoYW5uZWxIABIoCgpzZXRfY29uZmlnGCIgASgLMhIubWVzaHRhc3RpYy5Db25maWdIABI1ChFzZXRfbW9kdWxlX2NvbmZpZxgjIAEoCzIYLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnSAASLAoic2V0X2Nhbm5lZF9tZXNzYWdlX21vZHVsZV9tZXNzYWdlcxgkIAEoCUgAEh4KFHNldF9yaW5ndG9uZV9tZXNzYWdlGCUgASgJSAASGwoRcmVtb3ZlX2J5X25vZGVudW0YJiABKA1IABIbChFzZXRfZmF2b3JpdGVfbm9kZRgnIAEoDUgAEh4KFHJlbW92ZV9mYXZvcml0ZV9ub2RlGCggASgNSAASMgoSc2V0X2ZpeGVkX3Bvc2l0aW9uGCkgASgLMhQubWVzaHRhc3RpYy5Qb3NpdGlvbkgAEh8KFXJlbW92ZV9maXhlZF9wb3NpdGlvbhgqIAEoCEgAEhcKDXNldF90aW1lX29ubHkYKyABKAdIABIfChVnZXRfdWlfY29uZmlnX3JlcXVlc3QYLCABKAhIABI8ChZnZXRfdWlfY29uZmlnX3Jlc3BvbnNlGC0gASgLMhoubWVzaHRhc3RpYy5EZXZpY2VVSUNvbmZpZ0gAEjUKD3N0b3JlX3VpX2NvbmZpZxguIAEoCzIaLm1lc2h0YXN0aWMuRGV2aWNlVUlDb25maWdIABIaChBzZXRfaWdub3JlZF9ub2RlGC8gASgNSAASHQoTcmVtb3ZlX2lnbm9yZWRfbm9kZRgwIAEoDUgAEhsKEXRvZ2dsZV9tdXRlZF9ub2RlGDEgASgNSAASHQoTYmVnaW5fZWRpdF9zZXR0aW5ncxhAIAEoCEgAEh4KFGNvbW1pdF9lZGl0X3NldHRpbmdzGEEgASgISAASMAoLYWRkX2NvbnRhY3QYQiABKAsyGS5tZXNodGFzdGljLlNoYXJlZENvbnRhY3RIABI8ChBrZXlfdmVyaWZpY2F0aW9uGEMgASgLMiAubWVzaHRhc3RpYy5LZXlWZXJpZmljYXRpb25BZG1pbkgAEh4KFGZhY3RvcnlfcmVzZXRfZGV2aWNlGF4gASgFSAASIAoScmVib290X290YV9zZWNvbmRzGF8gASgFQgIYAUgAEhgKDmV4aXRfc2ltdWxhdG9yGGAgASgISAASGAoOcmVib290X3NlY29uZHMYYSABKAVIABIaChBzaHV0ZG93bl9zZWNvbmRzGGIgASgFSAASHgoUZmFjdG9yeV9yZXNldF9jb25maWcYYyABKAVIABIWCgxub2RlZGJfcmVzZXQYZCABKAhIABI4CgtvdGFfcmVxdWVzdBhmIAEoCzIhLm1lc2h0YXN0aWMuQWRtaW5NZXNzYWdlLk9UQUV2ZW50SAASMQoNc2Vuc29yX2NvbmZpZxhnIAEoCzIYLm1lc2h0YXN0aWMuU2Vuc29yQ29uZmlnSAASMQoNbG9ja2Rvd25fYXV0aBhoIAEoCzIYLm1lc2h0YXN0aWMuTG9ja2Rvd25BdXRoSAAaUwoKSW5wdXRFdmVudBISCgpldmVudF9jb2RlGAEgASgNEg8KB2tiX2NoYXIYAiABKA0SDwoHdG91Y2hfeBgDIAEoDRIPCgd0b3VjaF95GAQgASgNGkoKCE9UQUV2ZW50EiwKD3JlYm9vdF9vdGFfbW9kZRgBIAEoDjITLm1lc2h0YXN0aWMuT1RBTW9kZRIQCghvdGFfaGFzaBgCIAEoDCLWAQoKQ29uZmlnVHlwZRIRCg1ERVZJQ0VfQ09ORklHEAASEwoPUE9TSVRJT05fQ09ORklHEAESEAoMUE9XRVJfQ09ORklHEAISEgoOTkVUV09SS19DT05GSUcQAxISCg5ESVNQTEFZX0NPTkZJRxAEEg8KC0xPUkFfQ09ORklHEAUSFAoQQkxVRVRPT1RIX0NPTkZJRxAGEhMKD1NFQ1VSSVRZX0NPTkZJRxAHEhUKEVNFU1NJT05LRVlfQ09ORklHEAgSEwoPREVWSUNFVUlfQ09ORklHEAkigwMKEE1vZHVsZUNvbmZpZ1R5cGUSDwoLTVFUVF9DT05GSUcQABIRCg1TRVJJQUxfQ09ORklHEAESEwoPRVhUTk9USUZfQ09ORklHEAISFwoTU1RPUkVGT1JXQVJEX0NPTkZJRxADEhQKEFJBTkdFVEVTVF9DT05GSUcQBBIUChBURUxFTUVUUllfQ09ORklHEAUSFAoQQ0FOTkVETVNHX0NPTkZJRxAGEhAKDEFVRElPX0NPTkZJRxAHEhkKFVJFTU9URUhBUkRXQVJFX0NPTkZJRxAIEhcKE05FSUdIQk9SSU5GT19DT05GSUcQCRIaChZBTUJJRU5UTElHSFRJTkdfQ09ORklHEAoSGgoWREVURUNUSU9OU0VOU09SX0NPTkZJRxALEhUKEVBBWENPVU5URVJfQ09ORklHEAwSGAoUU1RBVFVTTUVTU0FHRV9DT05GSUcQDRIcChhUUkFGRklDTUFOQUdFTUVOVF9DT05GSUcQDhIOCgpUQUtfQ09ORklHEA8iIwoOQmFja3VwTG9jYXRpb24SCQoFRkxBU0gQABIGCgJTRBABQhEKD3BheWxvYWRfdmFyaWFudCKWAQoMTG9ja2Rvd25BdXRoEhIKCnBhc3NwaHJhc2UYASABKAwSFwoPYm9vdHNfcmVtYWluaW5nGAIgASgNEhkKEXZhbGlkX3VudGlsX2Vwb2NoGAMgASgNEhAKCGxvY2tfbm93GAQgASgIEhsKE21heF9zZXNzaW9uX3NlY29uZHMYBSABKA0SDwoHZGlzYWJsZRgGIAEoCCJuCg1IYW1QYXJhbWV0ZXJzEhEKCWNhbGxfc2lnbhgBIAEoCRIQCgh0eF9wb3dlchgCIAEoBRIRCglmcmVxdWVuY3kYAyABKAISEgoKc2hvcnRfbmFtZRgEIAEoCRIRCglsb25nX25hbWUYBSABKAkiZgoeTm9kZVJlbW90ZUhhcmR3YXJlUGluc1Jlc3BvbnNlEkQKGW5vZGVfcmVtb3RlX2hhcmR3YXJlX3BpbnMYASADKAsyIS5tZXNodGFzdGljLk5vZGVSZW1vdGVIYXJkd2FyZVBpbiJzCg1TaGFyZWRDb250YWN0EhAKCG5vZGVfbnVtGAEgASgNEh4KBHVzZXIYAiABKAsyEC5tZXNodGFzdGljLlVzZXISFQoNc2hvdWxkX2lnbm9yZRgDIAEoCBIZChFtYW51YWxseV92ZXJpZmllZBgEIAEoCCKcAgoUS2V5VmVyaWZpY2F0aW9uQWRtaW4SQgoMbWVzc2FnZV90eXBlGAEgASgOMiwubWVzaHRhc3RpYy5LZXlWZXJpZmljYXRpb25BZG1pbi5NZXNzYWdlVHlwZRIWCg5yZW1vdGVfbm9kZW51bRgCIAEoDRINCgVub25jZRgDIAEoBBIcCg9zZWN1cml0eV9udW1iZXIYBCABKA1IAIgBASJnCgtNZXNzYWdlVHlwZRIZChVJTklUSUFURV9WRVJJRklDQVRJT04QABIbChdQUk9WSURFX1NFQ1VSSVRZX05VTUJFUhABEg0KCURPX1ZFUklGWRACEhEKDURPX05PVF9WRVJJRlkQA0ISChBfc2VjdXJpdHlfbnVtYmVyIs4BCgxTZW5zb3JDb25maWcSLgoMc2NkNHhfY29uZmlnGAEgASgLMhgubWVzaHRhc3RpYy5TQ0Q0WF9jb25maWcSLgoMc2VuNXhfY29uZmlnGAIgASgLMhgubWVzaHRhc3RpYy5TRU41WF9jb25maWcSLgoMc2NkMzBfY29uZmlnGAMgASgLMhgubWVzaHRhc3RpYy5TQ0QzMF9jb25maWcSLgoMc2h0eHhfY29uZmlnGAQgASgLMhgubWVzaHRhc3RpYy5TSFRYWF9jb25maWci4gIKDFNDRDRYX2NvbmZpZxIUCgdzZXRfYXNjGAEgASgISACIAQESIAoTc2V0X3RhcmdldF9jbzJfY29uYxgCIAEoDUgBiAEBEhwKD3NldF90ZW1wZXJhdHVyZRgDIAEoAkgCiAEBEhkKDHNldF9hbHRpdHVkZRgEIAEoDUgDiAEBEiEKFHNldF9hbWJpZW50X3ByZXNzdXJlGAUgASgNSASIAQESGgoNZmFjdG9yeV9yZXNldBgGIAEoCEgFiAEBEhsKDnNldF9wb3dlcl9tb2RlGAcgASgISAaIAQFCCgoIX3NldF9hc2NCFgoUX3NldF90YXJnZXRfY28yX2NvbmNCEgoQX3NldF90ZW1wZXJhdHVyZUIPCg1fc2V0X2FsdGl0dWRlQhcKFV9zZXRfYW1iaWVudF9wcmVzc3VyZUIQCg5fZmFjdG9yeV9yZXNldEIRCg9fc2V0X3Bvd2VyX21vZGUidgoMU0VONVhfY29uZmlnEhwKD3NldF90ZW1wZXJhdHVyZRgBIAEoAkgAiAEBEh4KEXNldF9vbmVfc2hvdF9tb2RlGAIgASgISAGIAQFCEgoQX3NldF90ZW1wZXJhdHVyZUIUChJfc2V0X29uZV9zaG90X21vZGUitAIKDFNDRDMwX2NvbmZpZxIUCgdzZXRfYXNjGAEgASgISACIAQESIAoTc2V0X3RhcmdldF9jbzJfY29uYxgCIAEoDUgBiAEBEhwKD3NldF90ZW1wZXJhdHVyZRgDIAEoAkgCiAEBEhkKDHNldF9hbHRpdHVkZRgEIAEoDUgDiAEBEiUKGHNldF9tZWFzdXJlbWVudF9pbnRlcnZhbBgFIAEoDUgEiAEBEhcKCnNvZnRfcmVzZXQYBiABKAhIBYgBAUIKCghfc2V0X2FzY0IWChRfc2V0X3RhcmdldF9jbzJfY29uY0ISChBfc2V0X3RlbXBlcmF0dXJlQg8KDV9zZXRfYWx0aXR1ZGVCGwoZX3NldF9tZWFzdXJlbWVudF9pbnRlcnZhbEINCgtfc29mdF9yZXNldCI6CgxTSFRYWF9jb25maWcSGQoMc2V0X2FjY3VyYWN5GAEgASgNSACIAQFCDwoNX3NldF9hY2N1cmFjeSo3CgdPVEFNb2RlEhEKDU5PX1JFQk9PVF9PVEEQABILCgdPVEFfQkxFEAESDAoIT1RBX1dJRkkQAkJhChRvcmcubWVzaHRhc3RpYy5wcm90b0ILQWRtaW5Qcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z", [file_meshtastic_channel, file_meshtastic_config, file_meshtastic_connection_status, file_meshtastic_device_ui, file_meshtastic_mesh, file_meshtastic_module_config]); + +/** + * + * This message is handled by the Admin module and is responsible for all settings/channel read/write operations. + * This message is used to do settings operations to both remote AND local nodes. + * (Prior to 1.2 these operations were done via special ToRadio operations) + * + * @generated from message meshtastic.AdminMessage + */ +export type AdminMessage = Message<"meshtastic.AdminMessage"> & { + /** + * + * The node generates this key and sends it with any get_x_response packets. + * The client MUST include the same key with any set_x commands. Key expires after 300 seconds. + * Prevents replay attacks for admin messages. + * + * @generated from field: bytes session_passkey = 101; + */ + sessionPasskey: Uint8Array; + + /** + * + * TODO: REPLACE + * + * @generated from oneof meshtastic.AdminMessage.payload_variant + */ + payloadVariant: { + /** + * + * Send the specified channel in the response to this message + * NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present) + * + * @generated from field: uint32 get_channel_request = 1; + */ + value: number; + case: "getChannelRequest"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.Channel get_channel_response = 2; + */ + value: Channel; + case: "getChannelResponse"; + } | { + /** + * + * Send the current owner data in the response to this message. + * + * @generated from field: bool get_owner_request = 3; + */ + value: boolean; + case: "getOwnerRequest"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.User get_owner_response = 4; + */ + value: User; + case: "getOwnerResponse"; + } | { + /** + * + * Ask for the following config data to be sent + * + * @generated from field: meshtastic.AdminMessage.ConfigType get_config_request = 5; + */ + value: AdminMessage_ConfigType; + case: "getConfigRequest"; + } | { + /** + * + * Send the current Config in the response to this message. + * + * @generated from field: meshtastic.Config get_config_response = 6; + */ + value: Config; + case: "getConfigResponse"; + } | { + /** + * + * Ask for the following config data to be sent + * + * @generated from field: meshtastic.AdminMessage.ModuleConfigType get_module_config_request = 7; + */ + value: AdminMessage_ModuleConfigType; + case: "getModuleConfigRequest"; + } | { + /** + * + * Send the current Config in the response to this message. + * + * @generated from field: meshtastic.ModuleConfig get_module_config_response = 8; + */ + value: ModuleConfig; + case: "getModuleConfigResponse"; + } | { + /** + * + * Get the Canned Message Module messages in the response to this message. + * + * @generated from field: bool get_canned_message_module_messages_request = 10; + */ + value: boolean; + case: "getCannedMessageModuleMessagesRequest"; + } | { + /** + * + * Get the Canned Message Module messages in the response to this message. + * + * @generated from field: string get_canned_message_module_messages_response = 11; + */ + value: string; + case: "getCannedMessageModuleMessagesResponse"; + } | { + /** + * + * Request the node to send device metadata (firmware, protobuf version, etc) + * + * @generated from field: bool get_device_metadata_request = 12; + */ + value: boolean; + case: "getDeviceMetadataRequest"; + } | { + /** + * + * Device metadata response + * + * @generated from field: meshtastic.DeviceMetadata get_device_metadata_response = 13; + */ + value: DeviceMetadata; + case: "getDeviceMetadataResponse"; + } | { + /** + * + * Get the Ringtone in the response to this message. + * + * @generated from field: bool get_ringtone_request = 14; + */ + value: boolean; + case: "getRingtoneRequest"; + } | { + /** + * + * Get the Ringtone in the response to this message. + * + * @generated from field: string get_ringtone_response = 15; + */ + value: string; + case: "getRingtoneResponse"; + } | { + /** + * + * Request the node to send it's connection status + * + * @generated from field: bool get_device_connection_status_request = 16; + */ + value: boolean; + case: "getDeviceConnectionStatusRequest"; + } | { + /** + * + * Device connection status response + * + * @generated from field: meshtastic.DeviceConnectionStatus get_device_connection_status_response = 17; + */ + value: DeviceConnectionStatus; + case: "getDeviceConnectionStatusResponse"; + } | { + /** + * + * Setup a node for licensed amateur (ham) radio operation + * + * @generated from field: meshtastic.HamParameters set_ham_mode = 18; + */ + value: HamParameters; + case: "setHamMode"; + } | { + /** + * + * Get the mesh's nodes with their available gpio pins for RemoteHardware module use + * + * @generated from field: bool get_node_remote_hardware_pins_request = 19; + */ + value: boolean; + case: "getNodeRemoteHardwarePinsRequest"; + } | { + /** + * + * Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use + * + * @generated from field: meshtastic.NodeRemoteHardwarePinsResponse get_node_remote_hardware_pins_response = 20; + */ + value: NodeRemoteHardwarePinsResponse; + case: "getNodeRemoteHardwarePinsResponse"; + } | { + /** + * + * Enter (UF2) DFU mode + * Only implemented on NRF52 currently + * + * @generated from field: bool enter_dfu_mode_request = 21; + */ + value: boolean; + case: "enterDfuModeRequest"; + } | { + /** + * + * Delete the file by the specified path from the device + * + * @generated from field: string delete_file_request = 22; + */ + value: string; + case: "deleteFileRequest"; + } | { + /** + * + * Set zero and offset for scale chips + * + * @generated from field: uint32 set_scale = 23; + */ + value: number; + case: "setScale"; + } | { + /** + * + * Backup the node's preferences + * + * @generated from field: meshtastic.AdminMessage.BackupLocation backup_preferences = 24; + */ + value: AdminMessage_BackupLocation; + case: "backupPreferences"; + } | { + /** + * + * Restore the node's preferences + * + * @generated from field: meshtastic.AdminMessage.BackupLocation restore_preferences = 25; + */ + value: AdminMessage_BackupLocation; + case: "restorePreferences"; + } | { + /** + * + * Remove backups of the node's preferences + * + * @generated from field: meshtastic.AdminMessage.BackupLocation remove_backup_preferences = 26; + */ + value: AdminMessage_BackupLocation; + case: "removeBackupPreferences"; + } | { + /** + * + * Send an input event to the node. + * This is used to trigger physical input events like button presses, touch events, etc. + * + * @generated from field: meshtastic.AdminMessage.InputEvent send_input_event = 27; + */ + value: AdminMessage_InputEvent; + case: "sendInputEvent"; + } | { + /** + * + * Set the owner for this node + * + * @generated from field: meshtastic.User set_owner = 32; + */ + value: User; + case: "setOwner"; + } | { + /** + * + * Set channels (using the new API). + * A special channel is the "primary channel". + * The other records are secondary channels. + * Note: only one channel can be marked as primary. + * If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically. + * + * @generated from field: meshtastic.Channel set_channel = 33; + */ + value: Channel; + case: "setChannel"; + } | { + /** + * + * Set the current Config + * + * @generated from field: meshtastic.Config set_config = 34; + */ + value: Config; + case: "setConfig"; + } | { + /** + * + * Set the current Config + * + * @generated from field: meshtastic.ModuleConfig set_module_config = 35; + */ + value: ModuleConfig; + case: "setModuleConfig"; + } | { + /** + * + * Set the Canned Message Module messages text. + * + * @generated from field: string set_canned_message_module_messages = 36; + */ + value: string; + case: "setCannedMessageModuleMessages"; + } | { + /** + * + * Set the ringtone for ExternalNotification. + * + * @generated from field: string set_ringtone_message = 37; + */ + value: string; + case: "setRingtoneMessage"; + } | { + /** + * + * Remove the node by the specified node-num from the NodeDB on the device + * + * @generated from field: uint32 remove_by_nodenum = 38; + */ + value: number; + case: "removeByNodenum"; + } | { + /** + * + * Set specified node-num to be favorited on the NodeDB on the device + * + * @generated from field: uint32 set_favorite_node = 39; + */ + value: number; + case: "setFavoriteNode"; + } | { + /** + * + * Set specified node-num to be un-favorited on the NodeDB on the device + * + * @generated from field: uint32 remove_favorite_node = 40; + */ + value: number; + case: "removeFavoriteNode"; + } | { + /** + * + * Set fixed position data on the node and then set the position.fixed_position = true + * + * @generated from field: meshtastic.Position set_fixed_position = 41; + */ + value: Position; + case: "setFixedPosition"; + } | { + /** + * + * Clear fixed position coordinates and then set position.fixed_position = false + * + * @generated from field: bool remove_fixed_position = 42; + */ + value: boolean; + case: "removeFixedPosition"; + } | { + /** + * + * Set time only on the node + * Convenience method to set the time on the node (as Net quality) without any other position data + * + * @generated from field: fixed32 set_time_only = 43; + */ + value: number; + case: "setTimeOnly"; + } | { + /** + * + * Tell the node to send the stored ui data. + * + * @generated from field: bool get_ui_config_request = 44; + */ + value: boolean; + case: "getUiConfigRequest"; + } | { + /** + * + * Reply stored device ui data. + * + * @generated from field: meshtastic.DeviceUIConfig get_ui_config_response = 45; + */ + value: DeviceUIConfig; + case: "getUiConfigResponse"; + } | { + /** + * + * Tell the node to store UI data persistently. + * + * @generated from field: meshtastic.DeviceUIConfig store_ui_config = 46; + */ + value: DeviceUIConfig; + case: "storeUiConfig"; + } | { + /** + * + * Set specified node-num to be ignored on the NodeDB on the device + * + * @generated from field: uint32 set_ignored_node = 47; + */ + value: number; + case: "setIgnoredNode"; + } | { + /** + * + * Set specified node-num to be un-ignored on the NodeDB on the device + * + * @generated from field: uint32 remove_ignored_node = 48; + */ + value: number; + case: "removeIgnoredNode"; + } | { + /** + * + * Set specified node-num to be muted + * + * @generated from field: uint32 toggle_muted_node = 49; + */ + value: number; + case: "toggleMutedNode"; + } | { + /** + * + * Begins an edit transaction for config, module config, owner, and channel settings changes + * This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings) + * + * @generated from field: bool begin_edit_settings = 64; + */ + value: boolean; + case: "beginEditSettings"; + } | { + /** + * + * Commits an open transaction for any edits made to config, module config, owner, and channel settings + * + * @generated from field: bool commit_edit_settings = 65; + */ + value: boolean; + case: "commitEditSettings"; + } | { + /** + * + * Add a contact (User) to the nodedb + * + * @generated from field: meshtastic.SharedContact add_contact = 66; + */ + value: SharedContact; + case: "addContact"; + } | { + /** + * + * Initiate or respond to a key verification request + * + * @generated from field: meshtastic.KeyVerificationAdmin key_verification = 67; + */ + value: KeyVerificationAdmin; + case: "keyVerification"; + } | { + /** + * + * Tell the node to factory reset config everything; all device state and configuration will be returned to factory defaults and BLE bonds will be cleared. + * + * @generated from field: int32 factory_reset_device = 94; + */ + value: number; + case: "factoryResetDevice"; + } | { + /** + * + * Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot) + * Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth. + * Deprecated in favor of reboot_ota_mode in 2.7.17 + * + * @generated from field: int32 reboot_ota_seconds = 95 [deprecated = true]; + * @deprecated + */ + value: number; + case: "rebootOtaSeconds"; + } | { + /** + * + * This message is only supported for the simulator Portduino build. + * If received the simulator will exit successfully. + * + * @generated from field: bool exit_simulator = 96; + */ + value: boolean; + case: "exitSimulator"; + } | { + /** + * + * Tell the node to reboot in this many seconds (or <0 to cancel reboot) + * + * @generated from field: int32 reboot_seconds = 97; + */ + value: number; + case: "rebootSeconds"; + } | { + /** + * + * Tell the node to shutdown in this many seconds (or <0 to cancel shutdown) + * + * @generated from field: int32 shutdown_seconds = 98; + */ + value: number; + case: "shutdownSeconds"; + } | { + /** + * + * Tell the node to factory reset config; all device state and configuration will be returned to factory defaults; BLE bonds will be preserved. + * + * @generated from field: int32 factory_reset_config = 99; + */ + value: number; + case: "factoryResetConfig"; + } | { + /** + * + * Tell the node to reset the nodedb. + * When true, favorites are preserved through reset. + * + * @generated from field: bool nodedb_reset = 100; + */ + value: boolean; + case: "nodedbReset"; + } | { + /** + * + * Tell the node to reset into the OTA Loader + * + * @generated from field: meshtastic.AdminMessage.OTAEvent ota_request = 102; + */ + value: AdminMessage_OTAEvent; + case: "otaRequest"; + } | { + /** + * + * Parameters and sensor configuration + * + * @generated from field: meshtastic.SensorConfig sensor_config = 103; + */ + value: SensorConfig; + case: "sensorConfig"; + } | { + /** + * + * Lockdown passphrase delivery / unlock / lock-now command for hardened + * firmware builds (see MESHTASTIC_LOCKDOWN). Used to provision the + * passphrase on first boot, unlock encrypted storage on subsequent + * reboots, re-verify on already-unlocked devices to authorize a new + * client connection, or immediately re-lock the device. + * + * Replaces the earlier scheme that repurposed SecurityConfig.private_key + * to carry passphrase bytes; that hack is retired. + * + * @generated from field: meshtastic.LockdownAuth lockdown_auth = 104; + */ + value: LockdownAuth; + case: "lockdownAuth"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.AdminMessage. + * Use `create(AdminMessageSchema)` to create a new message. + */ +export const AdminMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 0); + +/** + * + * Input event message to be sent to the node. + * + * @generated from message meshtastic.AdminMessage.InputEvent + */ +export type AdminMessage_InputEvent = Message<"meshtastic.AdminMessage.InputEvent"> & { + /** + * + * The input event code + * + * @generated from field: uint32 event_code = 1; + */ + eventCode: number; + + /** + * + * Keyboard character code + * + * @generated from field: uint32 kb_char = 2; + */ + kbChar: number; + + /** + * + * The touch X coordinate + * + * @generated from field: uint32 touch_x = 3; + */ + touchX: number; + + /** + * + * The touch Y coordinate + * + * @generated from field: uint32 touch_y = 4; + */ + touchY: number; +}; + +/** + * Describes the message meshtastic.AdminMessage.InputEvent. + * Use `create(AdminMessage_InputEventSchema)` to create a new message. + */ +export const AdminMessage_InputEventSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 0, 0); + +/** + * + * User is requesting an over the air update. + * Node will reboot into the OTA loader + * + * @generated from message meshtastic.AdminMessage.OTAEvent + */ +export type AdminMessage_OTAEvent = Message<"meshtastic.AdminMessage.OTAEvent"> & { + /** + * + * Tell the node to reboot into OTA mode for firmware update via BLE or WiFi (ESP32 only for now) + * + * @generated from field: meshtastic.OTAMode reboot_ota_mode = 1; + */ + rebootOtaMode: OTAMode; + + /** + * + * A 32 byte hash of the OTA firmware. + * Used to verify the integrity of the firmware before applying an update. + * + * @generated from field: bytes ota_hash = 2; + */ + otaHash: Uint8Array; +}; + +/** + * Describes the message meshtastic.AdminMessage.OTAEvent. + * Use `create(AdminMessage_OTAEventSchema)` to create a new message. + */ +export const AdminMessage_OTAEventSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 0, 1); + +/** + * + * TODO: REPLACE + * + * @generated from enum meshtastic.AdminMessage.ConfigType + */ +export enum AdminMessage_ConfigType { + /** + * + * TODO: REPLACE + * + * @generated from enum value: DEVICE_CONFIG = 0; + */ + DEVICE_CONFIG = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: POSITION_CONFIG = 1; + */ + POSITION_CONFIG = 1, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: POWER_CONFIG = 2; + */ + POWER_CONFIG = 2, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: NETWORK_CONFIG = 3; + */ + NETWORK_CONFIG = 3, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: DISPLAY_CONFIG = 4; + */ + DISPLAY_CONFIG = 4, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: LORA_CONFIG = 5; + */ + LORA_CONFIG = 5, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: BLUETOOTH_CONFIG = 6; + */ + BLUETOOTH_CONFIG = 6, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: SECURITY_CONFIG = 7; + */ + SECURITY_CONFIG = 7, + + /** + * + * Session key config + * + * @generated from enum value: SESSIONKEY_CONFIG = 8; + */ + SESSIONKEY_CONFIG = 8, + + /** + * + * device-ui config + * + * @generated from enum value: DEVICEUI_CONFIG = 9; + */ + DEVICEUI_CONFIG = 9, +} + +/** + * Describes the enum meshtastic.AdminMessage.ConfigType. + */ +export const AdminMessage_ConfigTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_admin, 0, 0); + +/** + * + * TODO: REPLACE + * + * @generated from enum meshtastic.AdminMessage.ModuleConfigType + */ +export enum AdminMessage_ModuleConfigType { + /** + * + * TODO: REPLACE + * + * @generated from enum value: MQTT_CONFIG = 0; + */ + MQTT_CONFIG = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: SERIAL_CONFIG = 1; + */ + SERIAL_CONFIG = 1, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: EXTNOTIF_CONFIG = 2; + */ + EXTNOTIF_CONFIG = 2, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: STOREFORWARD_CONFIG = 3; + */ + STOREFORWARD_CONFIG = 3, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: RANGETEST_CONFIG = 4; + */ + RANGETEST_CONFIG = 4, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TELEMETRY_CONFIG = 5; + */ + TELEMETRY_CONFIG = 5, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: CANNEDMSG_CONFIG = 6; + */ + CANNEDMSG_CONFIG = 6, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: AUDIO_CONFIG = 7; + */ + AUDIO_CONFIG = 7, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: REMOTEHARDWARE_CONFIG = 8; + */ + REMOTEHARDWARE_CONFIG = 8, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: NEIGHBORINFO_CONFIG = 9; + */ + NEIGHBORINFO_CONFIG = 9, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: AMBIENTLIGHTING_CONFIG = 10; + */ + AMBIENTLIGHTING_CONFIG = 10, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: DETECTIONSENSOR_CONFIG = 11; + */ + DETECTIONSENSOR_CONFIG = 11, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: PAXCOUNTER_CONFIG = 12; + */ + PAXCOUNTER_CONFIG = 12, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: STATUSMESSAGE_CONFIG = 13; + */ + STATUSMESSAGE_CONFIG = 13, + + /** + * + * Traffic management module config + * + * @generated from enum value: TRAFFICMANAGEMENT_CONFIG = 14; + */ + TRAFFICMANAGEMENT_CONFIG = 14, + + /** + * + * TAK module config + * + * @generated from enum value: TAK_CONFIG = 15; + */ + TAK_CONFIG = 15, +} + +/** + * Describes the enum meshtastic.AdminMessage.ModuleConfigType. + */ +export const AdminMessage_ModuleConfigTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_admin, 0, 1); + +/** + * @generated from enum meshtastic.AdminMessage.BackupLocation + */ +export enum AdminMessage_BackupLocation { + /** + * + * Backup to the internal flash + * + * @generated from enum value: FLASH = 0; + */ + FLASH = 0, + + /** + * + * Backup to the SD card + * + * @generated from enum value: SD = 1; + */ + SD = 1, +} + +/** + * Describes the enum meshtastic.AdminMessage.BackupLocation. + */ +export const AdminMessage_BackupLocationSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_admin, 0, 2); + +/** + * + * Lockdown passphrase delivery payload. + * + * One message handles three operations distinguished by content: + * - Provision (first-time): passphrase set, lock_now=false. Firmware + * generates DEK, wraps with passphrase-derived KEK, persists. + * - Unlock: passphrase set, lock_now=false. Firmware verifies + * passphrase against stored DEK, unlocks storage, authorizes the + * connection that delivered this packet. + * - Lock now: lock_now=true, passphrase ignored. Firmware revokes + * all client auth and reboots into the locked state. + * + * Firmware decides between provision and unlock based on its own state + * (whether a DEK file already exists). Clients do not need to track + * which case applies. + * + * @generated from message meshtastic.LockdownAuth + */ +export type LockdownAuth = Message<"meshtastic.LockdownAuth"> & { + /** + * + * Passphrase bytes (1-32). Empty when lock_now is true. + * Capped to 32 to match the proto cap on related security fields. + * + * @generated from field: bytes passphrase = 1; + */ + passphrase: Uint8Array; + + /** + * + * Optional override of the boot-count token TTL granted on success. + * 0 = use firmware default (TOKEN_DEFAULT_BOOTS). + * On reboot the firmware decrements this; when it reaches 0 the + * device boots fully locked and requires a fresh passphrase. + * + * @generated from field: uint32 boots_remaining = 2; + */ + bootsRemaining: number; + + /** + * + * Optional wall-clock expiry for the unlock token, as absolute + * Unix-epoch seconds. 0 = no time limit (only the boot-count TTL + * applies). On boot, if the device RTC is set and now > this value, + * the token is treated as expired. + * + * @generated from field: uint32 valid_until_epoch = 3; + */ + validUntilEpoch: number; + + /** + * + * If true, ignore passphrase fields, immediately revoke all + * connection-level admin authorization, and reboot the device into + * the locked state. Always honoured regardless of current lock state. + * + * @generated from field: bool lock_now = 4; + */ + lockNow: boolean; + + /** + * + * Optional per-boot uptime cap on the unlocked session, in seconds. + * 0 = unlimited (token-only enforcement, suitable for unattended + * tower / infrastructure nodes). + * + * When non-zero, the firmware arms an uptime timer at unlock. On + * each expiry, while there is still boot-count budget, the firmware + * decrements the on-flash boot count in place, revokes per- + * connection admin auth (clients must re-authenticate to see + * content), re-engages the screen lock, and re-arms the timer + * without rebooting. Mesh routing keeps running across session + * boundaries; only when the boot-count budget reaches zero does + * the device hard-lock and reboot. + * + * Total exposure ceiling = ((resolved boot count) + 1) * max_session_seconds. + * The +1 accounts for the initial passphrase-unlocked session + * itself, since boots_remaining is the number of subsequent + * session rolls (each consuming one boot from the rollback ledger). + * The resolved boot count is the value the firmware writes into the + * token at unlock time: the client-supplied boots_remaining when + * non-zero, otherwise the firmware default (TOKEN_DEFAULT_BOOTS). + * Note that boots_remaining == 0 in this message means "use firmware + * default", NOT "zero boots" — a client computing the ceiling for + * display should mirror that resolution rather than multiplying the + * raw request value. + * + * The cap is persisted in the token, so it survives token-based + * auto-unlock across reboots. Explicit operator Lock Now still + * deletes the token and forces passphrase re-entry. + * + * Uses millis() (CPU uptime), not wall-clock time, so the cap is + * immune to GPS spoofing, RTC backup-battery removal, and Faraday + * cage isolation — none of those move the uptime counter. The only + * way to reset the session clock is a reboot, which costs a boot + * from the on-flash, HMAC-bound counter. + * + * @generated from field: uint32 max_session_seconds = 5; + */ + maxSessionSeconds: number; + + /** + * + * Disable lockdown mode. Requires a valid passphrase in the same + * message (the device must prove the operator owns it before + * reverting at-rest encryption). On success the firmware decrypts + * every stored config / channel / nodedb file back to plaintext, + * removes the wrapped DEK, unlock token, monotonic-counter, and + * backoff files, and reboots out of lockdown. + * + * This is the inverse of the provision/unlock path: it is how the + * client app's "lockdown mode" toggle returns a device to normal + * operation. + * + * NOT reversed by this operation: APPROTECT. Once the debug port + * lockout has been burned (on silicon where it is effective) it is + * permanent — disabling lockdown decrypts your data and removes the + * access gates, but the SWD/JTAG port stays locked for the life of + * the device (recoverable only via a full chip erase over a debug + * probe, which destroys all data). Clients should make this + * irreversibility clear at the moment lockdown is first enabled. + * + * When true the passphrase field is still required; boots_remaining, + * valid_until_epoch, max_session_seconds, and lock_now are ignored. + * + * @generated from field: bool disable = 6; + */ + disable: boolean; +}; + +/** + * Describes the message meshtastic.LockdownAuth. + * Use `create(LockdownAuthSchema)` to create a new message. + */ +export const LockdownAuthSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 1); + +/** + * + * Parameters for setting up Meshtastic for ameteur radio usage + * + * @generated from message meshtastic.HamParameters + */ +export type HamParameters = Message<"meshtastic.HamParameters"> & { + /** + * + * Amateur radio call sign, eg. KD2ABC + * + * @generated from field: string call_sign = 1; + */ + callSign: string; + + /** + * + * Transmit power in dBm at the LoRA transceiver, not including any amplification + * + * @generated from field: int32 tx_power = 2; + */ + txPower: number; + + /** + * + * The selected frequency of LoRA operation + * Please respect your local laws, regulations, and band plans. + * Ensure your radio is capable of operating of the selected frequency before setting this. + * + * @generated from field: float frequency = 3; + */ + frequency: number; + + /** + * + * Optional short name of user + * + * @generated from field: string short_name = 4; + */ + shortName: string; + + /** + * + * Optional long name of user + * Appended to callsign + * + * @generated from field: string long_name = 5; + */ + longName: string; +}; + +/** + * Describes the message meshtastic.HamParameters. + * Use `create(HamParametersSchema)` to create a new message. + */ +export const HamParametersSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 2); + +/** + * + * Response envelope for node_remote_hardware_pins + * + * @generated from message meshtastic.NodeRemoteHardwarePinsResponse + */ +export type NodeRemoteHardwarePinsResponse = Message<"meshtastic.NodeRemoteHardwarePinsResponse"> & { + /** + * + * Nodes and their respective remote hardware GPIO pins + * + * @generated from field: repeated meshtastic.NodeRemoteHardwarePin node_remote_hardware_pins = 1; + */ + nodeRemoteHardwarePins: NodeRemoteHardwarePin[]; +}; + +/** + * Describes the message meshtastic.NodeRemoteHardwarePinsResponse. + * Use `create(NodeRemoteHardwarePinsResponseSchema)` to create a new message. + */ +export const NodeRemoteHardwarePinsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 3); + +/** + * @generated from message meshtastic.SharedContact + */ +export type SharedContact = Message<"meshtastic.SharedContact"> & { + /** + * + * The node number of the contact + * + * @generated from field: uint32 node_num = 1; + */ + nodeNum: number; + + /** + * + * The User of the contact + * + * @generated from field: meshtastic.User user = 2; + */ + user?: User | undefined; + + /** + * + * Add this contact to the blocked / ignored list + * + * @generated from field: bool should_ignore = 3; + */ + shouldIgnore: boolean; + + /** + * + * Set the IS_KEY_MANUALLY_VERIFIED bit + * + * @generated from field: bool manually_verified = 4; + */ + manuallyVerified: boolean; +}; + +/** + * Describes the message meshtastic.SharedContact. + * Use `create(SharedContactSchema)` to create a new message. + */ +export const SharedContactSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 4); + +/** + * + * This message is used by a client to initiate or complete a key verification + * + * @generated from message meshtastic.KeyVerificationAdmin + */ +export type KeyVerificationAdmin = Message<"meshtastic.KeyVerificationAdmin"> & { + /** + * @generated from field: meshtastic.KeyVerificationAdmin.MessageType message_type = 1; + */ + messageType: KeyVerificationAdmin_MessageType; + + /** + * + * The nodenum we're requesting + * + * @generated from field: uint32 remote_nodenum = 2; + */ + remoteNodenum: number; + + /** + * + * The nonce is used to track the connection + * + * @generated from field: uint64 nonce = 3; + */ + nonce: bigint; + + /** + * + * The 4 digit code generated by the remote node, and communicated outside the mesh + * + * @generated from field: optional uint32 security_number = 4; + */ + securityNumber?: number | undefined; +}; + +/** + * Describes the message meshtastic.KeyVerificationAdmin. + * Use `create(KeyVerificationAdminSchema)` to create a new message. + */ +export const KeyVerificationAdminSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 5); + +/** + * + * Three stages of this request. + * + * @generated from enum meshtastic.KeyVerificationAdmin.MessageType + */ +export enum KeyVerificationAdmin_MessageType { + /** + * + * This is the first stage, where a client initiates + * + * @generated from enum value: INITIATE_VERIFICATION = 0; + */ + INITIATE_VERIFICATION = 0, + + /** + * + * After the nonce has been returned over the mesh, the client prompts for the security number + * And uses this message to provide it to the node. + * + * @generated from enum value: PROVIDE_SECURITY_NUMBER = 1; + */ + PROVIDE_SECURITY_NUMBER = 1, + + /** + * + * Once the user has compared the verification message, this message notifies the node. + * + * @generated from enum value: DO_VERIFY = 2; + */ + DO_VERIFY = 2, + + /** + * + * This is the cancel path, can be taken at any point + * + * @generated from enum value: DO_NOT_VERIFY = 3; + */ + DO_NOT_VERIFY = 3, +} + +/** + * Describes the enum meshtastic.KeyVerificationAdmin.MessageType. + */ +export const KeyVerificationAdmin_MessageTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_admin, 5, 0); + +/** + * @generated from message meshtastic.SensorConfig + */ +export type SensorConfig = Message<"meshtastic.SensorConfig"> & { + /** + * + * SCD4X CO2 Sensor configuration + * + * @generated from field: meshtastic.SCD4X_config scd4x_config = 1; + */ + scd4xConfig?: SCD4X_config | undefined; + + /** + * + * SEN5X PM Sensor configuration + * + * @generated from field: meshtastic.SEN5X_config sen5x_config = 2; + */ + sen5xConfig?: SEN5X_config | undefined; + + /** + * + * SCD30 CO2 Sensor configuration + * + * @generated from field: meshtastic.SCD30_config scd30_config = 3; + */ + scd30Config?: SCD30_config | undefined; + + /** + * + * SHTXX temperature and relative humidity sensor configuration + * + * @generated from field: meshtastic.SHTXX_config shtxx_config = 4; + */ + shtxxConfig?: SHTXX_config | undefined; +}; + +/** + * Describes the message meshtastic.SensorConfig. + * Use `create(SensorConfigSchema)` to create a new message. + */ +export const SensorConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 6); + +/** + * @generated from message meshtastic.SCD4X_config + */ +export type SCD4X_config = Message<"meshtastic.SCD4X_config"> & { + /** + * + * Set Automatic self-calibration enabled + * + * @generated from field: optional bool set_asc = 1; + */ + setAsc?: boolean | undefined; + + /** + * + * Recalibration target CO2 concentration in ppm (FRC or ASC) + * + * @generated from field: optional uint32 set_target_co2_conc = 2; + */ + setTargetCo2Conc?: number | undefined; + + /** + * + * Reference temperature in degC + * + * @generated from field: optional float set_temperature = 3; + */ + setTemperature?: number | undefined; + + /** + * + * Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) + * + * @generated from field: optional uint32 set_altitude = 4; + */ + setAltitude?: number | undefined; + + /** + * + * Sensor ambient pressure in Pa. 70000 - 120000 Pa (overrides altitude) + * + * @generated from field: optional uint32 set_ambient_pressure = 5; + */ + setAmbientPressure?: number | undefined; + + /** + * + * Perform a factory reset of the sensor + * + * @generated from field: optional bool factory_reset = 6; + */ + factoryReset?: boolean | undefined; + + /** + * + * Power mode for sensor (true for low power, false for normal) + * + * @generated from field: optional bool set_power_mode = 7; + */ + setPowerMode?: boolean | undefined; +}; + +/** + * Describes the message meshtastic.SCD4X_config. + * Use `create(SCD4X_configSchema)` to create a new message. + */ +export const SCD4X_configSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 7); + +/** + * @generated from message meshtastic.SEN5X_config + */ +export type SEN5X_config = Message<"meshtastic.SEN5X_config"> & { + /** + * + * Reference temperature in degC + * + * @generated from field: optional float set_temperature = 1; + */ + setTemperature?: number | undefined; + + /** + * + * One-shot mode (true for low power - one-shot mode, false for normal - continuous mode) + * + * @generated from field: optional bool set_one_shot_mode = 2; + */ + setOneShotMode?: boolean | undefined; +}; + +/** + * Describes the message meshtastic.SEN5X_config. + * Use `create(SEN5X_configSchema)` to create a new message. + */ +export const SEN5X_configSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 8); + +/** + * @generated from message meshtastic.SCD30_config + */ +export type SCD30_config = Message<"meshtastic.SCD30_config"> & { + /** + * + * Set Automatic self-calibration enabled + * + * @generated from field: optional bool set_asc = 1; + */ + setAsc?: boolean | undefined; + + /** + * + * Recalibration target CO2 concentration in ppm (FRC or ASC) + * + * @generated from field: optional uint32 set_target_co2_conc = 2; + */ + setTargetCo2Conc?: number | undefined; + + /** + * + * Reference temperature in degC + * + * @generated from field: optional float set_temperature = 3; + */ + setTemperature?: number | undefined; + + /** + * + * Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) + * + * @generated from field: optional uint32 set_altitude = 4; + */ + setAltitude?: number | undefined; + + /** + * + * Power mode for sensor (true for low power, false for normal) + * + * @generated from field: optional uint32 set_measurement_interval = 5; + */ + setMeasurementInterval?: number | undefined; + + /** + * + * Perform a factory reset of the sensor + * + * @generated from field: optional bool soft_reset = 6; + */ + softReset?: boolean | undefined; +}; + +/** + * Describes the message meshtastic.SCD30_config. + * Use `create(SCD30_configSchema)` to create a new message. + */ +export const SCD30_configSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 9); + +/** + * @generated from message meshtastic.SHTXX_config + */ +export type SHTXX_config = Message<"meshtastic.SHTXX_config"> & { + /** + * + * Accuracy mode (0 = low, 1 = medium, 2 = high) + * + * @generated from field: optional uint32 set_accuracy = 1; + */ + setAccuracy?: number | undefined; +}; + +/** + * Describes the message meshtastic.SHTXX_config. + * Use `create(SHTXX_configSchema)` to create a new message. + */ +export const SHTXX_configSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_admin, 10); + +/** + * + * Firmware update mode for OTA updates + * + * @generated from enum meshtastic.OTAMode + */ +export enum OTAMode { + /** + * + * Do not reboot into OTA mode + * + * @generated from enum value: NO_REBOOT_OTA = 0; + */ + NO_REBOOT_OTA = 0, + + /** + * + * Reboot into OTA mode for BLE firmware update + * + * @generated from enum value: OTA_BLE = 1; + */ + OTA_BLE = 1, + + /** + * + * Reboot into OTA mode for WiFi firmware update + * + * @generated from enum value: OTA_WIFI = 2; + */ + OTA_WIFI = 2, +} + +/** + * Describes the enum meshtastic.OTAMode. + */ +export const OTAModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_admin, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/apponly_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/apponly_pb.ts new file mode 100644 index 00000000..2b3aee64 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/apponly_pb.ts @@ -0,0 +1,53 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/apponly.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { ChannelSettings } from "./channel_pb"; +import { file_meshtastic_channel } from "./channel_pb"; +import type { Config_LoRaConfig } from "./config_pb"; +import { file_meshtastic_config } from "./config_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/apponly.proto. + */ +export const file_meshtastic_apponly: GenFile = /*@__PURE__*/ + fileDesc("ChhtZXNodGFzdGljL2FwcG9ubHkucHJvdG8SCm1lc2h0YXN0aWMibwoKQ2hhbm5lbFNldBItCghzZXR0aW5ncxgBIAMoCzIbLm1lc2h0YXN0aWMuQ2hhbm5lbFNldHRpbmdzEjIKC2xvcmFfY29uZmlnGAIgASgLMh0ubWVzaHRhc3RpYy5Db25maWcuTG9SYUNvbmZpZ0JjChRvcmcubWVzaHRhc3RpYy5wcm90b0INQXBwT25seVByb3Rvc1oiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZKoCFE1lc2h0YXN0aWMuUHJvdG9idWZzugIAYgZwcm90bzM", [file_meshtastic_channel, file_meshtastic_config]); + +/** + * + * This is the most compact possible representation for a set of channels. + * It includes only one PRIMARY channel (which must be first) and + * any SECONDARY channels. + * No DISABLED channels are included. + * This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL + * + * @generated from message meshtastic.ChannelSet + */ +export type ChannelSet = Message<"meshtastic.ChannelSet"> & { + /** + * + * Channel list with settings + * + * @generated from field: repeated meshtastic.ChannelSettings settings = 1; + */ + settings: ChannelSettings[]; + + /** + * + * LoRa config + * + * @generated from field: meshtastic.Config.LoRaConfig lora_config = 2; + */ + loraConfig?: Config_LoRaConfig | undefined; +}; + +/** + * Describes the message meshtastic.ChannelSet. + * Use `create(ChannelSetSchema)` to create a new message. + */ +export const ChannelSetSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_apponly, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/atak_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/atak_pb.ts new file mode 100644 index 00000000..b27b15b1 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/atak_pb.ts @@ -0,0 +1,4216 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/atak.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +// trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH) + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/atak.proto. + */ +export const file_meshtastic_atak: GenFile = /*@__PURE__*/ + fileDesc("ChVtZXNodGFzdGljL2F0YWsucHJvdG8SCm1lc2h0YXN0aWMi+AEKCVRBS1BhY2tldBIVCg1pc19jb21wcmVzc2VkGAEgASgIEiQKB2NvbnRhY3QYAiABKAsyEy5tZXNodGFzdGljLkNvbnRhY3QSIAoFZ3JvdXAYAyABKAsyES5tZXNodGFzdGljLkdyb3VwEiIKBnN0YXR1cxgEIAEoCzISLm1lc2h0YXN0aWMuU3RhdHVzEh4KA3BsaRgFIAEoCzIPLm1lc2h0YXN0aWMuUExJSAASIwoEY2hhdBgGIAEoCzITLm1lc2h0YXN0aWMuR2VvQ2hhdEgAEhAKBmRldGFpbBgHIAEoDEgAQhEKD3BheWxvYWRfdmFyaWFudCL0AgoHR2VvQ2hhdBIPCgdtZXNzYWdlGAEgASgJEg8KAnRvGAIgASgJSACIAQESGAoLdG9fY2FsbHNpZ24YAyABKAlIAYgBARIXCg9yZWNlaXB0X2Zvcl91aWQYBCABKAkSNQoMcmVjZWlwdF90eXBlGAUgASgOMh8ubWVzaHRhc3RpYy5HZW9DaGF0LlJlY2VpcHRUeXBlEhEKBGxhbmcYBiABKAlIAogBARIUCgdyb29tX2lkGAcgASgJSAOIAQESHQoQdm9pY2VfcHJvZmlsZV9pZBgIIAEoCUgEiAEBIlQKC1JlY2VpcHRUeXBlEhQKEFJlY2VpcHRUeXBlX05vbmUQABIZChVSZWNlaXB0VHlwZV9EZWxpdmVyZWQQARIUChBSZWNlaXB0VHlwZV9SZWFkEAJCBQoDX3RvQg4KDF90b19jYWxsc2lnbkIHCgVfbGFuZ0IKCghfcm9vbV9pZEITChFfdm9pY2VfcHJvZmlsZV9pZCJNCgVHcm91cBIkCgRyb2xlGAEgASgOMhYubWVzaHRhc3RpYy5NZW1iZXJSb2xlEh4KBHRlYW0YAiABKA4yEC5tZXNodGFzdGljLlRlYW0iGQoGU3RhdHVzEg8KB2JhdHRlcnkYASABKA0iNAoHQ29udGFjdBIQCghjYWxsc2lnbhgBIAEoCRIXCg9kZXZpY2VfY2FsbHNpZ24YAiABKAkiXwoDUExJEhIKCmxhdGl0dWRlX2kYASABKA8SEwoLbG9uZ2l0dWRlX2kYAiABKA8SEAoIYWx0aXR1ZGUYAyABKAUSDQoFc3BlZWQYBCABKA0SDgoGY291cnNlGAUgASgNIrABCg1BaXJjcmFmdFRyYWNrEgwKBGljYW8YASABKAkSFAoMcmVnaXN0cmF0aW9uGAIgASgJEg4KBmZsaWdodBgDIAEoCRIVCg1haXJjcmFmdF90eXBlGAQgASgJEg4KBnNxdWF3axgFIAEoDRIQCghjYXRlZ29yeRgGIAEoCRIQCghyc3NpX3gxMBgHIAEoERILCgNncHMYCCABKAgSEwoLY290X2hvc3RfaWQYCSABKAkiNwoLQ290R2VvUG9pbnQSEwoLbGF0X2RlbHRhX2kYASABKBESEwoLbG9uX2RlbHRhX2kYAiABKBEi3AYKCkRyYXduU2hhcGUSKQoEa2luZBgBIAEoDjIbLm1lc2h0YXN0aWMuRHJhd25TaGFwZS5LaW5kEi8KBXN0eWxlGAIgASgOMiAubWVzaHRhc3RpYy5EcmF3blNoYXBlLlN0eWxlTW9kZRIQCghtYWpvcl9jbRgDIAEoDRIQCghtaW5vcl9jbRgEIAEoDRIRCglhbmdsZV9kZWcYBSABKA0SJgoMc3Ryb2tlX2NvbG9yGAYgASgOMhAubWVzaHRhc3RpYy5UZWFtEhMKC3N0cm9rZV9hcmdiGAcgASgHEhkKEXN0cm9rZV93ZWlnaHRfeDEwGAggASgNEiQKCmZpbGxfY29sb3IYCSABKA4yEC5tZXNodGFzdGljLlRlYW0SEQoJZmlsbF9hcmdiGAogASgHEhEKCWxhYmVsc19vbhgLIAEoCBIZChF2ZXJ0ZXhfbGF0X2RlbHRhcxgSIAMoERIZChF2ZXJ0ZXhfbG9uX2RlbHRhcxgTIAMoERIRCgl0cnVuY2F0ZWQYDSABKAgSHAoUYnVsbHNleWVfZGlzdGFuY2VfZG0YDiABKA0SHAoUYnVsbHNleWVfYmVhcmluZ19yZWYYDyABKA0SFgoOYnVsbHNleWVfZmxhZ3MYECABKA0SGAoQYnVsbHNleWVfdWlkX3JlZhgRIAEoCSLiAQoES2luZBIUChBLaW5kX1Vuc3BlY2lmaWVkEAASDwoLS2luZF9DaXJjbGUQARISCg5LaW5kX1JlY3RhbmdsZRACEhEKDUtpbmRfRnJlZWZvcm0QAxIVChFLaW5kX1RlbGVzdHJhdGlvbhAEEhAKDEtpbmRfUG9seWdvbhAFEhYKEktpbmRfUmFuZ2luZ0NpcmNsZRAGEhEKDUtpbmRfQnVsbHNleWUQBxIQCgxLaW5kX0VsbGlwc2UQCBISCg5LaW5kX1ZlaGljbGUyRBAJEhIKDktpbmRfVmVoaWNsZTNEEAoidQoJU3R5bGVNb2RlEhkKFVN0eWxlTW9kZV9VbnNwZWNpZmllZBAAEhgKFFN0eWxlTW9kZV9TdHJva2VPbmx5EAESFgoSU3R5bGVNb2RlX0ZpbGxPbmx5EAISGwoXU3R5bGVNb2RlX1N0cm9rZUFuZEZpbGwQA0oECAwQDSLlAwoGTWFya2VyEiUKBGtpbmQYASABKA4yFy5tZXNodGFzdGljLk1hcmtlci5LaW5kEh8KBWNvbG9yGAIgASgOMhAubWVzaHRhc3RpYy5UZWFtEhIKCmNvbG9yX2FyZ2IYAyABKAcSEQoJcmVhZGluZXNzGAQgASgIEhIKCnBhcmVudF91aWQYBSABKAkSEwoLcGFyZW50X3R5cGUYBiABKAkSFwoPcGFyZW50X2NhbGxzaWduGAcgASgJEg8KB2ljb25zZXQYCCABKAkimAIKBEtpbmQSFAoQS2luZF9VbnNwZWNpZmllZBAAEg0KCUtpbmRfU3BvdBABEhEKDUtpbmRfV2F5cG9pbnQQAhITCg9LaW5kX0NoZWNrcG9pbnQQAxIVChFLaW5kX1NlbGZQb3NpdGlvbhAEEhMKD0tpbmRfU3ltYm9sMjUyNRAFEhAKDEtpbmRfU3BvdE1hcBAGEhMKD0tpbmRfQ3VzdG9tSWNvbhAHEhIKDktpbmRfR29Ub1BvaW50EAgSFQoRS2luZF9Jbml0aWFsUG9pbnQQCRIVChFLaW5kX0NvbnRhY3RQb2ludBAKEhgKFEtpbmRfT2JzZXJ2YXRpb25Qb3N0EAsSFAoQS2luZF9JbWFnZU1hcmtlchAMIs4BCg9SYW5nZUFuZEJlYXJpbmcSJwoGYW5jaG9yGAEgASgLMhcubWVzaHRhc3RpYy5Db3RHZW9Qb2ludBISCgphbmNob3JfdWlkGAIgASgJEhAKCHJhbmdlX2NtGAMgASgNEhQKDGJlYXJpbmdfY2RlZxgEIAEoDRImCgxzdHJva2VfY29sb3IYBSABKA4yEC5tZXNodGFzdGljLlRlYW0SEwoLc3Ryb2tlX2FyZ2IYBiABKAcSGQoRc3Ryb2tlX3dlaWdodF94MTAYByABKA0ihAQKBVJvdXRlEigKBm1ldGhvZBgBIAEoDjIYLm1lc2h0YXN0aWMuUm91dGUuTWV0aG9kEi4KCWRpcmVjdGlvbhgCIAEoDjIbLm1lc2h0YXN0aWMuUm91dGUuRGlyZWN0aW9uEg4KBnByZWZpeBgDIAEoCRIZChFzdHJva2Vfd2VpZ2h0X3gxMBgEIAEoDRIlCgVsaW5rcxgFIAMoCzIWLm1lc2h0YXN0aWMuUm91dGUuTGluaxIRCgl0cnVuY2F0ZWQYBiABKAgaYAoETGluaxImCgVwb2ludBgBIAEoCzIXLm1lc2h0YXN0aWMuQ290R2VvUG9pbnQSCwoDdWlkGAIgASgJEhAKCGNhbGxzaWduGAMgASgJEhEKCWxpbmtfdHlwZRgEIAEoDSKHAQoGTWV0aG9kEhYKEk1ldGhvZF9VbnNwZWNpZmllZBAAEhIKDk1ldGhvZF9Ecml2aW5nEAESEgoOTWV0aG9kX1dhbGtpbmcQAhIRCg1NZXRob2RfRmx5aW5nEAMSEwoPTWV0aG9kX1N3aW1taW5nEAQSFQoRTWV0aG9kX1dhdGVyY3JhZnQQBSJQCglEaXJlY3Rpb24SGQoVRGlyZWN0aW9uX1Vuc3BlY2lmaWVkEAASEwoPRGlyZWN0aW9uX0luZmlsEAESEwoPRGlyZWN0aW9uX0V4ZmlsEAIi1goKDUNhc2V2YWNSZXBvcnQSOAoKcHJlY2VkZW5jZRgBIAEoDjIkLm1lc2h0YXN0aWMuQ2FzZXZhY1JlcG9ydC5QcmVjZWRlbmNlEhcKD2VxdWlwbWVudF9mbGFncxgCIAEoDRIXCg9saXR0ZXJfcGF0aWVudHMYAyABKA0SGwoTYW1idWxhdG9yeV9wYXRpZW50cxgEIAEoDRI0CghzZWN1cml0eRgFIAEoDjIiLm1lc2h0YXN0aWMuQ2FzZXZhY1JlcG9ydC5TZWN1cml0eRI5CgtobHpfbWFya2luZxgGIAEoDjIkLm1lc2h0YXN0aWMuQ2FzZXZhY1JlcG9ydC5IbHpNYXJraW5nEhMKC3pvbmVfbWFya2VyGAcgASgJEhMKC3VzX21pbGl0YXJ5GAggASgNEhMKC3VzX2NpdmlsaWFuGAkgASgNEhcKD25vbl91c19taWxpdGFyeRgKIAEoDRIXCg9ub25fdXNfY2l2aWxpYW4YCyABKA0SCwoDZXB3GAwgASgNEg0KBWNoaWxkGA0gASgNEhUKDXRlcnJhaW5fZmxhZ3MYDiABKA0SEQoJZnJlcXVlbmN5GA8gASgJEg0KBXRpdGxlGBAgASgJEhcKD21lZGxpbmVfcmVtYXJrcxgRIAEoCRIUCgx1cmdlbnRfY291bnQYEiABKA0SHQoVdXJnZW50X3N1cmdpY2FsX2NvdW50GBMgASgNEhYKDnByaW9yaXR5X2NvdW50GBQgASgNEhUKDXJvdXRpbmVfY291bnQYFSABKA0SGQoRY29udmVuaWVuY2VfY291bnQYFiABKA0SGAoQZXF1aXBtZW50X2RldGFpbBgXIAEoCRIcChR6b25lX3Byb3RlY3RlZF9jb29yZBgYIAEoCRIZChF0ZXJyYWluX3Nsb3BlX2RpchgZIAEoCRIcChR0ZXJyYWluX290aGVyX2RldGFpbBgaIAEoCRIRCgltYXJrZWRfYnkYGyABKAkSEQoJb2JzdGFjbGVzGBwgASgJEhYKDndpbmRzX2FyZV9mcm9tGB0gASgJEhIKCmZyaWVuZGxpZXMYHiABKAkSDQoFZW5lbXkYHyABKAkSEwoLaGx6X3JlbWFya3MYICABKAkSJQoFem1pc3QYISADKAsyFi5tZXNodGFzdGljLlpNaXN0RW50cnkiqwEKClByZWNlZGVuY2USGgoWUHJlY2VkZW5jZV9VbnNwZWNpZmllZBAAEhUKEVByZWNlZGVuY2VfVXJnZW50EAESHQoZUHJlY2VkZW5jZV9VcmdlbnRTdXJnaWNhbBACEhcKE1ByZWNlZGVuY2VfUHJpb3JpdHkQAxIWChJQcmVjZWRlbmNlX1JvdXRpbmUQBBIaChZQcmVjZWRlbmNlX0NvbnZlbmllbmNlEAUimwEKCkhsek1hcmtpbmcSGgoWSGx6TWFya2luZ19VbnNwZWNpZmllZBAAEhUKEUhsek1hcmtpbmdfUGFuZWxzEAESGQoVSGx6TWFya2luZ19QeXJvU2lnbmFsEAISFAoQSGx6TWFya2luZ19TbW9rZRADEhMKD0hsek1hcmtpbmdfTm9uZRAEEhQKEEhsek1hcmtpbmdfT3RoZXIQBSKSAQoIU2VjdXJpdHkSGAoUU2VjdXJpdHlfVW5zcGVjaWZpZWQQABIUChBTZWN1cml0eV9Ob0VuZW15EAESGgoWU2VjdXJpdHlfUG9zc2libGVFbmVteRACEhgKFFNlY3VyaXR5X0VuZW15SW5BcmVhEAMSIAocU2VjdXJpdHlfRW5lbXlJbkFybWVkQ29udGFjdBAEIlIKClpNaXN0RW50cnkSDQoFdGl0bGUYASABKAkSCQoBehgCIAEoCRIJCgFtGAMgASgJEgkKAWkYBCABKAkSCQoBcxgFIAEoCRIJCgF0GAYgASgJIo0CCg5FbWVyZ2VuY3lBbGVydBItCgR0eXBlGAEgASgOMh8ubWVzaHRhc3RpYy5FbWVyZ2VuY3lBbGVydC5UeXBlEhUKDWF1dGhvcmluZ191aWQYAiABKAkSHAoUY2FuY2VsX3JlZmVyZW5jZV91aWQYAyABKAkilgEKBFR5cGUSFAoQVHlwZV9VbnNwZWNpZmllZBAAEhEKDVR5cGVfQWxlcnQ5MTEQARIUChBUeXBlX1JpbmdUaGVCZWxsEAISEgoOVHlwZV9JbkNvbnRhY3QQAxIZChVUeXBlX0dlb0ZlbmNlQnJlYWNoZWQQBBIPCgtUeXBlX0N1c3RvbRAFEg8KC1R5cGVfQ2FuY2VsEAYixgMKC1Rhc2tSZXF1ZXN0EhEKCXRhc2tfdHlwZRgBIAEoCRISCgp0YXJnZXRfdWlkGAIgASgJEhQKDGFzc2lnbmVlX3VpZBgDIAEoCRIyCghwcmlvcml0eRgEIAEoDjIgLm1lc2h0YXN0aWMuVGFza1JlcXVlc3QuUHJpb3JpdHkSLgoGc3RhdHVzGAUgASgOMh4ubWVzaHRhc3RpYy5UYXNrUmVxdWVzdC5TdGF0dXMSDAoEbm90ZRgGIAEoCSJ1CghQcmlvcml0eRIYChRQcmlvcml0eV9VbnNwZWNpZmllZBAAEhAKDFByaW9yaXR5X0xvdxABEhMKD1ByaW9yaXR5X05vcm1hbBACEhEKDVByaW9yaXR5X0hpZ2gQAxIVChFQcmlvcml0eV9Dcml0aWNhbBAEIpABCgZTdGF0dXMSFgoSU3RhdHVzX1Vuc3BlY2lmaWVkEAASEgoOU3RhdHVzX1BlbmRpbmcQARIXChNTdGF0dXNfQWNrbm93bGVkZ2VkEAISFQoRU3RhdHVzX0luUHJvZ3Jlc3MQAxIUChBTdGF0dXNfQ29tcGxldGVkEAQSFAoQU3RhdHVzX0NhbmNlbGxlZBAFImAKDlRBS0Vudmlyb25tZW50EhkKEXRlbXBlcmF0dXJlX2NfeDEwGAEgASgREhoKEndpbmRfZGlyZWN0aW9uX2RlZxgCIAEoDRIXCg93aW5kX3NwZWVkX2NtX3MYAyABKA0ijQMKCVNlbnNvckZvdhIuCgR0eXBlGAEgASgOMiAubWVzaHRhc3RpYy5TZW5zb3JGb3YuU2Vuc29yVHlwZRITCgthemltdXRoX2RlZxgCIAEoDRIUCgdyYW5nZV9tGAMgASgNSACIAQESGgoSZm92X2hvcml6b250YWxfZGVnGAQgASgNEhgKEGZvdl92ZXJ0aWNhbF9kZWcYBSABKA0SFQoNZWxldmF0aW9uX2RlZxgGIAEoERIQCghyb2xsX2RlZxgHIAEoERINCgVtb2RlbBgIIAEoCSKqAQoKU2Vuc29yVHlwZRIaChZTZW5zb3JUeXBlX1Vuc3BlY2lmaWVkEAASFQoRU2Vuc29yVHlwZV9DYW1lcmEQARIWChJTZW5zb3JUeXBlX1RoZXJtYWwQAhIUChBTZW5zb3JUeXBlX0xhc2VyEAMSEgoOU2Vuc29yVHlwZV9OdmcQBBIRCg1TZW5zb3JUeXBlX1JmEAUSFAoQU2Vuc29yVHlwZV9PdGhlchAGQgoKCF9yYW5nZV9tIlUKDlRha1RhbGtNZXNzYWdlEgwKBHRleHQYASABKAkSEwoLY2hhdHJvb21faWQYAiABKAkSDAoEbGFuZxgDIAEoCRISCgpmcm9tX3ZvaWNlGAQgASgIImgKD1Rha1RhbGtSb29tRGF0YRIbCg9zZW5kZXJfY2FsbHNpZ24YASABKAlCAhgBEg8KB3Jvb21faWQYAiABKAkSEQoJcm9vbV9uYW1lGAMgASgJEhQKDHBhcnRpY2lwYW50cxgEIAMoCSIeCgVNYXJ0aRIVCg1kZXN0X2NhbGxzaWduGAEgAygJIpkKCgtUQUtQYWNrZXRWMhIoCgtjb3RfdHlwZV9pZBgBIAEoDjITLm1lc2h0YXN0aWMuQ290VHlwZRIfCgNob3cYAiABKA4yEi5tZXNodGFzdGljLkNvdEhvdxIQCghjYWxsc2lnbhgDIAEoCRIeCgR0ZWFtGAQgASgOMhAubWVzaHRhc3RpYy5UZWFtEiQKBHJvbGUYBSABKA4yFi5tZXNodGFzdGljLk1lbWJlclJvbGUSEgoKbGF0aXR1ZGVfaRgGIAEoDxITCgtsb25naXR1ZGVfaRgHIAEoDxIQCghhbHRpdHVkZRgIIAEoERINCgVzcGVlZBgJIAEoDRIOCgZjb3Vyc2UYCiABKA0SDwoHYmF0dGVyeRgLIAEoDRIrCgdnZW9fc3JjGAwgASgOMhoubWVzaHRhc3RpYy5HZW9Qb2ludFNvdXJjZRIrCgdhbHRfc3JjGA0gASgOMhoubWVzaHRhc3RpYy5HZW9Qb2ludFNvdXJjZRILCgN1aWQYDiABKAkSFwoPZGV2aWNlX2NhbGxzaWduGA8gASgJEhUKDXN0YWxlX3NlY29uZHMYECABKA0SEwoLdGFrX3ZlcnNpb24YESABKAkSEgoKdGFrX2RldmljZRgSIAEoCRIUCgx0YWtfcGxhdGZvcm0YEyABKAkSDgoGdGFrX29zGBQgASgJEhAKCGVuZHBvaW50GBUgASgJEg0KBXBob25lGBYgASgJEhQKDGNvdF90eXBlX3N0chgXIAEoCRIPCgdyZW1hcmtzGBggASgJEjQKC2Vudmlyb25tZW50GBkgASgLMhoubWVzaHRhc3RpYy5UQUtFbnZpcm9ubWVudEgBiAEBEi4KCnNlbnNvcl9mb3YYGiABKAsyFS5tZXNodGFzdGljLlNlbnNvckZvdkgCiAEBEiUKBW1hcnRpGB0gASgLMhEubWVzaHRhc3RpYy5NYXJ0aUgDiAEBEiMKBGNoYXQYHyABKAsyEy5tZXNodGFzdGljLkdlb0NoYXRIABItCghhaXJjcmFmdBggIAEoCzIZLm1lc2h0YXN0aWMuQWlyY3JhZnRUcmFja0gAEhQKCnJhd19kZXRhaWwYISABKAxIABInCgVzaGFwZRgiIAEoCzIWLm1lc2h0YXN0aWMuRHJhd25TaGFwZUgAEiQKBm1hcmtlchgjIAEoCzISLm1lc2h0YXN0aWMuTWFya2VySAASKgoDcmFiGCQgASgLMhsubWVzaHRhc3RpYy5SYW5nZUFuZEJlYXJpbmdIABIiCgVyb3V0ZRglIAEoCzIRLm1lc2h0YXN0aWMuUm91dGVIABIsCgdjYXNldmFjGCYgASgLMhkubWVzaHRhc3RpYy5DYXNldmFjUmVwb3J0SAASLwoJZW1lcmdlbmN5GCcgASgLMhoubWVzaHRhc3RpYy5FbWVyZ2VuY3lBbGVydEgAEicKBHRhc2sYKCABKAsyFy5tZXNodGFzdGljLlRhc2tSZXF1ZXN0SAASLQoHdGFrdGFsaxgpIAEoCzIaLm1lc2h0YXN0aWMuVGFrVGFsa01lc3NhZ2VIABIzCgx0YWt0YWxrX3Jvb20YKiABKAsyGy5tZXNodGFzdGljLlRha1RhbGtSb29tRGF0YUgAQhEKD3BheWxvYWRfdmFyaWFudEIOCgxfZW52aXJvbm1lbnRCDQoLX3NlbnNvcl9mb3ZCCAoGX21hcnRpSgQIGxAcSgQIHBAdSgQIHhAfKsABCgRUZWFtEhQKEFVuc3BlY2lmZWRfQ29sb3IQABIJCgVXaGl0ZRABEgoKBlllbGxvdxACEgoKBk9yYW5nZRADEgsKB01hZ2VudGEQBBIHCgNSZWQQBRIKCgZNYXJvb24QBhIKCgZQdXJwbGUQBxINCglEYXJrX0JsdWUQCBIICgRCbHVlEAkSCAoEQ3lhbhAKEggKBFRlYWwQCxIJCgVHcmVlbhAMEg4KCkRhcmtfR3JlZW4QDRIJCgVCcm93bhAOKn8KCk1lbWJlclJvbGUSDgoKVW5zcGVjaWZlZBAAEg4KClRlYW1NZW1iZXIQARIMCghUZWFtTGVhZBACEgYKAkhREAMSCgoGU25pcGVyEAQSCQoFTWVkaWMQBRITCg9Gb3J3YXJkT2JzZXJ2ZXIQBhIHCgNSVE8QBxIGCgJLORAIKpYBCgZDb3RIb3cSFgoSQ290SG93X1Vuc3BlY2lmaWVkEAASDgoKQ290SG93X2hfZRABEg4KCkNvdEhvd19tX2cQAhIUChBDb3RIb3dfaF9nX2lfZ19vEAMSDgoKQ290SG93X21fchAEEg4KCkNvdEhvd19tX2YQBRIOCgpDb3RIb3dfbV9wEAYSDgoKQ290SG93X21fcxAHKoMXCgdDb3RUeXBlEhEKDUNvdFR5cGVfT3RoZXIQABIVChFDb3RUeXBlX2FfZl9HX1VfQxABEhcKE0NvdFR5cGVfYV9mX0dfVV9DX0kQAhIVChFDb3RUeXBlX2Ffbl9BX0NfRhADEhUKEUNvdFR5cGVfYV9uX0FfQ19IEAQSEwoPQ290VHlwZV9hX25fQV9DEAUSFQoRQ290VHlwZV9hX2ZfQV9NX0gQBhITCg9Db3RUeXBlX2FfZl9BX00QBxIXChNDb3RUeXBlX2FfZl9BX01fRl9GEAgSFwoTQ290VHlwZV9hX2ZfQV9NX0hfQRAJEhkKFUNvdFR5cGVfYV9mX0FfTV9IX1VfTRAKEhcKE0NvdFR5cGVfYV9oX0FfTV9GX0YQCxIXChNDb3RUeXBlX2FfaF9BX01fSF9BEAwSEwoPQ290VHlwZV9hX3VfQV9DEA0SEwoPQ290VHlwZV90X3hfZF9kEA4SFwoTQ290VHlwZV9hX2ZfR19FX1NfRRAPEhcKE0NvdFR5cGVfYV9mX0dfRV9WX0MQEBIRCg1Db3RUeXBlX2FfZl9TEBESFQoRQ290VHlwZV9hX2ZfQV9NX0YQEhIZChVDb3RUeXBlX2FfZl9BX01fRl9DX0gQExIZChVDb3RUeXBlX2FfZl9BX01fRl9VX0wQFBIXChNDb3RUeXBlX2FfZl9BX01fRl9MEBUSFwoTQ290VHlwZV9hX2ZfQV9NX0ZfUBAWEhUKEUNvdFR5cGVfYV9mX0FfQ19IEBcSFwoTQ290VHlwZV9hX25fQV9NX0ZfURAYEhEKDUNvdFR5cGVfYl90X2YQGRIVChFDb3RUeXBlX2Jfcl9mX2hfYxAaEhUKEUNvdFR5cGVfYl9hX29fcGFuEBsSFQoRQ290VHlwZV9iX2Ffb19vcG4QHBIVChFDb3RUeXBlX2JfYV9vX2NhbhAdEhUKEUNvdFR5cGVfYl9hX29fdGJsEB4SEQoNQ290VHlwZV9iX2FfZxAfEhEKDUNvdFR5cGVfYV9mX0cQIBITCg9Db3RUeXBlX2FfZl9HX1UQIRIRCg1Db3RUeXBlX2FfaF9HECISEQoNQ290VHlwZV9hX3VfRxAjEhEKDUNvdFR5cGVfYV9uX0cQJBIRCg1Db3RUeXBlX2JfbV9yECUSEwoPQ290VHlwZV9iX21fcF93ECYSFwoTQ290VHlwZV9iX21fcF9zX3BfaRAnEhEKDUNvdFR5cGVfdV9kX2YQKBIRCg1Db3RUeXBlX3VfZF9yECkSEwoPQ290VHlwZV91X2RfY19jECoSEgoOQ290VHlwZV91X3JiX2EQKxIRCg1Db3RUeXBlX2FfaF9BECwSEQoNQ290VHlwZV9hX3VfQRAtEhcKE0NvdFR5cGVfYV9mX0FfTV9IX1EQLhIVChFDb3RUeXBlX2FfZl9BX0NfRhAvEhMKD0NvdFR5cGVfYV9mX0FfQxAwEhUKEUNvdFR5cGVfYV9mX0FfQ19MEDESEQoNQ290VHlwZV9hX2ZfQRAyEhcKE0NvdFR5cGVfYV9mX0FfTV9IX0MQMxIXChNDb3RUeXBlX2Ffbl9BX01fRl9GEDQSFQoRQ290VHlwZV9hX3VfQV9DX0YQNRIbChdDb3RUeXBlX2FfZl9HX1VfQ19GX1RfQRA2EhkKFUNvdFR5cGVfYV9mX0dfVV9DX1ZfUxA3EhkKFUNvdFR5cGVfYV9mX0dfVV9DX1JfWBA4EhkKFUNvdFR5cGVfYV9mX0dfVV9DX0lfWhA5EhsKF0NvdFR5cGVfYV9mX0dfVV9DX0VfQ19XEDoSGQoVQ290VHlwZV9hX2ZfR19VX0NfSV9MEDsSGQoVQ290VHlwZV9hX2ZfR19VX0NfUl9PEDwSGQoVQ290VHlwZV9hX2ZfR19VX0NfUl9WED0SFQoRQ290VHlwZV9hX2ZfR19VX0gQPhIbChdDb3RUeXBlX2FfZl9HX1VfVV9NX1NfRRA/EhkKFUNvdFR5cGVfYV9mX0dfVV9TX01fQxBAEhUKEUNvdFR5cGVfYV9mX0dfRV9TEEESEwoPQ290VHlwZV9hX2ZfR19FEEISGQoVQ290VHlwZV9hX2ZfR19FX1ZfQ19VEEMSGgoWQ290VHlwZV9hX2ZfR19FX1ZfQ19wcxBEEhUKEUNvdFR5cGVfYV91X0dfRV9WEEUSFwoTQ290VHlwZV9hX2ZfU19OX05fUhBGEhMKD0NvdFR5cGVfYV9mX0ZfQhBHEhkKFUNvdFR5cGVfYl9tX3Bfc19wX2xvYxBIEhEKDUNvdFR5cGVfYl9pX3YQSRITCg9Db3RUeXBlX2JfZl90X3IQShITCg9Db3RUeXBlX2JfZl90X2EQSxITCg9Db3RUeXBlX3VfZF9mX20QTBIRCg1Db3RUeXBlX3VfZF9wEE0SFQoRQ290VHlwZV9iX21fcF9zX20QThITCg9Db3RUeXBlX2JfbV9wX2MQTxIVChFDb3RUeXBlX3Vfcl9iX2NfYxBQEhoKFkNvdFR5cGVfdV9yX2JfYnVsbHNleWUQURIXChNDb3RUeXBlX2FfZl9HX0VfVl9BEFISEQoNQ290VHlwZV9hX25fQRBTEhcKE0NvdFR5cGVfYV91X0dfVV9DX0YQVBIXChNDb3RUeXBlX2Ffbl9HX1VfQ19GEFUSFwoTQ290VHlwZV9hX2hfR19VX0NfRhBWEhcKE0NvdFR5cGVfYV9mX0dfVV9DX0YQVxITCg9Db3RUeXBlX2FfdV9HX0kQWBITCg9Db3RUeXBlX2Ffbl9HX0kQWRITCg9Db3RUeXBlX2FfaF9HX0kQWhITCg9Db3RUeXBlX2FfZl9HX0kQWxIXChNDb3RUeXBlX2FfdV9HX0VfWF9NEFwSFwoTQ290VHlwZV9hX25fR19FX1hfTRBdEhcKE0NvdFR5cGVfYV9oX0dfRV9YX00QXhIXChNDb3RUeXBlX2FfZl9HX0VfWF9NEF8SEQoNQ290VHlwZV9hX3VfUxBgEhEKDUNvdFR5cGVfYV9uX1MQYRIRCg1Db3RUeXBlX2FfaF9TEGISGQoVQ290VHlwZV9hX3VfR19VX0NfSV9kEGMSGQoVQ290VHlwZV9hX25fR19VX0NfSV9kEGQSGQoVQ290VHlwZV9hX2hfR19VX0NfSV9kEGUSGQoVQ290VHlwZV9hX2ZfR19VX0NfSV9kEGYSGQoVQ290VHlwZV9hX3VfR19FX1ZfQV9UEGcSGQoVQ290VHlwZV9hX25fR19FX1ZfQV9UEGgSGQoVQ290VHlwZV9hX2hfR19FX1ZfQV9UEGkSGQoVQ290VHlwZV9hX2ZfR19FX1ZfQV9UEGoSFwoTQ290VHlwZV9hX3VfR19VX0NfSRBrEhcKE0NvdFR5cGVfYV9uX0dfVV9DX0kQbBIXChNDb3RUeXBlX2FfaF9HX1VfQ19JEG0SFQoRQ290VHlwZV9hX25fR19FX1YQbhIVChFDb3RUeXBlX2FfaF9HX0VfVhBvEhUKEUNvdFR5cGVfYV9mX0dfRV9WEHASGAoUQ290VHlwZV9iX21fcF93X0dPVE8QcRIWChJDb3RUeXBlX2JfbV9wX2NfaXAQchIWChJDb3RUeXBlX2JfbV9wX2NfY3AQcxIYChRDb3RUeXBlX2JfbV9wX3NfcF9vcBB0EhEKDUNvdFR5cGVfdV9kX3YQdRITCg9Db3RUeXBlX3VfZF92X20QdhITCg9Db3RUeXBlX3VfZF9jX2UQdxITCg9Db3RUeXBlX2JfaV94X2kQeBITCg9Db3RUeXBlX2JfdF9mX2QQeRITCg9Db3RUeXBlX2JfdF9mX3IQehITCg9Db3RUeXBlX2JfYV9vX2MQexIPCgtDb3RUeXBlX3RfcxB8EhEKDUNvdFR5cGVfbV90X3QQfRINCglDb3RUeXBlX3kQfip9Cg5HZW9Qb2ludFNvdXJjZRIeChpHZW9Qb2ludFNvdXJjZV9VbnNwZWNpZmllZBAAEhYKEkdlb1BvaW50U291cmNlX0dQUxABEhcKE0dlb1BvaW50U291cmNlX1VTRVIQAhIaChZHZW9Qb2ludFNvdXJjZV9ORVRXT1JLEANCYAoUb3JnLm1lc2h0YXN0aWMucHJvdG9CCkFUQUtQcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * + * Packets for the official ATAK Plugin + * + * @generated from message meshtastic.TAKPacket + */ +export type TAKPacket = Message<"meshtastic.TAKPacket"> & { + /** + * + * Are the payloads strings compressed for LoRA transport? + * + * @generated from field: bool is_compressed = 1; + */ + isCompressed: boolean; + + /** + * + * The contact / callsign for ATAK user + * + * @generated from field: meshtastic.Contact contact = 2; + */ + contact?: Contact | undefined; + + /** + * + * The group for ATAK user + * + * @generated from field: meshtastic.Group group = 3; + */ + group?: Group | undefined; + + /** + * + * The status of the ATAK EUD + * + * @generated from field: meshtastic.Status status = 4; + */ + status?: Status | undefined; + + /** + * + * The payload of the packet + * + * @generated from oneof meshtastic.TAKPacket.payload_variant + */ + payloadVariant: { + /** + * + * TAK position report + * + * @generated from field: meshtastic.PLI pli = 5; + */ + value: PLI; + case: "pli"; + } | { + /** + * + * ATAK GeoChat message + * + * @generated from field: meshtastic.GeoChat chat = 6; + */ + value: GeoChat; + case: "chat"; + } | { + /** + * + * Generic CoT detail XML + * May be compressed / truncated by the sender (EUD) + * + * @generated from field: bytes detail = 7; + */ + value: Uint8Array; + case: "detail"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.TAKPacket. + * Use `create(TAKPacketSchema)` to create a new message. + */ +export const TAKPacketSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 0); + +/** + * + * ATAK GeoChat message + * + * @generated from message meshtastic.GeoChat + */ +export type GeoChat = Message<"meshtastic.GeoChat"> & { + /** + * + * The text message. Empty for receipts. + * + * @generated from field: string message = 1; + */ + message: string; + + /** + * + * Uid recipient of the message + * + * @generated from field: optional string to = 2; + */ + to?: string | undefined; + + /** + * + * Callsign of the recipient for the message + * + * @generated from field: optional string to_callsign = 3; + */ + toCallsign?: string | undefined; + + /** + * + * UID of the chat message this event is acknowledging. Empty for a + * normal chat message; set for delivered / read receipts. Paired with + * receipt_type so receivers can match the ack back to the original + * outbound GeoChat by its event uid. + * + * @generated from field: string receipt_for_uid = 4; + */ + receiptForUid: string; + + /** + * + * Receipt kind discriminator. See ReceiptType doc. Default ReceiptType_None + * means this is a regular chat message, not a receipt. + * + * @generated from field: meshtastic.GeoChat.ReceiptType receipt_type = 5; + */ + receiptType: GeoChat_ReceiptType; + + /** + * + * BCP-47-ish language tag or human-readable name (e.g. "en", "English") + * that the originator's TAKTALK plugin recorded for the message. + * + * @generated from field: optional string lang = 6; + */ + lang?: string | undefined; + + /** + * + * TAKTALK chatroom UUID (e.g. "30b2755c-c547-44ef-a0cc-cdbd8a15616f") that + * the receiver's TAKTALK plugin uses to thread the message under the + * right room. Resolved to a friendly name via TakTalkRoomData broadcasts. + * + * @generated from field: optional string room_id = 7; + */ + roomId?: string | undefined; + + /** + * + * TAKTALK voice profile pointer. Often empty in practice (the empty + * marker `` still signals TAKTALK origination), so + * receivers should treat empty-but-present as the equivalent of the + * marker rather than a missing field. + * + * @generated from field: optional string voice_profile_id = 8; + */ + voiceProfileId?: string | undefined; +}; + +/** + * Describes the message meshtastic.GeoChat. + * Use `create(GeoChatSchema)` to create a new message. + */ +export const GeoChatSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 1); + +/** + * + * Receipt discriminator. Set alongside cot_type_id = b-t-f-d (delivered) + * or b-t-f-r (read). ReceiptType_None is the default for a normal chat + * message (cot_type_id = b-t-f). + * + * Receivers can detect a receipt by checking receipt_type != ReceiptType_None + * without re-parsing the envelope cot_type_id. + * + * @generated from enum meshtastic.GeoChat.ReceiptType + */ +export enum GeoChat_ReceiptType { + /** + * normal chat message + * + * @generated from enum value: ReceiptType_None = 0; + */ + ReceiptType_None = 0, + + /** + * b-t-f-d delivered receipt + * + * @generated from enum value: ReceiptType_Delivered = 1; + */ + ReceiptType_Delivered = 1, + + /** + * b-t-f-r read receipt + * + * @generated from enum value: ReceiptType_Read = 2; + */ + ReceiptType_Read = 2, +} + +/** + * Describes the enum meshtastic.GeoChat.ReceiptType. + */ +export const GeoChat_ReceiptTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 1, 0); + +/** + * + * ATAK Group + * <__group role='Team Member' name='Cyan'/> + * + * @generated from message meshtastic.Group + */ +export type Group = Message<"meshtastic.Group"> & { + /** + * + * Role of the group member + * + * @generated from field: meshtastic.MemberRole role = 1; + */ + role: MemberRole; + + /** + * + * Team (color) + * Default Cyan + * + * @generated from field: meshtastic.Team team = 2; + */ + team: Team; +}; + +/** + * Describes the message meshtastic.Group. + * Use `create(GroupSchema)` to create a new message. + */ +export const GroupSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 2); + +/** + * + * ATAK EUD Status + * + * + * @generated from message meshtastic.Status + */ +export type Status = Message<"meshtastic.Status"> & { + /** + * + * Battery level + * + * @generated from field: uint32 battery = 1; + */ + battery: number; +}; + +/** + * Describes the message meshtastic.Status. + * Use `create(StatusSchema)` to create a new message. + */ +export const StatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 3); + +/** + * + * ATAK Contact + * + * + * @generated from message meshtastic.Contact + */ +export type Contact = Message<"meshtastic.Contact"> & { + /** + * + * Callsign + * + * @generated from field: string callsign = 1; + */ + callsign: string; + + /** + * + * Device callsign + * + * + * IP address of endpoint in integer form (0.0.0.0 default) + * + * @generated from field: string device_callsign = 2; + */ + deviceCallsign: string; +}; + +/** + * Describes the message meshtastic.Contact. + * Use `create(ContactSchema)` to create a new message. + */ +export const ContactSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 4); + +/** + * + * Position Location Information from ATAK + * + * @generated from message meshtastic.PLI + */ +export type PLI = Message<"meshtastic.PLI"> & { + /** + * + * The new preferred location encoding, multiply by 1e-7 to get degrees + * in floating point + * + * @generated from field: sfixed32 latitude_i = 1; + */ + latitudeI: number; + + /** + * + * The new preferred location encoding, multiply by 1e-7 to get degrees + * in floating point + * + * @generated from field: sfixed32 longitude_i = 2; + */ + longitudeI: number; + + /** + * + * Altitude (ATAK prefers HAE) + * + * @generated from field: int32 altitude = 3; + */ + altitude: number; + + /** + * + * Speed + * + * @generated from field: uint32 speed = 4; + */ + speed: number; + + /** + * + * Course in degrees + * + * @generated from field: uint32 course = 5; + */ + course: number; +}; + +/** + * Describes the message meshtastic.PLI. + * Use `create(PLISchema)` to create a new message. + */ +export const PLISchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 5); + +/** + * + * Aircraft track information from ADS-B or military air tracking. + * Covers the majority of observed real-world CoT traffic. + * + * @generated from message meshtastic.AircraftTrack + */ +export type AircraftTrack = Message<"meshtastic.AircraftTrack"> & { + /** + * + * ICAO hex identifier (e.g. "AD237C") + * + * @generated from field: string icao = 1; + */ + icao: string; + + /** + * + * Aircraft registration (e.g. "N946AK") + * + * @generated from field: string registration = 2; + */ + registration: string; + + /** + * + * Flight number/callsign (e.g. "ASA864") + * + * @generated from field: string flight = 3; + */ + flight: string; + + /** + * + * ICAO aircraft type designator (e.g. "B39M") + * + * @generated from field: string aircraft_type = 4; + */ + aircraftType: string; + + /** + * + * Transponder squawk code (0-7777 octal) + * + * @generated from field: uint32 squawk = 5; + */ + squawk: number; + + /** + * + * ADS-B emitter category (e.g. "A3") + * + * @generated from field: string category = 6; + */ + category: string; + + /** + * + * Received signal strength * 10 (e.g. -194 for -19.4 dBm) + * + * @generated from field: sint32 rssi_x10 = 7; + */ + rssiX10: number; + + /** + * + * Whether receiver has GPS fix + * + * @generated from field: bool gps = 8; + */ + gps: boolean; + + /** + * + * CoT host ID for source attribution + * + * @generated from field: string cot_host_id = 9; + */ + cotHostId: string; +}; + +/** + * Describes the message meshtastic.AircraftTrack. + * Use `create(AircraftTrackSchema)` to create a new message. + */ +export const AircraftTrackSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 6); + +/** + * + * Compact geographic vertex used by repeated vertex lists in TAK geometry + * payloads. Named with a `Cot` prefix to avoid a namespace collision with + * `meshtastic.GeoPoint` in `device_ui.proto`, which is an unrelated zoom/ + * latitude/longitude type used by the on-device map UI. + * + * Encoded as a signed DELTA from TAKPacketV2.latitude_i / longitude_i (the + * enclosing event's anchor point). The absolute coordinate is recovered by + * the receiver as `event.latitude_i + vertex.lat_delta_i` (and likewise for + * longitude). + * + * Why deltas: a 32-vertex telestration with vertices clustered within a few + * hundred meters of the anchor has per-vertex deltas in the ±10^4 range. + * Under sint32+zigzag those encode as 2 bytes each (tag+varint), versus the + * 4 bytes that sfixed32 would always require. At 32 vertices that is ~128 + * bytes of savings — the difference between fitting under the LoRa MTU or + * not. Absolute coordinates (values ~10^9) would cost sint32 varint 5 bytes + * per field, which is why TAKPacketV2's top-level latitude_i / longitude_i + * stay sfixed32 — only small values win with sint32. + * + * @generated from message meshtastic.CotGeoPoint + */ +export type CotGeoPoint = Message<"meshtastic.CotGeoPoint"> & { + /** + * + * Latitude delta from TAKPacketV2.latitude_i, in 1e-7 degree units. + * Add to the enclosing event's latitude_i to recover the absolute latitude. + * + * @generated from field: sint32 lat_delta_i = 1; + */ + latDeltaI: number; + + /** + * + * Longitude delta from TAKPacketV2.longitude_i, in 1e-7 degree units. + * + * @generated from field: sint32 lon_delta_i = 2; + */ + lonDeltaI: number; +}; + +/** + * Describes the message meshtastic.CotGeoPoint. + * Use `create(CotGeoPointSchema)` to create a new message. + */ +export const CotGeoPointSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 7); + +/** + * + * User-drawn tactical graphic: circle, rectangle, polygon, polyline, freehand + * telestration, ranging circle, or bullseye. + * + * Covers CoT types u-d-c-c, u-d-r, u-d-f, u-d-f-m, u-d-p, u-r-b-c-c, + * u-r-b-bullseye. The shape's anchor position is carried on + * TAKPacketV2.latitude_i/longitude_i; polyline/polygon vertices are in the + * `vertices` repeated field as `CotGeoPoint` deltas from that anchor. + * + * Colors use the Team enum as a 14-color palette (see color encoding below) + * with a fixed32 exact-ARGB fallback for custom user-picked colors that + * don't map to a palette entry. + * + * @generated from message meshtastic.DrawnShape + */ +export type DrawnShape = Message<"meshtastic.DrawnShape"> & { + /** + * + * Shape kind (circle, rectangle, freeform, etc.) + * + * @generated from field: meshtastic.DrawnShape.Kind kind = 1; + */ + kind: DrawnShape_Kind; + + /** + * + * Explicit stroke/fill/both discriminator. See StyleMode doc. + * + * @generated from field: meshtastic.DrawnShape.StyleMode style = 2; + */ + style: DrawnShape_StyleMode; + + /** + * + * Ellipse major radius in centimeters. 0 for non-ellipse kinds. + * + * @generated from field: uint32 major_cm = 3; + */ + majorCm: number; + + /** + * + * Ellipse minor radius in centimeters. 0 for non-ellipse kinds. + * + * @generated from field: uint32 minor_cm = 4; + */ + minorCm: number; + + /** + * + * Ellipse rotation angle in degrees. Valid values are 0..360 inclusive; + * 0 and 360 are equivalent rotations. In proto3, an unset uint32 reads + * as 0, so senders should emit 0 when the angle is unspecified. + * + * @generated from field: uint32 angle_deg = 5; + */ + angleDeg: number; + + /** + * + * Stroke color as a named palette entry from the Team enum. If + * Unspecifed_Color, the exact ARGB is carried in stroke_argb. + * Valid only when style is StrokeOnly or StrokeAndFill. + * + * @generated from field: meshtastic.Team stroke_color = 6; + */ + strokeColor: Team; + + /** + * + * Stroke color as an exact 32-bit ARGB bit pattern. Always populated + * on the wire; readers MUST use this value when stroke_color == + * Unspecifed_Color and MAY use it to recover the exact original bytes + * even when a palette entry is set. + * + * @generated from field: fixed32 stroke_argb = 7; + */ + strokeArgb: number; + + /** + * + * Stroke weight in tenths of a unit (e.g. 30 = 3.0). Typical ATAK + * range 10..60. + * + * @generated from field: uint32 stroke_weight_x10 = 8; + */ + strokeWeightX10: number; + + /** + * + * Fill color as a named palette entry. See stroke_color docs. + * Valid only when style is FillOnly or StrokeAndFill. + * + * @generated from field: meshtastic.Team fill_color = 9; + */ + fillColor: Team; + + /** + * + * Fill color exact ARGB fallback. See stroke_argb docs. + * + * @generated from field: fixed32 fill_argb = 10; + */ + fillArgb: number; + + /** + * + * Whether labels are rendered on this shape. + * + * @generated from field: bool labels_on = 11; + */ + labelsOn: boolean; + + /** + * @generated from field: repeated sint32 vertex_lat_deltas = 18; + */ + vertexLatDeltas: number[]; + + /** + * @generated from field: repeated sint32 vertex_lon_deltas = 19; + */ + vertexLonDeltas: number[]; + + /** + * + * True if the sender truncated the vertex columns to fit the pool. + * + * --- Bullseye-only fields. All ignored unless kind == Kind_Bullseye. --- + * + * @generated from field: bool truncated = 13; + */ + truncated: boolean; + + /** + * + * Bullseye distance in meters * 10 (e.g. 3285 = 328.5 m). 0 = unset. + * + * @generated from field: uint32 bullseye_distance_dm = 14; + */ + bullseyeDistanceDm: number; + + /** + * + * Bullseye bearing reference: 0 unset, 1 Magnetic, 2 True, 3 Grid. + * + * @generated from field: uint32 bullseye_bearing_ref = 15; + */ + bullseyeBearingRef: number; + + /** + * + * Bullseye attribute bit flags: + * bit 0: rangeRingVisible + * bit 1: hasRangeRings + * bit 2: edgeToCenter + * bit 3: mils + * + * @generated from field: uint32 bullseye_flags = 16; + */ + bullseyeFlags: number; + + /** + * + * Bullseye reference UID (anchor marker). Empty = anchor is self. + * + * @generated from field: string bullseye_uid_ref = 17; + */ + bullseyeUidRef: string; +}; + +/** + * Describes the message meshtastic.DrawnShape. + * Use `create(DrawnShapeSchema)` to create a new message. + */ +export const DrawnShapeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 8); + +/** + * + * Shape kind discriminator. Drives receiver rendering and also controls + * which optional fields below are meaningful. + * + * @generated from enum meshtastic.DrawnShape.Kind + */ +export enum DrawnShape_Kind { + /** + * + * Unspecified (do not use on the wire) + * + * @generated from enum value: Kind_Unspecified = 0; + */ + Unspecified = 0, + + /** + * + * u-d-c-c: User-drawn circle (uses major/minor/angle, anchor = event point) + * + * @generated from enum value: Kind_Circle = 1; + */ + Circle = 1, + + /** + * + * u-d-r: User-drawn rectangle (uses vertices = 4 corners) + * + * @generated from enum value: Kind_Rectangle = 2; + */ + Rectangle = 2, + + /** + * + * u-d-f: User-drawn polyline (uses vertices, not closed) + * + * @generated from enum value: Kind_Freeform = 3; + */ + Freeform = 3, + + /** + * + * u-d-f-m: Freehand telestration / annotation (uses vertices, may be truncated) + * + * @generated from enum value: Kind_Telestration = 4; + */ + Telestration = 4, + + /** + * + * u-d-p: Closed polygon (uses vertices, implicitly closed) + * + * @generated from enum value: Kind_Polygon = 5; + */ + Polygon = 5, + + /** + * + * u-r-b-c-c: Ranging circle (major/minor/angle, stroke + optional fill) + * + * @generated from enum value: Kind_RangingCircle = 6; + */ + RangingCircle = 6, + + /** + * + * u-r-b-bullseye: Bullseye ring with range rings and bearing reference + * + * @generated from enum value: Kind_Bullseye = 7; + */ + Bullseye = 7, + + /** + * + * u-d-c-e: Ellipse with distinct major/minor axes (same storage as + * Kind_Circle — uses major_cm/minor_cm/angle_deg — but receivers + * render it as a non-circular ellipse rather than a round circle). + * + * @generated from enum value: Kind_Ellipse = 8; + */ + Ellipse = 8, + + /** + * + * u-d-v: 2D vehicle outline drawn on the map. Vertices carry the + * outline polygon; receivers draw it as a filled polygon. + * + * @generated from enum value: Kind_Vehicle2D = 9; + */ + Vehicle2D = 9, + + /** + * + * u-d-v-m: 3D vehicle model reference. Same vertex polygon as + * Kind_Vehicle2D; receivers that support 3D rendering extrude it. + * + * @generated from enum value: Kind_Vehicle3D = 10; + */ + Vehicle3D = 10, +} + +/** + * Describes the enum meshtastic.DrawnShape.Kind. + */ +export const DrawnShape_KindSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 8, 0); + +/** + * + * Explicit stroke/fill/both discriminator. + * + * ATAK's source XML distinguishes "stroke-only polyline" from "closed shape + * with both stroke and fill" by the presence of the element. + * Both states can hash to all-zero color fields, so we carry the signal + * explicitly. Parser sets this from (sawStrokeColor, sawFillColor) at the + * end of parse; builder uses it to decide which of / + * to emit in the reconstructed XML. + * + * @generated from enum meshtastic.DrawnShape.StyleMode + */ +export enum DrawnShape_StyleMode { + /** + * + * Unspecified — receiver infers from which color fields are non-zero. + * + * @generated from enum value: StyleMode_Unspecified = 0; + */ + StyleMode_Unspecified = 0, + + /** + * + * Stroke only. No in the source XML. Used for polylines, + * ranging lines, bullseye rings. + * + * @generated from enum value: StyleMode_StrokeOnly = 1; + */ + StyleMode_StrokeOnly = 1, + + /** + * + * Fill only. No in the source XML. Rare but valid in + * ATAK (solid region with no outline). + * + * @generated from enum value: StyleMode_FillOnly = 2; + */ + StyleMode_FillOnly = 2, + + /** + * + * Both stroke and fill present. Closed shapes: circle, rectangle, + * polygon, ranging circle. + * + * @generated from enum value: StyleMode_StrokeAndFill = 3; + */ + StyleMode_StrokeAndFill = 3, +} + +/** + * Describes the enum meshtastic.DrawnShape.StyleMode. + */ +export const DrawnShape_StyleModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 8, 1); + +/** + * + * Fixed point of interest: spot marker, waypoint, checkpoint, 2525 symbol, + * or custom icon. + * + * Covers CoT types b-m-p-s-m, b-m-p-w, b-m-p-c, b-m-p-s-p-i, b-m-p-s-p-loc, + * plus a-u-G / a-f-G / a-h-G / a-n-G with iconset paths. The marker position + * is carried on TAKPacketV2.latitude_i/longitude_i; fields below carry only + * the marker-specific metadata. + * + * @generated from message meshtastic.Marker + */ +export type Marker = Message<"meshtastic.Marker"> & { + /** + * + * Marker kind + * + * @generated from field: meshtastic.Marker.Kind kind = 1; + */ + kind: Marker_Kind; + + /** + * + * Marker color as a named palette entry. If Unspecifed_Color, the exact + * ARGB is in color_argb. + * + * @generated from field: meshtastic.Team color = 2; + */ + color: Team; + + /** + * + * Marker color exact ARGB bit pattern. Always populated on the wire. + * + * @generated from field: fixed32 color_argb = 3; + */ + colorArgb: number; + + /** + * + * Status readiness flag (ATAK ). + * + * @generated from field: bool readiness = 4; + */ + readiness: boolean; + + /** + * + * Parent link UID (ATAK ). Empty = no parent. + * For spot/waypoint markers this is typically the producing TAK user's UID. + * + * @generated from field: string parent_uid = 5; + */ + parentUid: string; + + /** + * + * Parent CoT type (e.g. "a-f-G-U-C"). Usually the parent TAK user's type. + * + * @generated from field: string parent_type = 6; + */ + parentType: string; + + /** + * + * Parent callsign (e.g. "HOPE"). + * + * @generated from field: string parent_callsign = 7; + */ + parentCallsign: string; + + /** + * + * Iconset path stored verbatim. ATAK emits three flavors: + * Kind_Symbol2525 -> "COT_MAPPING_2525B//" + * Kind_SpotMap -> "COT_MAPPING_SPOTMAP//" + * Kind_CustomIcon -> "//.png" + * Stored end-to-end without prefix stripping; the ~19 bytes saved by + * stripping well-known prefixes are not worth the builder-side bug + * surface, and the dict compresses the repetition effectively. + * + * @generated from field: string iconset = 8; + */ + iconset: string; +}; + +/** + * Describes the message meshtastic.Marker. + * Use `create(MarkerSchema)` to create a new message. + */ +export const MarkerSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 9); + +/** + * + * Marker kind. Used to pick sensible receiver defaults when the CoT type + * alone is ambiguous (e.g. a-u-G could be a 2525 symbol or a custom icon + * depending on the iconset path). + * + * @generated from enum meshtastic.Marker.Kind + */ +export enum Marker_Kind { + /** + * + * Unspecified — fall back to TAKPacketV2.cot_type_id + * + * @generated from enum value: Kind_Unspecified = 0; + */ + Unspecified = 0, + + /** + * + * b-m-p-s-m: Spot map marker + * + * @generated from enum value: Kind_Spot = 1; + */ + Spot = 1, + + /** + * + * b-m-p-w: Route waypoint + * + * @generated from enum value: Kind_Waypoint = 2; + */ + Waypoint = 2, + + /** + * + * b-m-p-c: Checkpoint + * + * @generated from enum value: Kind_Checkpoint = 3; + */ + Checkpoint = 3, + + /** + * + * b-m-p-s-p-i / b-m-p-s-p-loc: Self-position marker + * + * @generated from enum value: Kind_SelfPosition = 4; + */ + SelfPosition = 4, + + /** + * + * 2525B/C military symbol (iconsetpath = COT_MAPPING_2525B/...) + * + * @generated from enum value: Kind_Symbol2525 = 5; + */ + Symbol2525 = 5, + + /** + * + * COT_MAPPING_SPOTMAP icon (e.g. colored dot) + * + * @generated from enum value: Kind_SpotMap = 6; + */ + SpotMap = 6, + + /** + * + * Custom icon set (UUID/GroupName/filename.png) + * + * @generated from enum value: Kind_CustomIcon = 7; + */ + CustomIcon = 7, + + /** + * + * b-m-p-w-GOTO: Go To / bloodhound navigation waypoint. + * + * @generated from enum value: Kind_GoToPoint = 8; + */ + GoToPoint = 8, + + /** + * + * b-m-p-c-ip: Initial point (mission planning control point). + * + * @generated from enum value: Kind_InitialPoint = 9; + */ + InitialPoint = 9, + + /** + * + * b-m-p-c-cp: Contact point (mission planning control point). + * + * @generated from enum value: Kind_ContactPoint = 10; + */ + ContactPoint = 10, + + /** + * + * b-m-p-s-p-op: Observation post. + * + * @generated from enum value: Kind_ObservationPost = 11; + */ + ObservationPost = 11, + + /** + * + * b-i-x-i: Quick Pic geotagged image marker. iconset carries the + * image reference (local filename or remote URL); the image itself + * does not ride on the LoRa wire. + * + * @generated from enum value: Kind_ImageMarker = 12; + */ + ImageMarker = 12, +} + +/** + * Describes the enum meshtastic.Marker.Kind. + */ +export const Marker_KindSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 9, 0); + +/** + * + * Range and bearing measurement line from the event anchor to a target point. + * + * Covers CoT type u-rb-a. The anchor position is on + * TAKPacketV2.latitude_i/longitude_i; the target endpoint is carried as a + * CotGeoPoint — same delta-from-anchor encoding used by DrawnShape.vertices + * so a self-anchored RAB (common case) encodes in zero bytes. + * + * @generated from message meshtastic.RangeAndBearing + */ +export type RangeAndBearing = Message<"meshtastic.RangeAndBearing"> & { + /** + * + * Target/anchor endpoint (delta-encoded from TAKPacketV2.latitude_i/longitude_i). + * + * @generated from field: meshtastic.CotGeoPoint anchor = 1; + */ + anchor?: CotGeoPoint | undefined; + + /** + * + * Anchor UID (from ). Empty = free-standing. + * + * @generated from field: string anchor_uid = 2; + */ + anchorUid: string; + + /** + * + * Range in centimeters (value * 100). Range 0..4294 km. + * + * @generated from field: uint32 range_cm = 3; + */ + rangeCm: number; + + /** + * + * Bearing in degrees * 100 (0..36000). + * + * @generated from field: uint32 bearing_cdeg = 4; + */ + bearingCdeg: number; + + /** + * + * Stroke color as a Team palette entry. See DrawnShape.stroke_color doc. + * + * @generated from field: meshtastic.Team stroke_color = 5; + */ + strokeColor: Team; + + /** + * + * Stroke color exact ARGB fallback. + * + * @generated from field: fixed32 stroke_argb = 6; + */ + strokeArgb: number; + + /** + * + * Stroke weight * 10 (e.g. 30 = 3.0). + * + * @generated from field: uint32 stroke_weight_x10 = 7; + */ + strokeWeightX10: number; +}; + +/** + * Describes the message meshtastic.RangeAndBearing. + * Use `create(RangeAndBearingSchema)` to create a new message. + */ +export const RangeAndBearingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 10); + +/** + * + * Named route consisting of ordered waypoints and control points. + * + * Covers CoT type b-m-r. The first waypoint's position is on + * TAKPacketV2.latitude_i/longitude_i; subsequent waypoints and checkpoints + * are in `links`. Link count is capped at 16 by the nanopb pool; senders + * MUST truncate longer routes and set `truncated = true`. + * + * @generated from message meshtastic.Route + */ +export type Route = Message<"meshtastic.Route"> & { + /** + * + * Travel method + * + * @generated from field: meshtastic.Route.Method method = 1; + */ + method: Route_Method; + + /** + * + * Direction (infil/exfil) + * + * @generated from field: meshtastic.Route.Direction direction = 2; + */ + direction: Route_Direction; + + /** + * + * Waypoint name prefix (e.g. "CP"). + * + * @generated from field: string prefix = 3; + */ + prefix: string; + + /** + * + * Stroke weight * 10 (e.g. 30 = 3.0). 0 = default. + * + * @generated from field: uint32 stroke_weight_x10 = 4; + */ + strokeWeightX10: number; + + /** + * + * Ordered list of route control points. Capped at 16. + * + * @generated from field: repeated meshtastic.Route.Link links = 5; + */ + links: Route_Link[]; + + /** + * + * True if the sender truncated `links` to fit the pool. + * + * @generated from field: bool truncated = 6; + */ + truncated: boolean; +}; + +/** + * Describes the message meshtastic.Route. + * Use `create(RouteSchema)` to create a new message. + */ +export const RouteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 11); + +/** + * + * Route waypoint or control point. Each link corresponds to one ATAK + * entry inside the b-m-r event. + * + * @generated from message meshtastic.Route.Link + */ +export type Route_Link = Message<"meshtastic.Route.Link"> & { + /** + * + * Waypoint position (delta-encoded from TAKPacketV2.latitude_i/longitude_i). + * + * @generated from field: meshtastic.CotGeoPoint point = 1; + */ + point?: CotGeoPoint | undefined; + + /** + * + * Optional UID (empty = receiver derives). + * + * @generated from field: string uid = 2; + */ + uid: string; + + /** + * + * Optional display callsign (e.g. "CP1"). Empty for unnamed control points. + * + * @generated from field: string callsign = 3; + */ + callsign: string; + + /** + * + * Link role: 0 = waypoint (b-m-p-w), 1 = checkpoint (b-m-p-c). + * + * @generated from field: uint32 link_type = 4; + */ + linkType: number; +}; + +/** + * Describes the message meshtastic.Route.Link. + * Use `create(Route_LinkSchema)` to create a new message. + */ +export const Route_LinkSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 11, 0); + +/** + * + * Travel method for the route. + * + * @generated from enum meshtastic.Route.Method + */ +export enum Route_Method { + /** + * + * Unspecified / unknown + * + * @generated from enum value: Method_Unspecified = 0; + */ + Unspecified = 0, + + /** + * + * Driving / vehicle + * + * @generated from enum value: Method_Driving = 1; + */ + Driving = 1, + + /** + * + * Walking / foot + * + * @generated from enum value: Method_Walking = 2; + */ + Walking = 2, + + /** + * + * Flying + * + * @generated from enum value: Method_Flying = 3; + */ + Flying = 3, + + /** + * + * Swimming (individual) + * + * @generated from enum value: Method_Swimming = 4; + */ + Swimming = 4, + + /** + * + * Watercraft (boat) + * + * @generated from enum value: Method_Watercraft = 5; + */ + Watercraft = 5, +} + +/** + * Describes the enum meshtastic.Route.Method. + */ +export const Route_MethodSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 11, 0); + +/** + * + * Route direction (infil = ingress, exfil = egress). + * + * @generated from enum meshtastic.Route.Direction + */ +export enum Route_Direction { + /** + * + * Unspecified + * + * @generated from enum value: Direction_Unspecified = 0; + */ + Unspecified = 0, + + /** + * + * Infiltration (ingress) + * + * @generated from enum value: Direction_Infil = 1; + */ + Infil = 1, + + /** + * + * Exfiltration (egress) + * + * @generated from enum value: Direction_Exfil = 2; + */ + Exfil = 2, +} + +/** + * Describes the enum meshtastic.Route.Direction. + */ +export const Route_DirectionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 11, 1); + +/** + * + * 9-line MEDEVAC request (CoT type b-r-f-h-c). + * + * Mirrors the ATAK MedLine tool's <_medevac_> detail element. Every field + * is optional (proto3 default); senders omit lines they don't have. The + * envelope (TAKPacketV2.uid, cot_type_id=b-r-f-h-c, latitude_i/longitude_i, + * altitude, callsign) carries Line 1 (location) and Line 2 (callsign). + * + * All numeric fields are tight varints so a complete 9-line request fits + * in well under 100 bytes of proto on the wire. + * + * @generated from message meshtastic.CasevacReport + */ +export type CasevacReport = Message<"meshtastic.CasevacReport"> & { + /** + * + * Line 3: precedence / urgency. + * + * @generated from field: meshtastic.CasevacReport.Precedence precedence = 1; + */ + precedence: CasevacReport_Precedence; + + /** + * + * Line 4: special equipment required, as a bitfield. + * bit 0: none + * bit 1: hoist + * bit 2: extraction equipment + * bit 3: ventilator + * bit 4: blood + * + * @generated from field: uint32 equipment_flags = 2; + */ + equipmentFlags: number; + + /** + * + * Line 5: number of litter (stretcher-bound) patients. + * + * @generated from field: uint32 litter_patients = 3; + */ + litterPatients: number; + + /** + * + * Line 5: number of ambulatory (walking-wounded) patients. + * + * @generated from field: uint32 ambulatory_patients = 4; + */ + ambulatoryPatients: number; + + /** + * + * Line 6: security situation at the PZ. + * + * @generated from field: meshtastic.CasevacReport.Security security = 5; + */ + security: CasevacReport_Security; + + /** + * + * Line 7: HLZ marking method. + * + * @generated from field: meshtastic.CasevacReport.HlzMarking hlz_marking = 6; + */ + hlzMarking: CasevacReport_HlzMarking; + + /** + * + * Line 7 supplementary: short free-text describing the zone marker + * (e.g. "Green smoke", "VS-17 panel west"). Capped tight in options. + * + * @generated from field: string zone_marker = 7; + */ + zoneMarker: string; + + /** + * --- Line 8: patient nationality counts --- + * + * @generated from field: uint32 us_military = 8; + */ + usMilitary: number; + + /** + * @generated from field: uint32 us_civilian = 9; + */ + usCivilian: number; + + /** + * @generated from field: uint32 non_us_military = 10; + */ + nonUsMilitary: number; + + /** + * @generated from field: uint32 non_us_civilian = 11; + */ + nonUsCivilian: number; + + /** + * enemy prisoner of war + * + * @generated from field: uint32 epw = 12; + */ + epw: number; + + /** + * @generated from field: uint32 child = 13; + */ + child: number; + + /** + * + * Line 9: terrain and obstacles at the PZ, as a bitfield. + * bit 0: slope + * bit 1: rough + * bit 2: loose + * bit 3: trees + * bit 4: wires + * bit 5: other + * + * @generated from field: uint32 terrain_flags = 14; + */ + terrainFlags: number; + + /** + * + * Line 2: radio frequency / callsign metadata (e.g. "38.90 Mhz" or + * "Victor 6"). Capped tight in options. + * + * @generated from field: string frequency = 15; + */ + frequency: string; + + /** + * + * Short title / MEDEVAC identifier (e.g. "EAGLE.15.181230"). Usually the + * same as the envelope callsign but ATAK sometimes carries a distinct + * ops-number here. + * + * @generated from field: string title = 16; + */ + title: string; + + /** + * + * Primary medline free-text — the single most clinically important line + * on a MEDLINE form (e.g. "2 urgent litter patients, smoke on approach"). + * MUST be preserved under MTU pressure as long as any casevac is sent. + * + * @generated from field: string medline_remarks = 17; + */ + medlineRemarks: string; + + /** + * + * Line 3 (newer ATAK format): patient counts by precedence level. + * Coexists with the enum-style `precedence` field (tag 1) — older ATAK + * emits a single enum, newer ATAK emits these counts, and both can be + * set simultaneously. Senders populate whichever style(s) the source + * XML had; receivers prefer counts when non-zero. + * + * @generated from field: uint32 urgent_count = 18; + */ + urgentCount: number; + + /** + * @generated from field: uint32 urgent_surgical_count = 19; + */ + urgentSurgicalCount: number; + + /** + * @generated from field: uint32 priority_count = 20; + */ + priorityCount: number; + + /** + * @generated from field: uint32 routine_count = 21; + */ + routineCount: number; + + /** + * @generated from field: uint32 convenience_count = 22; + */ + convenienceCount: number; + + /** + * + * Line 4 supplementary: free-text description of non-standard equipment + * (e.g. "Blood warmer"). Pairs with the `equipment_flags` bitfield. + * + * @generated from field: string equipment_detail = 23; + */ + equipmentDetail: string; + + /** + * + * Line 1 override: MGRS grid when distinct from the event anchor point + * (e.g. "34T CQ 12345 67890"). Event lat/lon/hae still carries the + * numeric location; this field preserves the exact MGRS string the + * medic entered. + * + * @generated from field: string zone_protected_coord = 24; + */ + zoneProtectedCoord: string; + + /** + * + * Line 9 supplementary: slope direction (e.g. "N", "NE", "SSW") when + * `terrain_flags` bit 0 (slope) is set. + * + * @generated from field: string terrain_slope_dir = 25; + */ + terrainSlopeDir: string; + + /** + * + * Line 9 supplementary: free-text description of "other" terrain hazards + * (e.g. "Loose debris on west edge") when `terrain_flags` bit 5 (other) + * is set. Tier-2 strippable under MTU pressure. + * + * @generated from field: string terrain_other_detail = 26; + */ + terrainOtherDetail: string; + + /** + * + * Line 7 supplementary: how the zone is being marked right now + * (e.g. "Orange smoke", "VS-17 panel"). Complements the structured + * `hlz_marking` enum with a specific human-readable description. + * + * @generated from field: string marked_by = 27; + */ + markedBy: string; + + /** + * + * Nearby obstacles on the approach (e.g. "Power lines north of HLZ"). + * + * @generated from field: string obstacles = 28; + */ + obstacles: string; + + /** + * + * Wind direction and speed (e.g. "270 at 12 kts"). + * + * @generated from field: string winds_are_from = 29; + */ + windsAreFrom: string; + + /** + * + * Friendly forces posture near the pickup zone + * (e.g. "Squad east of HLZ"). + * + * @generated from field: string friendlies = 30; + */ + friendlies: string; + + /** + * + * Known or suspected enemy positions near the pickup zone + * (e.g. "Possible enemy on south ridge"). + * + * @generated from field: string enemy = 31; + */ + enemy: string; + + /** + * + * Free-text description of the HLZ itself + * (e.g. "Primary HLZ is soccer field"). + * + * @generated from field: string hlz_remarks = 32; + */ + hlzRemarks: string; + + /** + * + * Per-patient clinical records. Each entry is one patient's ZMIST card + * (Zap number / Mechanism / Injuries / Signs / Treatment). Repeatable — + * a mass-casualty event can carry 1-6 entries in practice, limited by + * the 237 B LoRa MTU. + * + * @generated from field: repeated meshtastic.ZMistEntry zmist = 33; + */ + zmist: ZMistEntry[]; +}; + +/** + * Describes the message meshtastic.CasevacReport. + * Use `create(CasevacReportSchema)` to create a new message. + */ +export const CasevacReportSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 12); + +/** + * + * Line 3: precedence / urgency. + * + * @generated from enum meshtastic.CasevacReport.Precedence + */ +export enum CasevacReport_Precedence { + /** + * @generated from enum value: Precedence_Unspecified = 0; + */ + Unspecified = 0, + + /** + * A - immediate, life-threatening + * + * @generated from enum value: Precedence_Urgent = 1; + */ + Urgent = 1, + + /** + * B - needs surgery + * + * @generated from enum value: Precedence_UrgentSurgical = 2; + */ + UrgentSurgical = 2, + + /** + * C - within 4 hours + * + * @generated from enum value: Precedence_Priority = 3; + */ + Priority = 3, + + /** + * D - within 24 hours + * + * @generated from enum value: Precedence_Routine = 4; + */ + Routine = 4, + + /** + * E - convenience + * + * @generated from enum value: Precedence_Convenience = 5; + */ + Convenience = 5, +} + +/** + * Describes the enum meshtastic.CasevacReport.Precedence. + */ +export const CasevacReport_PrecedenceSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 12, 0); + +/** + * + * Line 7: HLZ marking method. + * + * @generated from enum meshtastic.CasevacReport.HlzMarking + */ +export enum CasevacReport_HlzMarking { + /** + * @generated from enum value: HlzMarking_Unspecified = 0; + */ + HlzMarking_Unspecified = 0, + + /** + * @generated from enum value: HlzMarking_Panels = 1; + */ + HlzMarking_Panels = 1, + + /** + * @generated from enum value: HlzMarking_PyroSignal = 2; + */ + HlzMarking_PyroSignal = 2, + + /** + * @generated from enum value: HlzMarking_Smoke = 3; + */ + HlzMarking_Smoke = 3, + + /** + * @generated from enum value: HlzMarking_None = 4; + */ + HlzMarking_None = 4, + + /** + * @generated from enum value: HlzMarking_Other = 5; + */ + HlzMarking_Other = 5, +} + +/** + * Describes the enum meshtastic.CasevacReport.HlzMarking. + */ +export const CasevacReport_HlzMarkingSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 12, 1); + +/** + * + * Line 6: security situation at the pickup zone. + * + * @generated from enum meshtastic.CasevacReport.Security + */ +export enum CasevacReport_Security { + /** + * @generated from enum value: Security_Unspecified = 0; + */ + Unspecified = 0, + + /** + * N - no enemy activity + * + * @generated from enum value: Security_NoEnemy = 1; + */ + NoEnemy = 1, + + /** + * P - possible enemy + * + * @generated from enum value: Security_PossibleEnemy = 2; + */ + PossibleEnemy = 2, + + /** + * E - enemy, approach with caution + * + * @generated from enum value: Security_EnemyInArea = 3; + */ + EnemyInArea = 3, + + /** + * X - armed escort required + * + * @generated from enum value: Security_EnemyInArmedContact = 4; + */ + EnemyInArmedContact = 4, +} + +/** + * Describes the enum meshtastic.CasevacReport.Security. + */ +export const CasevacReport_SecuritySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 12, 2); + +/** + * + * Per-patient clinical summary record — one entry per patient in a CASEVAC. + * Maps directly to ATAK's child element inside . + * All fields are optional free-text; senders populate what they have. + * + * @generated from message meshtastic.ZMistEntry + */ +export type ZMistEntry = Message<"meshtastic.ZMistEntry"> & { + /** + * + * Patient identifier / sequence label (e.g. "ZMIST-1", "ZMIST-2"). + * + * @generated from field: string title = 1; + */ + title: string; + + /** + * + * Zap number — unique patient tracking ID (often a terse code like + * "Gunshot" or a serial). + * + * @generated from field: string z = 2; + */ + z: string; + + /** + * + * Mechanism of injury (e.g. "Penetrating trauma", "Blast injury"). + * + * @generated from field: string m = 3; + */ + m: string; + + /** + * + * Injuries observed (e.g. "Left thigh", "Concussion"). + * + * @generated from field: string i = 4; + */ + i: string; + + /** + * + * Signs / vital stats (e.g. "Stable", "Priority", "BP 110/70"). + * + * @generated from field: string s = 5; + */ + s: string; + + /** + * + * Treatment given (e.g. "Tourniquet 1810Z", "O2 administered"). + * + * @generated from field: string t = 6; + */ + t: string; +}; + +/** + * Describes the message meshtastic.ZMistEntry. + * Use `create(ZMistEntrySchema)` to create a new message. + */ +export const ZMistEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 13); + +/** + * + * Emergency alert / 911 beacon (CoT types b-a-o-tbl, b-a-o-pan, b-a-o-opn, + * b-a-o-can, b-a-o-c, b-a-g). + * + * Small, high-priority structured record. The CoT type string is still set + * on cot_type_id so receivers that ignore payload_variant can still display + * the alert from the enum alone; the typed fields let modern receivers show + * the authoring unit and handle cancel-referencing without XML parsing. + * + * @generated from message meshtastic.EmergencyAlert + */ +export type EmergencyAlert = Message<"meshtastic.EmergencyAlert"> & { + /** + * + * Alert discriminator. + * + * @generated from field: meshtastic.EmergencyAlert.Type type = 1; + */ + type: EmergencyAlert_Type; + + /** + * + * UID of the unit that raised the alert. Often the same as + * TAKPacketV2.uid but can be a parent device uid when a tracker raises + * an alert on behalf of a dismount. + * + * @generated from field: string authoring_uid = 2; + */ + authoringUid: string; + + /** + * + * For Type_Cancel: the uid of the alert being cancelled. Empty for + * non-cancel alert types. + * + * @generated from field: string cancel_reference_uid = 3; + */ + cancelReferenceUid: string; +}; + +/** + * Describes the message meshtastic.EmergencyAlert. + * Use `create(EmergencyAlertSchema)` to create a new message. + */ +export const EmergencyAlertSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 14); + +/** + * @generated from enum meshtastic.EmergencyAlert.Type + */ +export enum EmergencyAlert_Type { + /** + * @generated from enum value: Type_Unspecified = 0; + */ + Unspecified = 0, + + /** + * b-a-o-tbl + * + * @generated from enum value: Type_Alert911 = 1; + */ + Alert911 = 1, + + /** + * b-a-o-pan + * + * @generated from enum value: Type_RingTheBell = 2; + */ + RingTheBell = 2, + + /** + * b-a-o-opn + * + * @generated from enum value: Type_InContact = 3; + */ + InContact = 3, + + /** + * b-a-g + * + * @generated from enum value: Type_GeoFenceBreached = 4; + */ + GeoFenceBreached = 4, + + /** + * b-a-o-c + * + * @generated from enum value: Type_Custom = 5; + */ + Custom = 5, + + /** + * b-a-o-can + * + * @generated from enum value: Type_Cancel = 6; + */ + Cancel = 6, +} + +/** + * Describes the enum meshtastic.EmergencyAlert.Type. + */ +export const EmergencyAlert_TypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 14, 0); + +/** + * + * Task / engage request (CoT type t-s). + * + * Mirrors ATAK's TaskCotReceiver / CotTaskBuilder workflow. The envelope + * carries the task's originating uid (implicit requester), position, and + * creation time; the fields below carry structured metadata the raw-detail + * fallback currently loses. + * + * Fields are deliberately lean — this variant is closer to the MTU ceiling + * than the others, so every string is capped in options. + * + * @generated from message meshtastic.TaskRequest + */ +export type TaskRequest = Message<"meshtastic.TaskRequest"> & { + /** + * + * Short tag for the task category (e.g. "engage", "observe", "recon", + * "rescue"). Free text on the wire so ATAK-specific task taxonomies + * don't need proto coordination; capped tight in options. + * + * @generated from field: string task_type = 1; + */ + taskType: string; + + /** + * + * UID of the target / map item being tasked. + * + * @generated from field: string target_uid = 2; + */ + targetUid: string; + + /** + * + * UID of the assigned unit. Empty = unassigned / broadcast task. + * + * @generated from field: string assignee_uid = 3; + */ + assigneeUid: string; + + /** + * @generated from field: meshtastic.TaskRequest.Priority priority = 4; + */ + priority: TaskRequest_Priority; + + /** + * @generated from field: meshtastic.TaskRequest.Status status = 5; + */ + status: TaskRequest_Status; + + /** + * + * Optional short note (reason, constraints, grid reference). Capped + * tight in options to keep the worst-case under the LoRa MTU. + * + * @generated from field: string note = 6; + */ + note: string; +}; + +/** + * Describes the message meshtastic.TaskRequest. + * Use `create(TaskRequestSchema)` to create a new message. + */ +export const TaskRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 15); + +/** + * @generated from enum meshtastic.TaskRequest.Priority + */ +export enum TaskRequest_Priority { + /** + * @generated from enum value: Priority_Unspecified = 0; + */ + Unspecified = 0, + + /** + * @generated from enum value: Priority_Low = 1; + */ + Low = 1, + + /** + * @generated from enum value: Priority_Normal = 2; + */ + Normal = 2, + + /** + * @generated from enum value: Priority_High = 3; + */ + High = 3, + + /** + * @generated from enum value: Priority_Critical = 4; + */ + Critical = 4, +} + +/** + * Describes the enum meshtastic.TaskRequest.Priority. + */ +export const TaskRequest_PrioritySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 15, 0); + +/** + * @generated from enum meshtastic.TaskRequest.Status + */ +export enum TaskRequest_Status { + /** + * @generated from enum value: Status_Unspecified = 0; + */ + Unspecified = 0, + + /** + * assigned, not yet acknowledged + * + * @generated from enum value: Status_Pending = 1; + */ + Pending = 1, + + /** + * assignee has seen it + * + * @generated from enum value: Status_Acknowledged = 2; + */ + Acknowledged = 2, + + /** + * assignee is working it + * + * @generated from enum value: Status_InProgress = 3; + */ + InProgress = 3, + + /** + * task done + * + * @generated from enum value: Status_Completed = 4; + */ + Completed = 4, + + /** + * cancelled before completion + * + * @generated from enum value: Status_Cancelled = 5; + */ + Cancelled = 5, +} + +/** + * Describes the enum meshtastic.TaskRequest.Status. + */ +export const TaskRequest_StatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 15, 1); + +/** + * + * Weather annotation from CoT detail element. + * + * Attaches to any TAKPacketV2 regardless of payload_variant — an Aircraft, + * PLI, or Marker can all carry observed conditions at the emitting station. + * ATAK-CIV ships an XSD for but no dedicated handler, so the + * element round-trips through the generic detail pipeline; this message + * promotes it to a first-class structured field. + * + * Target wire cost: ~6-8 bytes compressed with a fully populated instance. + * + * Named `TAKEnvironment` (not just `Environment`) because the bare name + * collides with `SwiftUI.Environment` — every SwiftUI view in a consuming + * iOS app uses the `@Environment` property wrapper, and importing the + * generated proto module would make `Environment` ambiguous in every one + * of those files. The `TAK` prefix matches the convention used by the + * outer `TAKPacketV2` wrapper and is unambiguous across all target + * languages (Swift, Kotlin, Python, TypeScript, C#). + * + * @generated from message meshtastic.TAKEnvironment + */ +export type TAKEnvironment = Message<"meshtastic.TAKEnvironment"> & { + /** + * + * Temperature in deci-degrees Celsius. 225 = 22.5°C. + * Range covers -50°C to +50°C (-500 to +500) which spans every realistic + * outdoor TAK deployment. sint32 because negative temps are common in + * cold-weather ops. + * + * @generated from field: sint32 temperature_c_x10 = 1; + */ + temperatureCX10: number; + + /** + * + * Wind direction in whole degrees, 0-359. "Direction FROM" per + * meteorological convention (matches CoT / ATAK). + * + * @generated from field: uint32 wind_direction_deg = 2; + */ + windDirectionDeg: number; + + /** + * + * Wind speed in cm/s. Matches the unit of TAKPacketV2.speed for + * consistency. 1200 = 12.00 m/s = ~27 mph. + * + * @generated from field: uint32 wind_speed_cm_s = 3; + */ + windSpeedCmS: number; +}; + +/** + * Describes the message meshtastic.TAKEnvironment. + * Use `create(TAKEnvironmentSchema)` to create a new message. + */ +export const TAKEnvironmentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 16); + +/** + * + * Sensor field-of-view cone from CoT detail element. + * + * Encodes the 8 geometry attributes that ATAK-CIV's SensorDetailHandler + * reads from the wire; drops the 9 visual-styling attributes that are + * receiver-side render hints (fovAlpha, fovRed/Green/Blue, strokeColor, + * strokeWeight, displayMagneticReference, hideFov, fovLabels, rangeLines). + * The receiving ATAK client restores those from its own defaults, same as + * every other CoT carried over Meshtastic today. + * + * Attaches to any TAKPacketV2 — a PLI with a sensor on the operator's head, + * an Aircraft with a FLIR turret, a Marker dropped on a UAV. + * Target wire cost: ~7-14 bytes compressed (dominated by model string). + * + * @generated from message meshtastic.SensorFov + */ +export type SensorFov = Message<"meshtastic.SensorFov"> & { + /** + * @generated from field: meshtastic.SensorFov.SensorType type = 1; + */ + type: SensorFov_SensorType; + + /** + * + * Azimuth in whole degrees, 0-359. "Pointing direction" of the cone axis, + * measured clockwise from true north. Whole degrees match ATAK-CIV's + * SensorDetailHandler default (270°) and save varint bytes over centi-deg. + * + * @generated from field: uint32 azimuth_deg = 2; + */ + azimuthDeg: number; + + /** + * + * Maximum range of the cone in meters. + * Optional — if unset, receivers should use the ATAK-CIV default of 100m. + * + * @generated from field: optional uint32 range_m = 3; + */ + rangeM?: number | undefined; + + /** + * + * Horizontal field of view in whole degrees (cone's angular width). + * ATAK-CIV default is 45°. + * + * @generated from field: uint32 fov_horizontal_deg = 4; + */ + fovHorizontalDeg: number; + + /** + * + * Vertical field of view in whole degrees. ATAK-CIV default is 45°. + * Optional — a value of 0 means "not set / use horizontal FOV". + * + * @generated from field: uint32 fov_vertical_deg = 5; + */ + fovVerticalDeg: number; + + /** + * + * Elevation angle in whole degrees. Positive = up, negative = down. + * Range -90 to +90. sint32 for varint efficiency on small negatives. + * + * @generated from field: sint32 elevation_deg = 6; + */ + elevationDeg: number; + + /** + * + * Roll (camera tilt) in whole degrees, -180 to +180. + * Optional — use 0 if the sensor doesn't track roll. + * + * @generated from field: sint32 roll_deg = 7; + */ + rollDeg: number; + + /** + * + * Free-form device model identifier, e.g. "FLIR-Boson-640", "SEEK". + * Optional — empty string means "unknown model" (ATAK-CIV default). + * + * @generated from field: string model = 8; + */ + model: string; +}; + +/** + * Describes the message meshtastic.SensorFov. + * Use `create(SensorFovSchema)` to create a new message. + */ +export const SensorFovSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 17); + +/** + * + * Coarse sensor category, inferred from `model` on parse when the source + * XML doesn't label it. Receivers that render differently per sensor + * class (thermal overlay vs daylight cone) use this. + * + * @generated from enum meshtastic.SensorFov.SensorType + */ +export enum SensorFov_SensorType { + /** + * @generated from enum value: SensorType_Unspecified = 0; + */ + SensorType_Unspecified = 0, + + /** + * daylight / general optical + * + * @generated from enum value: SensorType_Camera = 1; + */ + SensorType_Camera = 1, + + /** + * FLIR, thermal imager + * + * @generated from enum value: SensorType_Thermal = 2; + */ + SensorType_Thermal = 2, + + /** + * rangefinder, LRF, designator + * + * @generated from enum value: SensorType_Laser = 3; + */ + SensorType_Laser = 3, + + /** + * night vision goggles + * + * @generated from enum value: SensorType_Nvg = 4; + */ + SensorType_Nvg = 4, + + /** + * radio/radar direction-finding + * + * @generated from enum value: SensorType_Rf = 5; + */ + SensorType_Rf = 5, + + /** + * @generated from enum value: SensorType_Other = 6; + */ + SensorType_Other = 6, +} + +/** + * Describes the enum meshtastic.SensorFov.SensorType. + */ +export const SensorFov_SensorTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 17, 0); + +/** + * + * TAKTALK chat message payload (CoT type m-t-t). + * + * TAKTALK is an ATAK plugin for voice + text team messaging. The voice + * audio stream goes over UDP/RTP and is NOT carried by the mesh — only + * the text envelope (this message) is. `from_voice` marks messages sent + * via push-to-talk speech-to-text so receivers can render a mic icon + * next to the text. + * + * Wire shape inside /: + * ... - mapped to TAKPacketV2.callsign + * English - lang + * ... - text + * 1 - chatroom_id + * - presence sets from_voice = true + * + * @generated from message meshtastic.TakTalkMessage + */ +export type TakTalkMessage = Message<"meshtastic.TakTalkMessage"> & { + /** + * + * The text body of the TAKTALK message (speech-to-text transcript when + * from_voice = true, typed message otherwise). + * + * @generated from field: string text = 1; + */ + text: string; + + /** + * + * TAKTALK chatroom identifier. May be a short id like "1" for the + * default room or a UUID like "30b2755c-c547-44ef-a0cc-cdbd8a15616f" + * for custom rooms (resolved by TakTalkRoomData broadcasts). + * Empty = broadcast room. + * + * @generated from field: string chatroom_id = 2; + */ + chatroomId: string; + + /** + * + * BCP-47-ish language tag or human-readable name (e.g. "en", "English"). + * Empty = unspecified. + * + * @generated from field: string lang = 3; + */ + lang: string; + + /** + * + * True when the source CoT carried a marker, i.e. the message + * originated as push-to-talk speech-to-text. Lets receivers show a mic + * icon. Proto3 only encodes when true so empty payload cost is 0 bytes. + * + * @generated from field: bool from_voice = 4; + */ + fromVoice: boolean; +}; + +/** + * Describes the message meshtastic.TakTalkMessage. + * Use `create(TakTalkMessageSchema)` to create a new message. + */ +export const TakTalkMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 18); + +/** + * + * TAKTALK room/membership broadcast (CoT type y-). + * + * Announces a TAKTALK chatroom's friendly name and roster so peers can + * resolve room UUIDs (used in TakTalkMessage.chatroom_id and + * GeoChat.room_id) to a display name and participant list. Not a chat + * message itself — these events are emitted by TAKTALK when rooms are + * created or memberships change. + * + * @generated from message meshtastic.TakTalkRoomData + */ +export type TakTalkRoomData = Message<"meshtastic.TakTalkRoomData"> & { + /** + * + * Callsign of the device broadcasting the room state (typically the + * room owner / latest writer). + * + * DEPRECATED in v0.3.2: always equals TAKPacketV2.callsign, so the wire + * byte was redundant. Builders stop emitting this field in v0.3.2; + * parsers still read it for one release so v0.3.1-encoded packets decode + * cleanly. To be removed entirely in v0.4.x. + * + * @generated from field: string sender_callsign = 1 [deprecated = true]; + * @deprecated + */ + senderCallsign: string; + + /** + * + * Room UUID, matches TakTalkMessage.chatroom_id / GeoChat.room_id on + * messages routed into this room. + * + * @generated from field: string room_id = 2; + */ + roomId: string; + + /** + * + * Friendly display name for the room (e.g. "test", "Alpha Team"). + * + * @generated from field: string room_name = 3; + */ + roomName: string; + + /** + * + * Member callsigns. Wire-encoded as repeated strings; the underlying + * CoT carries them as a single A,B,C element + * which parsers split / builders join on ','. + * + * @generated from field: repeated string participants = 4; + */ + participants: string[]; +}; + +/** + * Describes the message meshtastic.TakTalkRoomData. + * Use `create(TakTalkRoomDataSchema)` to create a new message. + */ +export const TakTalkRoomDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 19); + +/** + * + * ATAK directed-routing recipient list (CoT …). + * + * Present when an event is addressed to specific TAK users rather than the + * broadcast group. TAKTALK gates voice TTS on this element matching the + * receiver's callsign; directed b-t-f chats use it for the same purpose. A + * missing means "broadcast to all peers", which is the default for + * PLI, alerts, drawings, and most situational-awareness events. + * + * Carried as repeated strings (not indexes into a per-packet table) because + * the typical event has 1-2 destinations and table overhead would erase the + * savings. Receivers that need the original XML element rebuild it from + * dest_callsign on emit. + * + * @generated from message meshtastic.Marti + */ +export type Marti = Message<"meshtastic.Marti"> & { + /** + * + * Recipient callsigns. Order is preserved end-to-end so receivers can show + * primary-vs-cc distinction the same way ATAK does. + * + * If dest_callsign is [TAKPacketV2.callsign] (self-addressed, unusual but + * legal — e.g. ATAK echoing back to its own room), the builder still emits + * the element so loopback shapes round-trip cleanly. + * + * @generated from field: repeated string dest_callsign = 1; + */ + destCallsign: string[]; +}; + +/** + * Describes the message meshtastic.Marti. + * Use `create(MartiSchema)` to create a new message. + */ +export const MartiSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 20); + +/** + * + * ATAK v2 packet with expanded CoT field support and zstd dictionary compression. + * Sent on ATAK_PLUGIN_V2 port. The wire payload is: + * [1 byte flags][zstd-compressed TAKPacketV2 protobuf] + * Flags byte: bits 0-5 = dictionary ID, bits 6-7 = reserved. + * + * @generated from message meshtastic.TAKPacketV2 + */ +export type TAKPacketV2 = Message<"meshtastic.TAKPacketV2"> & { + /** + * + * Well-known CoT event type enum. + * Use CotType_Other with cot_type_str for unknown types. + * + * @generated from field: meshtastic.CotType cot_type_id = 1; + */ + cotTypeId: CotType; + + /** + * + * How the coordinates were generated + * + * @generated from field: meshtastic.CotHow how = 2; + */ + how: CotHow; + + /** + * + * Callsign + * + * @generated from field: string callsign = 3; + */ + callsign: string; + + /** + * + * Team color assignment + * + * @generated from field: meshtastic.Team team = 4; + */ + team: Team; + + /** + * + * Role of the group member + * + * @generated from field: meshtastic.MemberRole role = 5; + */ + role: MemberRole; + + /** + * + * Latitude, multiply by 1e-7 to get degrees in floating point + * + * @generated from field: sfixed32 latitude_i = 6; + */ + latitudeI: number; + + /** + * + * Longitude, multiply by 1e-7 to get degrees in floating point + * + * @generated from field: sfixed32 longitude_i = 7; + */ + longitudeI: number; + + /** + * + * Altitude in meters (HAE). ATAK's "no altitude" sentinel is hae=9999999.0. + * + * NOTE: an earlier v0.4.0 attempt made this `optional` to omit the 9999999 + * sentinel from the wire, but measurement showed it was net-negative: the + * zstd dictionary already compresses the literal 9999999 to ~nothing, while + * proto3 `optional` forces a genuine 0 m HAE (common on routes/drawings that + * carry hae="0.0" or omit hae → parsed as 0) to encode explicitly (+2 bytes), + * which REGRESSED the worst-case route fixture. Kept as a plain field. + * + * @generated from field: sint32 altitude = 8; + */ + altitude: number; + + /** + * + * Speed in cm/s + * + * @generated from field: uint32 speed = 9; + */ + speed: number; + + /** + * + * Course in degrees * 100 (0-36000) + * + * @generated from field: uint32 course = 10; + */ + course: number; + + /** + * + * Battery level 0-100 + * + * @generated from field: uint32 battery = 11; + */ + battery: number; + + /** + * + * Geopoint source + * + * @generated from field: meshtastic.GeoPointSource geo_src = 12; + */ + geoSrc: GeoPointSource; + + /** + * + * Altitude source + * + * @generated from field: meshtastic.GeoPointSource alt_src = 13; + */ + altSrc: GeoPointSource; + + /** + * + * Device UID (UUID string or device ID like "ANDROID-xxxx") + * + * @generated from field: string uid = 14; + */ + uid: string; + + /** + * + * Device callsign + * + * @generated from field: string device_callsign = 15; + */ + deviceCallsign: string; + + /** + * + * Stale time as seconds offset from event time + * + * @generated from field: uint32 stale_seconds = 16; + */ + staleSeconds: number; + + /** + * + * TAK client version string + * + * @generated from field: string tak_version = 17; + */ + takVersion: string; + + /** + * + * TAK device model + * + * @generated from field: string tak_device = 18; + */ + takDevice: string; + + /** + * + * TAK platform (ATAK-CIV, WebTAK, etc.) + * + * @generated from field: string tak_platform = 19; + */ + takPlatform: string; + + /** + * + * TAK OS version + * + * @generated from field: string tak_os = 20; + */ + takOs: string; + + /** + * + * Connection endpoint + * + * @generated from field: string endpoint = 21; + */ + endpoint: string; + + /** + * + * Phone number + * + * @generated from field: string phone = 22; + */ + phone: string; + + /** + * + * CoT event type string, only populated when cot_type_id is CotType_Other + * + * @generated from field: string cot_type_str = 23; + */ + cotTypeStr: string; + + /** + * + * Optional remarks / free-text annotation from the element. + * Populated for non-GeoChat payload types (shapes, markers, routes, etc.) + * when the original CoT event carried non-empty remarks text. + * GeoChat messages carry their text in GeoChat.message instead. + * Empty string (proto3 default) means no remarks were present. + * + * @generated from field: string remarks = 24; + */ + remarks: string; + + /** + * + * Observed weather conditions (temperature, wind). From . + * Type is `TAKEnvironment`, not `Environment`, to avoid colliding with + * SwiftUI's `@Environment` property wrapper in iOS consumers. + * + * @generated from field: optional meshtastic.TAKEnvironment environment = 25; + */ + environment?: TAKEnvironment | undefined; + + /** + * + * Sensor field-of-view cone (camera, FLIR, laser, etc.). From . + * + * @generated from field: optional meshtastic.SensorFov sensor_fov = 26; + */ + sensorFov?: SensorFov | undefined; + + /** + * + * Directed-routing recipient list (CoT …). + * Empty / unset = broadcast to all peers (the default for situational-awareness + * events). Populated for TAKTALK m-t-t, directed b-t-f DMs, and any other CoT + * shape that ATAK addresses to specific recipients. TAKTALK gates voice TTS + * playback on this element matching the receiver's callsign, so dropping it + * silently breaks voice messaging end-to-end. + * + * See Marti. + * + * @generated from field: optional meshtastic.Marti marti = 29; + */ + marti?: Marti | undefined; + + /** + * + * The payload of the packet + * + * Tag 30 was `bool pli` — a PLI carries no fields beyond the common + * envelope (position is in latitude_i/longitude_i), so the boolean was + * pure overhead (~3 wire bytes on every position beacon, the highest- + * frequency packet). PLI is now the IMPLICIT payload: a packet with NO + * payload_variant set decodes as a position report. Tag 30 is reserved at + * the message level (proto3 forbids `reserved` inside a oneof). + * + * @generated from oneof meshtastic.TAKPacketV2.payload_variant + */ + payloadVariant: { + /** + * + * ATAK GeoChat message + * + * @generated from field: meshtastic.GeoChat chat = 31; + */ + value: GeoChat; + case: "chat"; + } | { + /** + * + * Aircraft track data (ADS-B, military air) + * + * @generated from field: meshtastic.AircraftTrack aircraft = 32; + */ + value: AircraftTrack; + case: "aircraft"; + } | { + /** + * + * Generic CoT detail XML for unmapped types. Kept as a fallback for CoT + * types not yet promoted to a typed variant; drawings, markers, ranging + * tools, and routes have dedicated variants below and should not land here. + * + * @generated from field: bytes raw_detail = 33; + */ + value: Uint8Array; + case: "rawDetail"; + } | { + /** + * + * User-drawn tactical graphic: circle, rectangle, polygon, polyline, + * telestration, ranging circle, or bullseye. See DrawnShape. + * + * @generated from field: meshtastic.DrawnShape shape = 34; + */ + value: DrawnShape; + case: "shape"; + } | { + /** + * + * Fixed point of interest: spot marker, waypoint, checkpoint, 2525 + * symbol, or custom icon. See Marker. + * + * @generated from field: meshtastic.Marker marker = 35; + */ + value: Marker; + case: "marker"; + } | { + /** + * + * Range and bearing measurement line. See RangeAndBearing. + * + * @generated from field: meshtastic.RangeAndBearing rab = 36; + */ + value: RangeAndBearing; + case: "rab"; + } | { + /** + * + * Named route with ordered waypoints and control points. See Route. + * + * @generated from field: meshtastic.Route route = 37; + */ + value: Route; + case: "route"; + } | { + /** + * + * 9-line MEDEVAC request. See CasevacReport. + * + * @generated from field: meshtastic.CasevacReport casevac = 38; + */ + value: CasevacReport; + case: "casevac"; + } | { + /** + * + * Emergency beacon / 911 alert. See EmergencyAlert. + * + * @generated from field: meshtastic.EmergencyAlert emergency = 39; + */ + value: EmergencyAlert; + case: "emergency"; + } | { + /** + * + * Task / engage request. See TaskRequest. + * + * @generated from field: meshtastic.TaskRequest task = 40; + */ + value: TaskRequest; + case: "task"; + } | { + /** + * + * TAKTALK chat message (CoT type m-t-t). See TakTalkMessage. + * Voice audio itself rides UDP/RTP outside the mesh; this carries the + * text envelope plus a from_voice marker for receiver UX. + * + * @generated from field: meshtastic.TakTalkMessage taktalk = 41; + */ + value: TakTalkMessage; + case: "taktalk"; + } | { + /** + * + * TAKTALK room/membership broadcast (CoT type y-). See TakTalkRoomData. + * Resolves room UUIDs (used in TakTalkMessage.chatroom_id and + * GeoChat.room_id) to display name + roster on receivers. + * + * @generated from field: meshtastic.TakTalkRoomData taktalk_room = 42; + */ + value: TakTalkRoomData; + case: "taktalkRoom"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.TAKPacketV2. + * Use `create(TAKPacketV2Schema)` to create a new message. + */ +export const TAKPacketV2Schema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_atak, 21); + +/** + * @generated from enum meshtastic.Team + */ +export enum Team { + /** + * + * Unspecifed + * + * @generated from enum value: Unspecifed_Color = 0; + */ + Unspecifed_Color = 0, + + /** + * + * White + * + * @generated from enum value: White = 1; + */ + White = 1, + + /** + * + * Yellow + * + * @generated from enum value: Yellow = 2; + */ + Yellow = 2, + + /** + * + * Orange + * + * @generated from enum value: Orange = 3; + */ + Orange = 3, + + /** + * + * Magenta + * + * @generated from enum value: Magenta = 4; + */ + Magenta = 4, + + /** + * + * Red + * + * @generated from enum value: Red = 5; + */ + Red = 5, + + /** + * + * Maroon + * + * @generated from enum value: Maroon = 6; + */ + Maroon = 6, + + /** + * + * Purple + * + * @generated from enum value: Purple = 7; + */ + Purple = 7, + + /** + * + * Dark Blue + * + * @generated from enum value: Dark_Blue = 8; + */ + Dark_Blue = 8, + + /** + * + * Blue + * + * @generated from enum value: Blue = 9; + */ + Blue = 9, + + /** + * + * Cyan + * + * @generated from enum value: Cyan = 10; + */ + Cyan = 10, + + /** + * + * Teal + * + * @generated from enum value: Teal = 11; + */ + Teal = 11, + + /** + * + * Green + * + * @generated from enum value: Green = 12; + */ + Green = 12, + + /** + * + * Dark Green + * + * @generated from enum value: Dark_Green = 13; + */ + Dark_Green = 13, + + /** + * + * Brown + * + * @generated from enum value: Brown = 14; + */ + Brown = 14, +} + +/** + * Describes the enum meshtastic.Team. + */ +export const TeamSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 0); + +/** + * + * Role of the group member + * + * @generated from enum meshtastic.MemberRole + */ +export enum MemberRole { + /** + * + * Unspecifed + * + * @generated from enum value: Unspecifed = 0; + */ + Unspecifed = 0, + + /** + * + * Team Member + * + * @generated from enum value: TeamMember = 1; + */ + TeamMember = 1, + + /** + * + * Team Lead + * + * @generated from enum value: TeamLead = 2; + */ + TeamLead = 2, + + /** + * + * Headquarters + * + * @generated from enum value: HQ = 3; + */ + HQ = 3, + + /** + * + * Airsoft enthusiast + * + * @generated from enum value: Sniper = 4; + */ + Sniper = 4, + + /** + * + * Medic + * + * @generated from enum value: Medic = 5; + */ + Medic = 5, + + /** + * + * ForwardObserver + * + * @generated from enum value: ForwardObserver = 6; + */ + ForwardObserver = 6, + + /** + * + * Radio Telephone Operator + * + * @generated from enum value: RTO = 7; + */ + RTO = 7, + + /** + * + * Doggo + * + * @generated from enum value: K9 = 8; + */ + K9 = 8, +} + +/** + * Describes the enum meshtastic.MemberRole. + */ +export const MemberRoleSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 1); + +/** + * + * CoT how field values. + * Represents how the coordinates were generated. + * + * @generated from enum meshtastic.CotHow + */ +export enum CotHow { + /** + * + * Unspecified + * + * @generated from enum value: CotHow_Unspecified = 0; + */ + CotHow_Unspecified = 0, + + /** + * + * Human entered + * + * @generated from enum value: CotHow_h_e = 1; + */ + CotHow_h_e = 1, + + /** + * + * Machine generated + * + * @generated from enum value: CotHow_m_g = 2; + */ + CotHow_m_g = 2, + + /** + * + * Human GPS/INS derived + * + * @generated from enum value: CotHow_h_g_i_g_o = 3; + */ + CotHow_h_g_i_g_o = 3, + + /** + * + * Machine relayed (imported from another system/gateway) + * + * @generated from enum value: CotHow_m_r = 4; + */ + CotHow_m_r = 4, + + /** + * + * Machine fused (corroborated from multiple sources) + * + * @generated from enum value: CotHow_m_f = 5; + */ + CotHow_m_f = 5, + + /** + * + * Machine predicted + * + * @generated from enum value: CotHow_m_p = 6; + */ + CotHow_m_p = 6, + + /** + * + * Machine simulated + * + * @generated from enum value: CotHow_m_s = 7; + */ + CotHow_m_s = 7, +} + +/** + * Describes the enum meshtastic.CotHow. + */ +export const CotHowSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 2); + +/** + * + * Well-known CoT event types. + * When the type is known, use the enum value for efficient encoding. + * For unknown types, set cot_type_id to CotType_Other and populate cot_type_str. + * + * @generated from enum meshtastic.CotType + */ +export enum CotType { + /** + * + * Unknown or unmapped type, use cot_type_str + * + * @generated from enum value: CotType_Other = 0; + */ + CotType_Other = 0, + + /** + * + * a-f-G-U-C: Friendly ground unit combat + * + * @generated from enum value: CotType_a_f_G_U_C = 1; + */ + CotType_a_f_G_U_C = 1, + + /** + * + * a-f-G-U-C-I: Friendly ground unit combat infantry + * + * @generated from enum value: CotType_a_f_G_U_C_I = 2; + */ + CotType_a_f_G_U_C_I = 2, + + /** + * + * a-n-A-C-F: Neutral aircraft civilian fixed-wing + * + * @generated from enum value: CotType_a_n_A_C_F = 3; + */ + CotType_a_n_A_C_F = 3, + + /** + * + * a-n-A-C-H: Neutral aircraft civilian helicopter + * + * @generated from enum value: CotType_a_n_A_C_H = 4; + */ + CotType_a_n_A_C_H = 4, + + /** + * + * a-n-A-C: Neutral aircraft civilian + * + * @generated from enum value: CotType_a_n_A_C = 5; + */ + CotType_a_n_A_C = 5, + + /** + * + * a-f-A-M-H: Friendly aircraft military helicopter + * + * @generated from enum value: CotType_a_f_A_M_H = 6; + */ + CotType_a_f_A_M_H = 6, + + /** + * + * a-f-A-M: Friendly aircraft military + * + * @generated from enum value: CotType_a_f_A_M = 7; + */ + CotType_a_f_A_M = 7, + + /** + * + * a-f-A-M-F-F: Friendly aircraft military fixed-wing fighter + * + * @generated from enum value: CotType_a_f_A_M_F_F = 8; + */ + CotType_a_f_A_M_F_F = 8, + + /** + * + * a-f-A-M-H-A: Friendly aircraft military helicopter attack + * + * @generated from enum value: CotType_a_f_A_M_H_A = 9; + */ + CotType_a_f_A_M_H_A = 9, + + /** + * + * a-f-A-M-H-U-M: Friendly aircraft military helicopter utility medium + * + * @generated from enum value: CotType_a_f_A_M_H_U_M = 10; + */ + CotType_a_f_A_M_H_U_M = 10, + + /** + * + * a-h-A-M-F-F: Hostile aircraft military fixed-wing fighter + * + * @generated from enum value: CotType_a_h_A_M_F_F = 11; + */ + CotType_a_h_A_M_F_F = 11, + + /** + * + * a-h-A-M-H-A: Hostile aircraft military helicopter attack + * + * @generated from enum value: CotType_a_h_A_M_H_A = 12; + */ + CotType_a_h_A_M_H_A = 12, + + /** + * + * a-u-A-C: Unknown aircraft civilian + * + * @generated from enum value: CotType_a_u_A_C = 13; + */ + CotType_a_u_A_C = 13, + + /** + * + * t-x-d-d: Tasking delete/disconnect + * + * @generated from enum value: CotType_t_x_d_d = 14; + */ + CotType_t_x_d_d = 14, + + /** + * + * a-f-G-E-S-E: Friendly ground equipment sensor + * + * @generated from enum value: CotType_a_f_G_E_S_E = 15; + */ + CotType_a_f_G_E_S_E = 15, + + /** + * + * a-f-G-E-V-C: Friendly ground equipment vehicle + * + * @generated from enum value: CotType_a_f_G_E_V_C = 16; + */ + CotType_a_f_G_E_V_C = 16, + + /** + * + * a-f-S: Friendly sea + * + * @generated from enum value: CotType_a_f_S = 17; + */ + CotType_a_f_S = 17, + + /** + * + * a-f-A-M-F: Friendly aircraft military fixed-wing + * + * @generated from enum value: CotType_a_f_A_M_F = 18; + */ + CotType_a_f_A_M_F = 18, + + /** + * + * a-f-A-M-F-C-H: Friendly aircraft military fixed-wing cargo heavy + * + * @generated from enum value: CotType_a_f_A_M_F_C_H = 19; + */ + CotType_a_f_A_M_F_C_H = 19, + + /** + * + * a-f-A-M-F-U-L: Friendly aircraft military fixed-wing utility light + * + * @generated from enum value: CotType_a_f_A_M_F_U_L = 20; + */ + CotType_a_f_A_M_F_U_L = 20, + + /** + * + * a-f-A-M-F-L: Friendly aircraft military fixed-wing liaison + * + * @generated from enum value: CotType_a_f_A_M_F_L = 21; + */ + CotType_a_f_A_M_F_L = 21, + + /** + * + * a-f-A-M-F-P: Friendly aircraft military fixed-wing patrol + * + * @generated from enum value: CotType_a_f_A_M_F_P = 22; + */ + CotType_a_f_A_M_F_P = 22, + + /** + * + * a-f-A-C-H: Friendly aircraft civilian helicopter + * + * @generated from enum value: CotType_a_f_A_C_H = 23; + */ + CotType_a_f_A_C_H = 23, + + /** + * + * a-n-A-M-F-Q: Neutral aircraft military fixed-wing drone + * + * @generated from enum value: CotType_a_n_A_M_F_Q = 24; + */ + CotType_a_n_A_M_F_Q = 24, + + /** + * + * b-t-f: GeoChat message + * + * @generated from enum value: CotType_b_t_f = 25; + */ + CotType_b_t_f = 25, + + /** + * + * b-r-f-h-c: CASEVAC/MEDEVAC report + * + * @generated from enum value: CotType_b_r_f_h_c = 26; + */ + CotType_b_r_f_h_c = 26, + + /** + * + * b-a-o-pan: Ring the bell / alert all + * + * @generated from enum value: CotType_b_a_o_pan = 27; + */ + CotType_b_a_o_pan = 27, + + /** + * + * b-a-o-opn: Troops in contact + * + * @generated from enum value: CotType_b_a_o_opn = 28; + */ + CotType_b_a_o_opn = 28, + + /** + * + * b-a-o-can: Cancel alert + * + * @generated from enum value: CotType_b_a_o_can = 29; + */ + CotType_b_a_o_can = 29, + + /** + * + * b-a-o-tbl: 911 alert + * + * @generated from enum value: CotType_b_a_o_tbl = 30; + */ + CotType_b_a_o_tbl = 30, + + /** + * + * b-a-g: Geofence breach alert + * + * @generated from enum value: CotType_b_a_g = 31; + */ + CotType_b_a_g = 31, + + /** + * + * a-f-G: Friendly ground (generic) + * + * @generated from enum value: CotType_a_f_G = 32; + */ + CotType_a_f_G = 32, + + /** + * + * a-f-G-U: Friendly ground unit (generic) + * + * @generated from enum value: CotType_a_f_G_U = 33; + */ + CotType_a_f_G_U = 33, + + /** + * + * a-h-G: Hostile ground (generic) + * + * @generated from enum value: CotType_a_h_G = 34; + */ + CotType_a_h_G = 34, + + /** + * + * a-u-G: Unknown ground (generic) + * + * @generated from enum value: CotType_a_u_G = 35; + */ + CotType_a_u_G = 35, + + /** + * + * a-n-G: Neutral ground (generic) + * + * @generated from enum value: CotType_a_n_G = 36; + */ + CotType_a_n_G = 36, + + /** + * + * b-m-r: Route + * + * @generated from enum value: CotType_b_m_r = 37; + */ + CotType_b_m_r = 37, + + /** + * + * b-m-p-w: Route waypoint + * + * @generated from enum value: CotType_b_m_p_w = 38; + */ + CotType_b_m_p_w = 38, + + /** + * + * b-m-p-s-p-i: Self-position marker + * + * @generated from enum value: CotType_b_m_p_s_p_i = 39; + */ + CotType_b_m_p_s_p_i = 39, + + /** + * + * u-d-f: Freeform shape (line/polygon) + * + * @generated from enum value: CotType_u_d_f = 40; + */ + CotType_u_d_f = 40, + + /** + * + * u-d-r: Rectangle + * + * @generated from enum value: CotType_u_d_r = 41; + */ + CotType_u_d_r = 41, + + /** + * + * u-d-c-c: Circle + * + * @generated from enum value: CotType_u_d_c_c = 42; + */ + CotType_u_d_c_c = 42, + + /** + * + * u-rb-a: Range/bearing line + * + * @generated from enum value: CotType_u_rb_a = 43; + */ + CotType_u_rb_a = 43, + + /** + * + * a-h-A: Hostile aircraft (generic) + * + * @generated from enum value: CotType_a_h_A = 44; + */ + CotType_a_h_A = 44, + + /** + * + * a-u-A: Unknown aircraft (generic) + * + * @generated from enum value: CotType_a_u_A = 45; + */ + CotType_a_u_A = 45, + + /** + * + * a-f-A-M-H-Q: Friendly aircraft military helicopter observation + * + * @generated from enum value: CotType_a_f_A_M_H_Q = 46; + */ + CotType_a_f_A_M_H_Q = 46, + + /** + * + * a-f-A-C-F: Friendly aircraft civilian fixed-wing + * + * @generated from enum value: CotType_a_f_A_C_F = 47; + */ + CotType_a_f_A_C_F = 47, + + /** + * + * a-f-A-C: Friendly aircraft civilian (generic) + * + * @generated from enum value: CotType_a_f_A_C = 48; + */ + CotType_a_f_A_C = 48, + + /** + * + * a-f-A-C-L: Friendly aircraft civilian lighter-than-air + * + * @generated from enum value: CotType_a_f_A_C_L = 49; + */ + CotType_a_f_A_C_L = 49, + + /** + * + * a-f-A: Friendly aircraft (generic) + * + * @generated from enum value: CotType_a_f_A = 50; + */ + CotType_a_f_A = 50, + + /** + * + * a-f-A-M-H-C: Friendly aircraft military helicopter cargo + * + * @generated from enum value: CotType_a_f_A_M_H_C = 51; + */ + CotType_a_f_A_M_H_C = 51, + + /** + * + * a-n-A-M-F-F: Neutral aircraft military fixed-wing fighter + * + * @generated from enum value: CotType_a_n_A_M_F_F = 52; + */ + CotType_a_n_A_M_F_F = 52, + + /** + * + * a-u-A-C-F: Unknown aircraft civilian fixed-wing + * + * @generated from enum value: CotType_a_u_A_C_F = 53; + */ + CotType_a_u_A_C_F = 53, + + /** + * + * a-f-G-U-C-F-T-A: Friendly ground unit combat forces theater aviation + * + * @generated from enum value: CotType_a_f_G_U_C_F_T_A = 54; + */ + CotType_a_f_G_U_C_F_T_A = 54, + + /** + * + * a-f-G-U-C-V-S: Friendly ground unit combat vehicle support + * + * @generated from enum value: CotType_a_f_G_U_C_V_S = 55; + */ + CotType_a_f_G_U_C_V_S = 55, + + /** + * + * a-f-G-U-C-R-X: Friendly ground unit combat reconnaissance exploitation + * + * @generated from enum value: CotType_a_f_G_U_C_R_X = 56; + */ + CotType_a_f_G_U_C_R_X = 56, + + /** + * + * a-f-G-U-C-I-Z: Friendly ground unit combat infantry mechanized + * + * @generated from enum value: CotType_a_f_G_U_C_I_Z = 57; + */ + CotType_a_f_G_U_C_I_Z = 57, + + /** + * + * a-f-G-U-C-E-C-W: Friendly ground unit combat engineer construction wheeled + * + * @generated from enum value: CotType_a_f_G_U_C_E_C_W = 58; + */ + CotType_a_f_G_U_C_E_C_W = 58, + + /** + * + * a-f-G-U-C-I-L: Friendly ground unit combat infantry light + * + * @generated from enum value: CotType_a_f_G_U_C_I_L = 59; + */ + CotType_a_f_G_U_C_I_L = 59, + + /** + * + * a-f-G-U-C-R-O: Friendly ground unit combat reconnaissance other + * + * @generated from enum value: CotType_a_f_G_U_C_R_O = 60; + */ + CotType_a_f_G_U_C_R_O = 60, + + /** + * + * a-f-G-U-C-R-V: Friendly ground unit combat reconnaissance cavalry + * + * @generated from enum value: CotType_a_f_G_U_C_R_V = 61; + */ + CotType_a_f_G_U_C_R_V = 61, + + /** + * + * a-f-G-U-H: Friendly ground unit headquarters + * + * @generated from enum value: CotType_a_f_G_U_H = 62; + */ + CotType_a_f_G_U_H = 62, + + /** + * + * a-f-G-U-U-M-S-E: Friendly ground unit support medical surgical evacuation + * + * @generated from enum value: CotType_a_f_G_U_U_M_S_E = 63; + */ + CotType_a_f_G_U_U_M_S_E = 63, + + /** + * + * a-f-G-U-S-M-C: Friendly ground unit support maintenance collection + * + * @generated from enum value: CotType_a_f_G_U_S_M_C = 64; + */ + CotType_a_f_G_U_S_M_C = 64, + + /** + * + * a-f-G-E-S: Friendly ground equipment sensor (generic) + * + * @generated from enum value: CotType_a_f_G_E_S = 65; + */ + CotType_a_f_G_E_S = 65, + + /** + * + * a-f-G-E: Friendly ground equipment (generic) + * + * @generated from enum value: CotType_a_f_G_E = 66; + */ + CotType_a_f_G_E = 66, + + /** + * + * a-f-G-E-V-C-U: Friendly ground equipment vehicle utility + * + * @generated from enum value: CotType_a_f_G_E_V_C_U = 67; + */ + CotType_a_f_G_E_V_C_U = 67, + + /** + * + * a-f-G-E-V-C-ps: Friendly ground equipment vehicle public safety + * + * @generated from enum value: CotType_a_f_G_E_V_C_ps = 68; + */ + CotType_a_f_G_E_V_C_ps = 68, + + /** + * + * a-u-G-E-V: Unknown ground equipment vehicle + * + * @generated from enum value: CotType_a_u_G_E_V = 69; + */ + CotType_a_u_G_E_V = 69, + + /** + * + * a-f-S-N-N-R: Friendly sea surface non-naval rescue + * + * @generated from enum value: CotType_a_f_S_N_N_R = 70; + */ + CotType_a_f_S_N_N_R = 70, + + /** + * + * a-f-F-B: Friendly force boundary + * + * @generated from enum value: CotType_a_f_F_B = 71; + */ + CotType_a_f_F_B = 71, + + /** + * + * b-m-p-s-p-loc: Self-position location marker + * + * @generated from enum value: CotType_b_m_p_s_p_loc = 72; + */ + CotType_b_m_p_s_p_loc = 72, + + /** + * + * b-i-v: Imagery/video + * + * @generated from enum value: CotType_b_i_v = 73; + */ + CotType_b_i_v = 73, + + /** + * + * b-f-t-r: File transfer request + * + * @generated from enum value: CotType_b_f_t_r = 74; + */ + CotType_b_f_t_r = 74, + + /** + * + * b-f-t-a: File transfer acknowledgment + * + * @generated from enum value: CotType_b_f_t_a = 75; + */ + CotType_b_f_t_a = 75, + + /** + * + * u-d-f-m: Freehand telestration / annotation. Anchor at event point, + * geometry carried via DrawnShape.vertices. May be truncated to + * MAX_VERTICES by the sender. + * + * @generated from enum value: CotType_u_d_f_m = 76; + */ + CotType_u_d_f_m = 76, + + /** + * + * u-d-p: Closed polygon. Geometry carried via DrawnShape.vertices, + * implicitly closed (receiver duplicates first vertex as needed). + * + * @generated from enum value: CotType_u_d_p = 77; + */ + CotType_u_d_p = 77, + + /** + * + * b-m-p-s-m: Spot map marker (colored dot at a point of interest). + * + * @generated from enum value: CotType_b_m_p_s_m = 78; + */ + CotType_b_m_p_s_m = 78, + + /** + * + * b-m-p-c: Checkpoint (intermediate route control point). + * + * @generated from enum value: CotType_b_m_p_c = 79; + */ + CotType_b_m_p_c = 79, + + /** + * + * u-r-b-c-c: Ranging circle (range rings centered on the event point). + * + * @generated from enum value: CotType_u_r_b_c_c = 80; + */ + CotType_u_r_b_c_c = 80, + + /** + * + * u-r-b-bullseye: Bullseye with configurable range rings and bearing + * reference (magnetic / true / grid). + * + * @generated from enum value: CotType_u_r_b_bullseye = 81; + */ + CotType_u_r_b_bullseye = 81, + + /** + * + * a-f-G-E-V-A: Friendly armored vehicle, user-selectable self PLI. + * + * @generated from enum value: CotType_a_f_G_E_V_A = 82; + */ + CotType_a_f_G_E_V_A = 82, + + /** + * + * a-n-A: Neutral aircraft (friendly/hostile/unknown already present). + * + * @generated from enum value: CotType_a_n_A = 83; + */ + CotType_a_n_A = 83, + + /** + * --- 2525 quick-drop: artillery (4) ---------------------------------- + * + * @generated from enum value: CotType_a_u_G_U_C_F = 84; + */ + CotType_a_u_G_U_C_F = 84, + + /** + * @generated from enum value: CotType_a_n_G_U_C_F = 85; + */ + CotType_a_n_G_U_C_F = 85, + + /** + * @generated from enum value: CotType_a_h_G_U_C_F = 86; + */ + CotType_a_h_G_U_C_F = 86, + + /** + * @generated from enum value: CotType_a_f_G_U_C_F = 87; + */ + CotType_a_f_G_U_C_F = 87, + + /** + * --- 2525 quick-drop: building (4) ----------------------------------- + * + * @generated from enum value: CotType_a_u_G_I = 88; + */ + CotType_a_u_G_I = 88, + + /** + * @generated from enum value: CotType_a_n_G_I = 89; + */ + CotType_a_n_G_I = 89, + + /** + * @generated from enum value: CotType_a_h_G_I = 90; + */ + CotType_a_h_G_I = 90, + + /** + * @generated from enum value: CotType_a_f_G_I = 91; + */ + CotType_a_f_G_I = 91, + + /** + * --- 2525 quick-drop: mine (4) --------------------------------------- + * + * @generated from enum value: CotType_a_u_G_E_X_M = 92; + */ + CotType_a_u_G_E_X_M = 92, + + /** + * @generated from enum value: CotType_a_n_G_E_X_M = 93; + */ + CotType_a_n_G_E_X_M = 93, + + /** + * @generated from enum value: CotType_a_h_G_E_X_M = 94; + */ + CotType_a_h_G_E_X_M = 94, + + /** + * @generated from enum value: CotType_a_f_G_E_X_M = 95; + */ + CotType_a_f_G_E_X_M = 95, + + /** + * --- 2525 quick-drop: ship (3; a-f-S already at 17) ------------------ + * + * @generated from enum value: CotType_a_u_S = 96; + */ + CotType_a_u_S = 96, + + /** + * @generated from enum value: CotType_a_n_S = 97; + */ + CotType_a_n_S = 97, + + /** + * @generated from enum value: CotType_a_h_S = 98; + */ + CotType_a_h_S = 98, + + /** + * --- 2525 quick-drop: sniper (4) ------------------------------------- + * + * @generated from enum value: CotType_a_u_G_U_C_I_d = 99; + */ + CotType_a_u_G_U_C_I_d = 99, + + /** + * @generated from enum value: CotType_a_n_G_U_C_I_d = 100; + */ + CotType_a_n_G_U_C_I_d = 100, + + /** + * @generated from enum value: CotType_a_h_G_U_C_I_d = 101; + */ + CotType_a_h_G_U_C_I_d = 101, + + /** + * @generated from enum value: CotType_a_f_G_U_C_I_d = 102; + */ + CotType_a_f_G_U_C_I_d = 102, + + /** + * --- 2525 quick-drop: tank (4) --------------------------------------- + * + * @generated from enum value: CotType_a_u_G_E_V_A_T = 103; + */ + CotType_a_u_G_E_V_A_T = 103, + + /** + * @generated from enum value: CotType_a_n_G_E_V_A_T = 104; + */ + CotType_a_n_G_E_V_A_T = 104, + + /** + * @generated from enum value: CotType_a_h_G_E_V_A_T = 105; + */ + CotType_a_h_G_E_V_A_T = 105, + + /** + * @generated from enum value: CotType_a_f_G_E_V_A_T = 106; + */ + CotType_a_f_G_E_V_A_T = 106, + + /** + * --- 2525 quick-drop: troops (3; a-f-G-U-C-I already at 2) ----------- + * + * @generated from enum value: CotType_a_u_G_U_C_I = 107; + */ + CotType_a_u_G_U_C_I = 107, + + /** + * @generated from enum value: CotType_a_n_G_U_C_I = 108; + */ + CotType_a_n_G_U_C_I = 108, + + /** + * @generated from enum value: CotType_a_h_G_U_C_I = 109; + */ + CotType_a_h_G_U_C_I = 109, + + /** + * --- 2525 quick-drop: generic vehicle (3; a-u-G-E-V already at 69) --- + * + * @generated from enum value: CotType_a_n_G_E_V = 110; + */ + CotType_a_n_G_E_V = 110, + + /** + * @generated from enum value: CotType_a_h_G_E_V = 111; + */ + CotType_a_h_G_E_V = 111, + + /** + * @generated from enum value: CotType_a_f_G_E_V = 112; + */ + CotType_a_f_G_E_V = 112, + + /** + * + * b-m-p-w-GOTO: Go To / bloodhound navigation target. + * + * @generated from enum value: CotType_b_m_p_w_GOTO = 113; + */ + CotType_b_m_p_w_GOTO = 113, + + /** + * + * b-m-p-c-ip: Initial point (mission planning). + * + * @generated from enum value: CotType_b_m_p_c_ip = 114; + */ + CotType_b_m_p_c_ip = 114, + + /** + * + * b-m-p-c-cp: Contact point (mission planning). + * + * @generated from enum value: CotType_b_m_p_c_cp = 115; + */ + CotType_b_m_p_c_cp = 115, + + /** + * + * b-m-p-s-p-op: Observation post. + * + * @generated from enum value: CotType_b_m_p_s_p_op = 116; + */ + CotType_b_m_p_s_p_op = 116, + + /** + * + * u-d-v: 2D vehicle outline drawn on the map. + * + * @generated from enum value: CotType_u_d_v = 117; + */ + CotType_u_d_v = 117, + + /** + * + * u-d-v-m: 3D vehicle model reference. + * + * @generated from enum value: CotType_u_d_v_m = 118; + */ + CotType_u_d_v_m = 118, + + /** + * + * u-d-c-e: Non-circular ellipse (circle with distinct major/minor axes). + * + * @generated from enum value: CotType_u_d_c_e = 119; + */ + CotType_u_d_c_e = 119, + + /** + * + * b-i-x-i: Quick Pic geotagged image marker. The image itself does not + * ride on LoRa; this event references the image via iconset metadata. + * + * @generated from enum value: CotType_b_i_x_i = 120; + */ + CotType_b_i_x_i = 120, + + /** + * + * b-t-f-d: GeoChat delivered receipt. Carried on the existing `chat` + * payload_variant via GeoChat.receipt_for_uid + receipt_type. + * + * @generated from enum value: CotType_b_t_f_d = 121; + */ + CotType_b_t_f_d = 121, + + /** + * + * b-t-f-r: GeoChat read receipt. Same wire slot as b-t-f-d. + * + * @generated from enum value: CotType_b_t_f_r = 122; + */ + CotType_b_t_f_r = 122, + + /** + * + * b-a-o-c: Custom / generic emergency beacon. + * + * @generated from enum value: CotType_b_a_o_c = 123; + */ + CotType_b_a_o_c = 123, + + /** + * + * t-s: Task / engage request. Structured payload carried via the new + * TaskRequest typed variant. + * + * @generated from enum value: CotType_t_s = 124; + */ + CotType_t_s = 124, + + /** + * + * m-t-t: TAKTALK voice/text chat message. Payload carried via the + * TakTalkMessage typed variant (text, chatroom_id, lang, from_voice). + * + * @generated from enum value: CotType_m_t_t = 125; + */ + CotType_m_t_t = 125, + + /** + * + * y-: TAKTALK room/membership broadcast. Payload carried via the + * TakTalkRoomData typed variant (sender_callsign, room_id, room_name, + * participants). The CoT type literally has a trailing dash and no + * second atom — not a typo. + * + * @generated from enum value: CotType_y = 126; + */ + CotType_y = 126, +} + +/** + * Describes the enum meshtastic.CotType. + */ +export const CotTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 3); + +/** + * + * Geopoint and altitude source + * + * @generated from enum meshtastic.GeoPointSource + */ +export enum GeoPointSource { + /** + * + * Unspecified + * + * @generated from enum value: GeoPointSource_Unspecified = 0; + */ + GeoPointSource_Unspecified = 0, + + /** + * + * GPS derived + * + * @generated from enum value: GeoPointSource_GPS = 1; + */ + GeoPointSource_GPS = 1, + + /** + * + * User entered + * + * @generated from enum value: GeoPointSource_USER = 2; + */ + GeoPointSource_USER = 2, + + /** + * + * Network/external + * + * @generated from enum value: GeoPointSource_NETWORK = 3; + */ + GeoPointSource_NETWORK = 3, +} + +/** + * Describes the enum meshtastic.GeoPointSource. + */ +export const GeoPointSourceSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_atak, 4); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/cannedmessages_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/cannedmessages_pb.ts new file mode 100644 index 00000000..d7c16042 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/cannedmessages_pb.ts @@ -0,0 +1,37 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/cannedmessages.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/cannedmessages.proto. + */ +export const file_meshtastic_cannedmessages: GenFile = /*@__PURE__*/ + fileDesc("Ch9tZXNodGFzdGljL2Nhbm5lZG1lc3NhZ2VzLnByb3RvEgptZXNodGFzdGljIi0KGUNhbm5lZE1lc3NhZ2VNb2R1bGVDb25maWcSEAoIbWVzc2FnZXMYASABKAlCbwoUb3JnLm1lc2h0YXN0aWMucHJvdG9CGUNhbm5lZE1lc3NhZ2VDb25maWdQcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * + * Canned message module configuration. + * + * @generated from message meshtastic.CannedMessageModuleConfig + */ +export type CannedMessageModuleConfig = Message<"meshtastic.CannedMessageModuleConfig"> & { + /** + * + * Predefined messages for canned message module separated by '|' characters. + * + * @generated from field: string messages = 1; + */ + messages: string; +}; + +/** + * Describes the message meshtastic.CannedMessageModuleConfig. + * Use `create(CannedMessageModuleConfigSchema)` to create a new message. + */ +export const CannedMessageModuleConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_cannedmessages, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/channel_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/channel_pb.ts new file mode 100644 index 00000000..931366ee --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/channel_pb.ts @@ -0,0 +1,248 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/channel.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +// trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH) + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/channel.proto. + */ +export const file_meshtastic_channel: GenFile = /*@__PURE__*/ + fileDesc("ChhtZXNodGFzdGljL2NoYW5uZWwucHJvdG8SCm1lc2h0YXN0aWMiuAEKD0NoYW5uZWxTZXR0aW5ncxIXCgtjaGFubmVsX251bRgBIAEoDUICGAESCwoDcHNrGAIgASgMEgwKBG5hbWUYAyABKAkSCgoCaWQYBCABKAcSFgoOdXBsaW5rX2VuYWJsZWQYBSABKAgSGAoQZG93bmxpbmtfZW5hYmxlZBgGIAEoCBIzCg9tb2R1bGVfc2V0dGluZ3MYByABKAsyGi5tZXNodGFzdGljLk1vZHVsZVNldHRpbmdzIj4KDk1vZHVsZVNldHRpbmdzEhoKEnBvc2l0aW9uX3ByZWNpc2lvbhgBIAEoDRIQCghpc19tdXRlZBgCIAEoCCKhAQoHQ2hhbm5lbBINCgVpbmRleBgBIAEoBRItCghzZXR0aW5ncxgCIAEoCzIbLm1lc2h0YXN0aWMuQ2hhbm5lbFNldHRpbmdzEiYKBHJvbGUYAyABKA4yGC5tZXNodGFzdGljLkNoYW5uZWwuUm9sZSIwCgRSb2xlEgwKCERJU0FCTEVEEAASCwoHUFJJTUFSWRABEg0KCVNFQ09OREFSWRACQmMKFG9yZy5tZXNodGFzdGljLnByb3RvQg1DaGFubmVsUHJvdG9zWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw"); + +/** + * + * This information can be encoded as a QRcode/url so that other users can configure + * their radio to join the same channel. + * A note about how channel names are shown to users: channelname-X + * poundsymbol is a prefix used to indicate this is a channel name (idea from @professr). + * Where X is a letter from A-Z (base 26) representing a hash of the PSK for this + * channel - so that if the user changes anything about the channel (which does + * force a new PSK) this letter will also change. Thus preventing user confusion if + * two friends try to type in a channel name of "BobsChan" and then can't talk + * because their PSKs will be different. + * The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26" + * This also allows the option of someday if people have the PSK off (zero), the + * users COULD type in a channel name and be able to talk. + * FIXME: Add description of multi-channel support and how primary vs secondary channels are used. + * FIXME: explain how apps use channels for security. + * explain how remote settings and remote gpio are managed as an example + * + * @generated from message meshtastic.ChannelSettings + */ +export type ChannelSettings = Message<"meshtastic.ChannelSettings"> & { + /** + * + * Deprecated in favor of LoraConfig.channel_num + * + * @generated from field: uint32 channel_num = 1 [deprecated = true]; + * @deprecated + */ + channelNum: number; + + /** + * + * A simple pre-shared key for now for crypto. + * Must be either 0 bytes (no crypto), 16 bytes (AES128), or 32 bytes (AES256). + * A special shorthand is used for 1 byte long psks. + * These psks should be treated as only minimally secure, + * because they are listed in this source code. + * Those bytes are mapped using the following scheme: + * `0` = No crypto + * `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0x01} + * `2` through 10 = The default channel key, except with 1 through 9 added to the last byte. + * Shown to user as simple1 through 10 + * + * @generated from field: bytes psk = 2; + */ + psk: Uint8Array; + + /** + * + * A SHORT name that will be packed into the URL. + * Less than 12 bytes. + * Something for end users to call the channel + * If this is the empty string it is assumed that this channel + * is the special (minimally secure) "Default"channel. + * In user interfaces it should be rendered as a local language translation of "X". + * For channel_num hashing empty string will be treated as "X". + * Where "X" is selected based on the English words listed above for ModemPreset + * + * @generated from field: string name = 3; + */ + name: string; + + /** + * + * Used to construct a globally unique channel ID. + * The full globally unique ID will be: "name.id" where ID is shown as base36. + * Assuming that the number of meshtastic users is below 20K (true for a long time) + * the chance of this 64 bit random number colliding with anyone else is super low. + * And the penalty for collision is low as well, it just means that anyone trying to decrypt channel messages might need to + * try multiple candidate channels. + * Any time a non wire compatible change is made to a channel, this field should be regenerated. + * There are a small number of 'special' globally known (and fairly) insecure standard channels. + * Those channels do not have a numeric id included in the settings, but instead it is pulled from + * a table of well known IDs. + * (see Well Known Channels FIXME) + * + * @generated from field: fixed32 id = 4; + */ + id: number; + + /** + * + * If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe + * + * @generated from field: bool uplink_enabled = 5; + */ + uplinkEnabled: boolean; + + /** + * + * If true, messages seen on the internet will be forwarded to the local mesh. + * + * @generated from field: bool downlink_enabled = 6; + */ + downlinkEnabled: boolean; + + /** + * + * Per-channel module settings. + * + * @generated from field: meshtastic.ModuleSettings module_settings = 7; + */ + moduleSettings?: ModuleSettings | undefined; +}; + +/** + * Describes the message meshtastic.ChannelSettings. + * Use `create(ChannelSettingsSchema)` to create a new message. + */ +export const ChannelSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_channel, 0); + +/** + * + * This message is specifically for modules to store per-channel configuration data. + * + * @generated from message meshtastic.ModuleSettings + */ +export type ModuleSettings = Message<"meshtastic.ModuleSettings"> & { + /** + * + * Bits of precision for the location sent in position packets. + * + * @generated from field: uint32 position_precision = 1; + */ + positionPrecision: number; + + /** + * + * Controls whether or not the client / device should mute the current channel + * Useful for noisy public channels you don't necessarily want to disable + * + * @generated from field: bool is_muted = 2; + */ + isMuted: boolean; +}; + +/** + * Describes the message meshtastic.ModuleSettings. + * Use `create(ModuleSettingsSchema)` to create a new message. + */ +export const ModuleSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_channel, 1); + +/** + * + * A pair of a channel number, mode and the (sharable) settings for that channel + * + * @generated from message meshtastic.Channel + */ +export type Channel = Message<"meshtastic.Channel"> & { + /** + * + * The index of this channel in the channel table (from 0 to MAX_NUM_CHANNELS-1) + * (Someday - not currently implemented) An index of -1 could be used to mean "set by name", + * in which case the target node will find and set the channel by settings.name. + * + * @generated from field: int32 index = 1; + */ + index: number; + + /** + * + * The new settings, or NULL to disable that channel + * + * @generated from field: meshtastic.ChannelSettings settings = 2; + */ + settings?: ChannelSettings | undefined; + + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.Channel.Role role = 3; + */ + role: Channel_Role; +}; + +/** + * Describes the message meshtastic.Channel. + * Use `create(ChannelSchema)` to create a new message. + */ +export const ChannelSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_channel, 2); + +/** + * + * How this channel is being used (or not). + * Note: this field is an enum to give us options for the future. + * In particular, someday we might make a 'SCANNING' option. + * SCANNING channels could have different frequencies and the radio would + * occasionally check that freq to see if anything is being transmitted. + * For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow + * cross band routing as needed. + * If a device has only a single radio (the common case) only one channel can be PRIMARY at a time + * (but any number of SECONDARY channels can't be sent received on that common frequency) + * + * @generated from enum meshtastic.Channel.Role + */ +export enum Channel_Role { + /** + * + * This channel is not in use right now + * + * @generated from enum value: DISABLED = 0; + */ + DISABLED = 0, + + /** + * + * This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY + * + * @generated from enum value: PRIMARY = 1; + */ + PRIMARY = 1, + + /** + * + * Secondary channels are only used for encryption/decryption/authentication purposes. + * Their radio settings (freq etc) are ignored, only psk is used. + * + * @generated from enum value: SECONDARY = 2; + */ + SECONDARY = 2, +} + +/** + * Describes the enum meshtastic.Channel.Role. + */ +export const Channel_RoleSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_channel, 2, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/clientonly_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/clientonly_pb.ts new file mode 100644 index 00000000..878ab663 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/clientonly_pb.ts @@ -0,0 +1,98 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/clientonly.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { LocalConfig, LocalModuleConfig } from "./localonly_pb"; +import { file_meshtastic_localonly } from "./localonly_pb"; +import type { Position } from "./mesh_pb"; +import { file_meshtastic_mesh } from "./mesh_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/clientonly.proto. + */ +export const file_meshtastic_clientonly: GenFile = /*@__PURE__*/ + fileDesc("ChttZXNodGFzdGljL2NsaWVudG9ubHkucHJvdG8SCm1lc2h0YXN0aWMiqQMKDURldmljZVByb2ZpbGUSFgoJbG9uZ19uYW1lGAEgASgJSACIAQESFwoKc2hvcnRfbmFtZRgCIAEoCUgBiAEBEhgKC2NoYW5uZWxfdXJsGAMgASgJSAKIAQESLAoGY29uZmlnGAQgASgLMhcubWVzaHRhc3RpYy5Mb2NhbENvbmZpZ0gDiAEBEjkKDW1vZHVsZV9jb25maWcYBSABKAsyHS5tZXNodGFzdGljLkxvY2FsTW9kdWxlQ29uZmlnSASIAQESMQoOZml4ZWRfcG9zaXRpb24YBiABKAsyFC5tZXNodGFzdGljLlBvc2l0aW9uSAWIAQESFQoIcmluZ3RvbmUYByABKAlIBogBARIcCg9jYW5uZWRfbWVzc2FnZXMYCCABKAlIB4gBAUIMCgpfbG9uZ19uYW1lQg0KC19zaG9ydF9uYW1lQg4KDF9jaGFubmVsX3VybEIJCgdfY29uZmlnQhAKDl9tb2R1bGVfY29uZmlnQhEKD19maXhlZF9wb3NpdGlvbkILCglfcmluZ3RvbmVCEgoQX2Nhbm5lZF9tZXNzYWdlc0JmChRvcmcubWVzaHRhc3RpYy5wcm90b0IQQ2xpZW50T25seVByb3Rvc1oiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZKoCFE1lc2h0YXN0aWMuUHJvdG9idWZzugIAYgZwcm90bzM", [file_meshtastic_localonly, file_meshtastic_mesh]); + +/** + * + * This abstraction is used to contain any configuration for provisioning a node on any client. + * It is useful for importing and exporting configurations. + * + * @generated from message meshtastic.DeviceProfile + */ +export type DeviceProfile = Message<"meshtastic.DeviceProfile"> & { + /** + * + * Long name for the node + * + * @generated from field: optional string long_name = 1; + */ + longName?: string | undefined; + + /** + * + * Short name of the node + * + * @generated from field: optional string short_name = 2; + */ + shortName?: string | undefined; + + /** + * + * The url of the channels from our node + * + * @generated from field: optional string channel_url = 3; + */ + channelUrl?: string | undefined; + + /** + * + * The Config of the node + * + * @generated from field: optional meshtastic.LocalConfig config = 4; + */ + config?: LocalConfig | undefined; + + /** + * + * The ModuleConfig of the node + * + * @generated from field: optional meshtastic.LocalModuleConfig module_config = 5; + */ + moduleConfig?: LocalModuleConfig | undefined; + + /** + * + * Fixed position data + * + * @generated from field: optional meshtastic.Position fixed_position = 6; + */ + fixedPosition?: Position | undefined; + + /** + * + * Ringtone for ExternalNotification + * + * @generated from field: optional string ringtone = 7; + */ + ringtone?: string | undefined; + + /** + * + * Predefined messages for CannedMessage + * + * @generated from field: optional string canned_messages = 8; + */ + cannedMessages?: string | undefined; +}; + +/** + * Describes the message meshtastic.DeviceProfile. + * Use `create(DeviceProfileSchema)` to create a new message. + */ +export const DeviceProfileSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_clientonly, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/config_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/config_pb.ts new file mode 100644 index 00000000..0b8be50a --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/config_pb.ts @@ -0,0 +1,2314 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/config.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { DeviceUIConfig } from "./device_ui_pb"; +import { file_meshtastic_device_ui } from "./device_ui_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/config.proto. + */ +export const file_meshtastic_config: GenFile = /*@__PURE__*/ + fileDesc("ChdtZXNodGFzdGljL2NvbmZpZy5wcm90bxIKbWVzaHRhc3RpYyLlLAoGQ29uZmlnEjEKBmRldmljZRgBIAEoCzIfLm1lc2h0YXN0aWMuQ29uZmlnLkRldmljZUNvbmZpZ0gAEjUKCHBvc2l0aW9uGAIgASgLMiEubWVzaHRhc3RpYy5Db25maWcuUG9zaXRpb25Db25maWdIABIvCgVwb3dlchgDIAEoCzIeLm1lc2h0YXN0aWMuQ29uZmlnLlBvd2VyQ29uZmlnSAASMwoHbmV0d29yaxgEIAEoCzIgLm1lc2h0YXN0aWMuQ29uZmlnLk5ldHdvcmtDb25maWdIABIzCgdkaXNwbGF5GAUgASgLMiAubWVzaHRhc3RpYy5Db25maWcuRGlzcGxheUNvbmZpZ0gAEi0KBGxvcmEYBiABKAsyHS5tZXNodGFzdGljLkNvbmZpZy5Mb1JhQ29uZmlnSAASNwoJYmx1ZXRvb3RoGAcgASgLMiIubWVzaHRhc3RpYy5Db25maWcuQmx1ZXRvb3RoQ29uZmlnSAASNQoIc2VjdXJpdHkYCCABKAsyIS5tZXNodGFzdGljLkNvbmZpZy5TZWN1cml0eUNvbmZpZ0gAEjkKCnNlc3Npb25rZXkYCSABKAsyIy5tZXNodGFzdGljLkNvbmZpZy5TZXNzaW9ua2V5Q29uZmlnSAASLwoJZGV2aWNlX3VpGAogASgLMhoubWVzaHRhc3RpYy5EZXZpY2VVSUNvbmZpZ0gAGvYGCgxEZXZpY2VDb25maWcSMgoEcm9sZRgBIAEoDjIkLm1lc2h0YXN0aWMuQ29uZmlnLkRldmljZUNvbmZpZy5Sb2xlEhoKDnNlcmlhbF9lbmFibGVkGAIgASgIQgIYARITCgtidXR0b25fZ3BpbxgEIAEoDRITCgtidXp6ZXJfZ3BpbxgFIAEoDRJJChByZWJyb2FkY2FzdF9tb2RlGAYgASgOMi8ubWVzaHRhc3RpYy5Db25maWcuRGV2aWNlQ29uZmlnLlJlYnJvYWRjYXN0TW9kZRIgChhub2RlX2luZm9fYnJvYWRjYXN0X3NlY3MYByABKA0SIgoaZG91YmxlX3RhcF9hc19idXR0b25fcHJlc3MYCCABKAgSFgoKaXNfbWFuYWdlZBgJIAEoCEICGAESHAoUZGlzYWJsZV90cmlwbGVfY2xpY2sYCiABKAgSDQoFdHpkZWYYCyABKAkSHgoWbGVkX2hlYXJ0YmVhdF9kaXNhYmxlZBgMIAEoCBI/CgtidXp6ZXJfbW9kZRgNIAEoDjIqLm1lc2h0YXN0aWMuQ29uZmlnLkRldmljZUNvbmZpZy5CdXp6ZXJNb2RlItQBCgRSb2xlEgoKBkNMSUVOVBAAEg8KC0NMSUVOVF9NVVRFEAESCgoGUk9VVEVSEAISFQoNUk9VVEVSX0NMSUVOVBADGgIIARIQCghSRVBFQVRFUhAEGgIIARILCgdUUkFDS0VSEAUSCgoGU0VOU09SEAYSBwoDVEFLEAcSEQoNQ0xJRU5UX0hJRERFThAIEhIKDkxPU1RfQU5EX0ZPVU5EEAkSDwoLVEFLX1RSQUNLRVIQChIPCgtST1VURVJfTEFURRALEg8KC0NMSUVOVF9CQVNFEAwicwoPUmVicm9hZGNhc3RNb2RlEgcKA0FMTBAAEhUKEUFMTF9TS0lQX0RFQ09ESU5HEAESDgoKTE9DQUxfT05MWRACEg4KCktOT1dOX09OTFkQAxIICgROT05FEAQSFgoSQ09SRV9QT1JUTlVNU19PTkxZEAUiaQoKQnV6emVyTW9kZRIPCgtBTExfRU5BQkxFRBAAEgwKCERJU0FCTEVEEAESFgoSTk9USUZJQ0FUSU9OU19PTkxZEAISDwoLU1lTVEVNX09OTFkQAxITCg9ESVJFQ1RfTVNHX09OTFkQBBqRBQoOUG9zaXRpb25Db25maWcSHwoXcG9zaXRpb25fYnJvYWRjYXN0X3NlY3MYASABKA0SKAogcG9zaXRpb25fYnJvYWRjYXN0X3NtYXJ0X2VuYWJsZWQYAiABKAgSFgoOZml4ZWRfcG9zaXRpb24YAyABKAgSFwoLZ3BzX2VuYWJsZWQYBCABKAhCAhgBEhsKE2dwc191cGRhdGVfaW50ZXJ2YWwYBSABKA0SHAoQZ3BzX2F0dGVtcHRfdGltZRgGIAEoDUICGAESFgoOcG9zaXRpb25fZmxhZ3MYByABKA0SDwoHcnhfZ3BpbxgIIAEoDRIPCgd0eF9ncGlvGAkgASgNEigKIGJyb2FkY2FzdF9zbWFydF9taW5pbXVtX2Rpc3RhbmNlGAogASgNEi0KJWJyb2FkY2FzdF9zbWFydF9taW5pbXVtX2ludGVydmFsX3NlY3MYCyABKA0SEwoLZ3BzX2VuX2dwaW8YDCABKA0SOwoIZ3BzX21vZGUYDSABKA4yKS5tZXNodGFzdGljLkNvbmZpZy5Qb3NpdGlvbkNvbmZpZy5HcHNNb2RlIqsBCg1Qb3NpdGlvbkZsYWdzEgkKBVVOU0VUEAASDAoIQUxUSVRVREUQARIQCgxBTFRJVFVERV9NU0wQAhIWChJHRU9JREFMX1NFUEFSQVRJT04QBBIHCgNET1AQCBIJCgVIVkRPUBAQEg0KCVNBVElOVklFVxAgEgoKBlNFUV9OTxBAEg4KCVRJTUVTVEFNUBCAARIMCgdIRUFESU5HEIACEgoKBVNQRUVEEIAEIjUKB0dwc01vZGUSDAoIRElTQUJMRUQQABILCgdFTkFCTEVEEAESDwoLTk9UX1BSRVNFTlQQAhqEAgoLUG93ZXJDb25maWcSFwoPaXNfcG93ZXJfc2F2aW5nGAEgASgIEiYKHm9uX2JhdHRlcnlfc2h1dGRvd25fYWZ0ZXJfc2VjcxgCIAEoDRIfChdhZGNfbXVsdGlwbGllcl9vdmVycmlkZRgDIAEoAhIbChN3YWl0X2JsdWV0b290aF9zZWNzGAQgASgNEhAKCHNkc19zZWNzGAYgASgNEg8KB2xzX3NlY3MYByABKA0SFQoNbWluX3dha2Vfc2VjcxgIIAEoDRIiChpkZXZpY2VfYmF0dGVyeV9pbmFfYWRkcmVzcxgJIAEoDRIYChBwb3dlcm1vbl9lbmFibGVzGCAgASgEGuUDCg1OZXR3b3JrQ29uZmlnEhQKDHdpZmlfZW5hYmxlZBgBIAEoCBIRCgl3aWZpX3NzaWQYAyABKAkSEAoId2lmaV9wc2sYBCABKAkSEgoKbnRwX3NlcnZlchgFIAEoCRITCgtldGhfZW5hYmxlZBgGIAEoCBJCCgxhZGRyZXNzX21vZGUYByABKA4yLC5tZXNodGFzdGljLkNvbmZpZy5OZXR3b3JrQ29uZmlnLkFkZHJlc3NNb2RlEkAKC2lwdjRfY29uZmlnGAggASgLMisubWVzaHRhc3RpYy5Db25maWcuTmV0d29ya0NvbmZpZy5JcFY0Q29uZmlnEhYKDnJzeXNsb2dfc2VydmVyGAkgASgJEhkKEWVuYWJsZWRfcHJvdG9jb2xzGAogASgNEhQKDGlwdjZfZW5hYmxlZBgLIAEoCBpGCgpJcFY0Q29uZmlnEgoKAmlwGAEgASgHEg8KB2dhdGV3YXkYAiABKAcSDgoGc3VibmV0GAMgASgHEgsKA2RucxgEIAEoByIjCgtBZGRyZXNzTW9kZRIICgRESENQEAASCgoGU1RBVElDEAEiNAoNUHJvdG9jb2xGbGFncxIQCgxOT19CUk9BRENBU1QQABIRCg1VRFBfQlJPQURDQVNUEAEawggKDURpc3BsYXlDb25maWcSFgoOc2NyZWVuX29uX3NlY3MYASABKA0SVgoKZ3BzX2Zvcm1hdBgCIAEoDjI+Lm1lc2h0YXN0aWMuQ29uZmlnLkRpc3BsYXlDb25maWcuRGVwcmVjYXRlZEdwc0Nvb3JkaW5hdGVGb3JtYXRCAhgBEiEKGWF1dG9fc2NyZWVuX2Nhcm91c2VsX3NlY3MYAyABKA0SHQoRY29tcGFzc19ub3J0aF90b3AYBCABKAhCAhgBEhMKC2ZsaXBfc2NyZWVuGAUgASgIEjwKBXVuaXRzGAYgASgOMi0ubWVzaHRhc3RpYy5Db25maWcuRGlzcGxheUNvbmZpZy5EaXNwbGF5VW5pdHMSNwoEb2xlZBgHIAEoDjIpLm1lc2h0YXN0aWMuQ29uZmlnLkRpc3BsYXlDb25maWcuT2xlZFR5cGUSQQoLZGlzcGxheW1vZGUYCCABKA4yLC5tZXNodGFzdGljLkNvbmZpZy5EaXNwbGF5Q29uZmlnLkRpc3BsYXlNb2RlEhQKDGhlYWRpbmdfYm9sZBgJIAEoCBIdChV3YWtlX29uX3RhcF9vcl9tb3Rpb24YCiABKAgSUAoTY29tcGFzc19vcmllbnRhdGlvbhgLIAEoDjIzLm1lc2h0YXN0aWMuQ29uZmlnLkRpc3BsYXlDb25maWcuQ29tcGFzc09yaWVudGF0aW9uEhUKDXVzZV8xMmhfY2xvY2sYDCABKAgSGgoSdXNlX2xvbmdfbm9kZV9uYW1lGA0gASgIEh4KFmVuYWJsZV9tZXNzYWdlX2J1YmJsZXMYDiABKAgiKwodRGVwcmVjYXRlZEdwc0Nvb3JkaW5hdGVGb3JtYXQSCgoGVU5VU0VEEAAiKAoMRGlzcGxheVVuaXRzEgoKBk1FVFJJQxAAEgwKCElNUEVSSUFMEAEifwoIT2xlZFR5cGUSDQoJT0xFRF9BVVRPEAASEAoMT0xFRF9TU0QxMzA2EAESDwoLT0xFRF9TSDExMDYQAhIPCgtPTEVEX1NIMTEwNxADEhcKE09MRURfU0gxMTA3XzEyOF8xMjgQBBIXChNPTEVEX1NIMTEwN19ST1RBVEVEEAUiQQoLRGlzcGxheU1vZGUSCwoHREVGQVVMVBAAEgwKCFRXT0NPTE9SEAESDAoISU5WRVJURUQQAhIJCgVDT0xPUhADIroBChJDb21wYXNzT3JpZW50YXRpb24SDQoJREVHUkVFU18wEAASDgoKREVHUkVFU185MBABEg8KC0RFR1JFRVNfMTgwEAISDwoLREVHUkVFU18yNzAQAxIWChJERUdSRUVTXzBfSU5WRVJURUQQBBIXChNERUdSRUVTXzkwX0lOVkVSVEVEEAUSGAoUREVHUkVFU18xODBfSU5WRVJURUQQBhIYChRERUdSRUVTXzI3MF9JTlZFUlRFRBAHGvkKCgpMb1JhQ29uZmlnEhIKCnVzZV9wcmVzZXQYASABKAgSPwoMbW9kZW1fcHJlc2V0GAIgASgOMikubWVzaHRhc3RpYy5Db25maWcuTG9SYUNvbmZpZy5Nb2RlbVByZXNldBIRCgliYW5kd2lkdGgYAyABKA0SFQoNc3ByZWFkX2ZhY3RvchgEIAEoDRITCgtjb2RpbmdfcmF0ZRgFIAEoDRIYChBmcmVxdWVuY3lfb2Zmc2V0GAYgASgCEjgKBnJlZ2lvbhgHIAEoDjIoLm1lc2h0YXN0aWMuQ29uZmlnLkxvUmFDb25maWcuUmVnaW9uQ29kZRIRCglob3BfbGltaXQYCCABKA0SEgoKdHhfZW5hYmxlZBgJIAEoCBIQCgh0eF9wb3dlchgKIAEoBRITCgtjaGFubmVsX251bRgLIAEoDRIbChNvdmVycmlkZV9kdXR5X2N5Y2xlGAwgASgIEh4KFnN4MTI2eF9yeF9ib29zdGVkX2dhaW4YDSABKAgSGgoSb3ZlcnJpZGVfZnJlcXVlbmN5GA4gASgCEhcKD3BhX2Zhbl9kaXNhYmxlZBgPIAEoCBIXCg9pZ25vcmVfaW5jb21pbmcYZyADKA0SEwoLaWdub3JlX21xdHQYaCABKAgSGQoRY29uZmlnX29rX3RvX21xdHQYaSABKAgSQAoMZmVtX2xuYV9tb2RlGGogASgOMioubWVzaHRhc3RpYy5Db25maWcuTG9SYUNvbmZpZy5GRU1fTE5BX01vZGUSFwoPc2VyaWFsX2hhbF9vbmx5GGsgASgIIsQDCgpSZWdpb25Db2RlEgkKBVVOU0VUEAASBgoCVVMQARIKCgZFVV80MzMQAhIKCgZFVV84NjgQAxIGCgJDThAEEgYKAkpQEAUSBwoDQU5aEAYSBgoCS1IQBxIGCgJUVxAIEgYKAlJVEAkSBgoCSU4QChIKCgZOWl84NjUQCxIGCgJUSBAMEgsKB0xPUkFfMjQQDRIKCgZVQV80MzMQDhIKCgZVQV84NjgQDxIKCgZNWV80MzMQEBIKCgZNWV85MTkQERIKCgZTR185MjMQEhIKCgZQSF80MzMQExIKCgZQSF84NjgQFBIKCgZQSF85MTUQFRILCgdBTlpfNDMzEBYSCgoGS1pfNDMzEBcSCgoGS1pfODYzEBgSCgoGTlBfODY1EBkSCgoGQlJfOTAyEBoSCwoHSVRVMV8yTRAbEgsKB0lUVTJfMk0QHBIKCgZFVV84NjYQHRIKCgZFVV84NzQQHhIKCgZFVV85MTcQHxIMCghFVV9OXzg2OBAgEgsKB0lUVTNfMk0QIRINCglJVFUxXzcwQ00QIhINCglJVFUyXzcwQ00QIxINCglJVFUzXzcwQ00QJBIOCgpJVFUyXzEyNUNNECUimwIKC01vZGVtUHJlc2V0Eg0KCUxPTkdfRkFTVBAAEhEKCUxPTkdfU0xPVxABGgIIARIWCg5WRVJZX0xPTkdfU0xPVxACGgIIARIPCgtNRURJVU1fU0xPVxADEg8KC01FRElVTV9GQVNUEAQSDgoKU0hPUlRfU0xPVxAFEg4KClNIT1JUX0ZBU1QQBhIRCg1MT05HX01PREVSQVRFEAcSDwoLU0hPUlRfVFVSQk8QCBIOCgpMT05HX1RVUkJPEAkSDQoJTElURV9GQVNUEAoSDQoJTElURV9TTE9XEAsSDwoLTkFSUk9XX0ZBU1QQDBIPCgtOQVJST1dfU0xPVxANEg0KCVRJTllfRkFTVBAOEg0KCVRJTllfU0xPVxAPIjoKDEZFTV9MTkFfTW9kZRIMCghESVNBQkxFRBAAEgsKB0VOQUJMRUQQARIPCgtOT1RfUFJFU0VOVBACGq0BCg9CbHVldG9vdGhDb25maWcSDwoHZW5hYmxlZBgBIAEoCBI8CgRtb2RlGAIgASgOMi4ubWVzaHRhc3RpYy5Db25maWcuQmx1ZXRvb3RoQ29uZmlnLlBhaXJpbmdNb2RlEhEKCWZpeGVkX3BpbhgDIAEoDSI4CgtQYWlyaW5nTW9kZRIOCgpSQU5ET01fUElOEAASDQoJRklYRURfUElOEAESCgoGTk9fUElOEAIatgEKDlNlY3VyaXR5Q29uZmlnEhIKCnB1YmxpY19rZXkYASABKAwSEwoLcHJpdmF0ZV9rZXkYAiABKAwSEQoJYWRtaW5fa2V5GAMgAygMEhIKCmlzX21hbmFnZWQYBCABKAgSFgoOc2VyaWFsX2VuYWJsZWQYBSABKAgSHQoVZGVidWdfbG9nX2FwaV9lbmFibGVkGAYgASgIEh0KFWFkbWluX2NoYW5uZWxfZW5hYmxlZBgIIAEoCBoSChBTZXNzaW9ua2V5Q29uZmlnQhEKD3BheWxvYWRfdmFyaWFudEJiChRvcmcubWVzaHRhc3RpYy5wcm90b0IMQ29uZmlnUHJvdG9zWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw", [file_meshtastic_device_ui]); + +/** + * @generated from message meshtastic.Config + */ +export type Config = Message<"meshtastic.Config"> & { + /** + * + * Payload Variant + * + * @generated from oneof meshtastic.Config.payload_variant + */ + payloadVariant: { + /** + * @generated from field: meshtastic.Config.DeviceConfig device = 1; + */ + value: Config_DeviceConfig; + case: "device"; + } | { + /** + * @generated from field: meshtastic.Config.PositionConfig position = 2; + */ + value: Config_PositionConfig; + case: "position"; + } | { + /** + * @generated from field: meshtastic.Config.PowerConfig power = 3; + */ + value: Config_PowerConfig; + case: "power"; + } | { + /** + * @generated from field: meshtastic.Config.NetworkConfig network = 4; + */ + value: Config_NetworkConfig; + case: "network"; + } | { + /** + * @generated from field: meshtastic.Config.DisplayConfig display = 5; + */ + value: Config_DisplayConfig; + case: "display"; + } | { + /** + * @generated from field: meshtastic.Config.LoRaConfig lora = 6; + */ + value: Config_LoRaConfig; + case: "lora"; + } | { + /** + * @generated from field: meshtastic.Config.BluetoothConfig bluetooth = 7; + */ + value: Config_BluetoothConfig; + case: "bluetooth"; + } | { + /** + * @generated from field: meshtastic.Config.SecurityConfig security = 8; + */ + value: Config_SecurityConfig; + case: "security"; + } | { + /** + * @generated from field: meshtastic.Config.SessionkeyConfig sessionkey = 9; + */ + value: Config_SessionkeyConfig; + case: "sessionkey"; + } | { + /** + * @generated from field: meshtastic.DeviceUIConfig device_ui = 10; + */ + value: DeviceUIConfig; + case: "deviceUi"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.Config. + * Use `create(ConfigSchema)` to create a new message. + */ +export const ConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0); + +/** + * + * Configuration + * + * @generated from message meshtastic.Config.DeviceConfig + */ +export type Config_DeviceConfig = Message<"meshtastic.Config.DeviceConfig"> & { + /** + * + * Sets the role of node + * + * @generated from field: meshtastic.Config.DeviceConfig.Role role = 1; + */ + role: Config_DeviceConfig_Role; + + /** + * + * Disabling this will disable the SerialConsole by not initilizing the StreamAPI + * Moved to SecurityConfig + * + * @generated from field: bool serial_enabled = 2 [deprecated = true]; + * @deprecated + */ + serialEnabled: boolean; + + /** + * + * For boards without a hard wired button, this is the pin number that will be used + * Boards that have more than one button can swap the function with this one. defaults to BUTTON_PIN if defined. + * + * @generated from field: uint32 button_gpio = 4; + */ + buttonGpio: number; + + /** + * + * For boards without a PWM buzzer, this is the pin number that will be used + * Defaults to PIN_BUZZER if defined. + * + * @generated from field: uint32 buzzer_gpio = 5; + */ + buzzerGpio: number; + + /** + * + * Sets the role of node + * + * @generated from field: meshtastic.Config.DeviceConfig.RebroadcastMode rebroadcast_mode = 6; + */ + rebroadcastMode: Config_DeviceConfig_RebroadcastMode; + + /** + * + * Send our nodeinfo this often + * Defaults to 900 Seconds (15 minutes) + * + * @generated from field: uint32 node_info_broadcast_secs = 7; + */ + nodeInfoBroadcastSecs: number; + + /** + * + * Treat double tap interrupt on supported accelerometers as a button press if set to true + * + * @generated from field: bool double_tap_as_button_press = 8; + */ + doubleTapAsButtonPress: boolean; + + /** + * + * If true, device is considered to be "managed" by a mesh administrator + * Clients should then limit available configuration and administrative options inside the user interface + * Moved to SecurityConfig + * + * @generated from field: bool is_managed = 9 [deprecated = true]; + * @deprecated + */ + isManaged: boolean; + + /** + * + * Disables the triple-press of user button to enable or disable GPS + * + * @generated from field: bool disable_triple_click = 10; + */ + disableTripleClick: boolean; + + /** + * + * POSIX Timezone definition string from https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv. + * + * @generated from field: string tzdef = 11; + */ + tzdef: string; + + /** + * + * If true, disable the default blinking LED (LED_PIN) behavior on the device + * + * @generated from field: bool led_heartbeat_disabled = 12; + */ + ledHeartbeatDisabled: boolean; + + /** + * + * Controls buzzer behavior for audio feedback + * Defaults to ENABLED + * + * @generated from field: meshtastic.Config.DeviceConfig.BuzzerMode buzzer_mode = 13; + */ + buzzerMode: Config_DeviceConfig_BuzzerMode; +}; + +/** + * Describes the message meshtastic.Config.DeviceConfig. + * Use `create(Config_DeviceConfigSchema)` to create a new message. + */ +export const Config_DeviceConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 0); + +/** + * + * Defines the device's role on the Mesh network + * + * @generated from enum meshtastic.Config.DeviceConfig.Role + */ +export enum Config_DeviceConfig_Role { + /** + * + * Description: App connected or stand alone messaging device. + * Technical Details: Default Role + * + * @generated from enum value: CLIENT = 0; + */ + CLIENT = 0, + + /** + * + * Description: Device that does not forward packets from other devices. + * + * @generated from enum value: CLIENT_MUTE = 1; + */ + CLIENT_MUTE = 1, + + /** + * + * Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. + * Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. + * The wifi radio and the oled screen will be put to sleep. + * This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. + * + * @generated from enum value: ROUTER = 2; + */ + ROUTER = 2, + + /** + * @generated from enum value: ROUTER_CLIENT = 3 [deprecated = true]; + * @deprecated + */ + ROUTER_CLIENT = 3, + + /** + * + * Description: Infrastructure node for extending network coverage by relaying messages with minimal overhead. Not visible in Nodes list. + * Technical Details: Mesh packets will simply be rebroadcasted over this node. Nodes configured with this role will not originate NodeInfo, Position, Telemetry + * or any other packet type. They will simply rebroadcast any mesh packets on the same frequency, channel num, spread factor, and coding rate. + * Deprecated in v2.7.11 because it creates "holes" in the mesh rebroadcast chain. + * + * @generated from enum value: REPEATER = 4 [deprecated = true]; + * @deprecated + */ + REPEATER = 4, + + /** + * + * Description: Broadcasts GPS position packets as priority. + * Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. + * When used in conjunction with power.is_power_saving = true, nodes will wake up, + * send position, and then sleep for position.position_broadcast_secs seconds. + * + * @generated from enum value: TRACKER = 5; + */ + TRACKER = 5, + + /** + * + * Description: Broadcasts telemetry packets as priority. + * Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. + * When used in conjunction with power.is_power_saving = true, nodes will wake up, + * send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. + * + * @generated from enum value: SENSOR = 6; + */ + SENSOR = 6, + + /** + * + * Description: Optimized for ATAK system communication and reduces routine broadcasts. + * Technical Details: Used for nodes dedicated for connection to an ATAK EUD. + * Turns off many of the routine broadcasts to favor CoT packet stream + * from the Meshtastic ATAK plugin -> IMeshService -> Node + * + * @generated from enum value: TAK = 7; + */ + TAK = 7, + + /** + * + * Description: Device that only broadcasts as needed for stealth or power savings. + * Technical Details: Used for nodes that "only speak when spoken to" + * Turns all of the routine broadcasts but allows for ad-hoc communication + * Still rebroadcasts, but with local only rebroadcast mode (known meshes only) + * Can be used for clandestine operation or to dramatically reduce airtime / power consumption + * + * @generated from enum value: CLIENT_HIDDEN = 8; + */ + CLIENT_HIDDEN = 8, + + /** + * + * Description: Broadcasts location as message to default channel regularly for to assist with device recovery. + * Technical Details: Used to automatically send a text message to the mesh + * with the current position of the device on a frequent interval: + * "I'm lost! Position: lat / long" + * + * @generated from enum value: LOST_AND_FOUND = 9; + */ + LOST_AND_FOUND = 9, + + /** + * + * Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. + * Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream + * and automatic TAK PLI (position location information) broadcasts. + * Uses position module configuration to determine TAK PLI broadcast interval. + * + * @generated from enum value: TAK_TRACKER = 10; + */ + TAK_TRACKER = 10, + + /** + * + * Description: Will always rebroadcast packets, but will do so after all other modes. + * Technical Details: Used for router nodes that are intended to provide additional coverage + * in areas not already covered by other routers, or to bridge around problematic terrain, + * but should not be given priority over other routers in order to avoid unnecessaraily + * consuming hops. + * + * @generated from enum value: ROUTER_LATE = 11; + */ + ROUTER_LATE = 11, + + /** + * + * Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. + * Technical Details: Used for stronger attic/roof nodes to distribute messages more widely + * from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes + * where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. + * + * @generated from enum value: CLIENT_BASE = 12; + */ + CLIENT_BASE = 12, +} + +/** + * Describes the enum meshtastic.Config.DeviceConfig.Role. + */ +export const Config_DeviceConfig_RoleSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 0, 0); + +/** + * + * Defines the device's behavior for how messages are rebroadcast + * + * @generated from enum meshtastic.Config.DeviceConfig.RebroadcastMode + */ +export enum Config_DeviceConfig_RebroadcastMode { + /** + * + * Default behavior. + * Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params. + * + * @generated from enum value: ALL = 0; + */ + ALL = 0, + + /** + * + * Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. + * Only available in Repeater role. Setting this on any other roles will result in ALL behavior. + * + * @generated from enum value: ALL_SKIP_DECODING = 1; + */ + ALL_SKIP_DECODING = 1, + + /** + * + * Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. + * Only rebroadcasts message on the nodes local primary / secondary channels. + * + * @generated from enum value: LOCAL_ONLY = 2; + */ + LOCAL_ONLY = 2, + + /** + * + * Ignores observed messages from foreign meshes like LOCAL_ONLY, + * but takes it step further by also ignoring messages from nodenums not in the node's known list (NodeDB) + * + * @generated from enum value: KNOWN_ONLY = 3; + */ + KNOWN_ONLY = 3, + + /** + * + * Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. + * + * @generated from enum value: NONE = 4; + */ + NONE = 4, + + /** + * + * Ignores packets from non-standard portnums such as: TAK, RangeTest, PaxCounter, etc. + * Only rebroadcasts packets with standard portnums: NodeInfo, Text, Position, Telemetry, and Routing. + * + * @generated from enum value: CORE_PORTNUMS_ONLY = 5; + */ + CORE_PORTNUMS_ONLY = 5, +} + +/** + * Describes the enum meshtastic.Config.DeviceConfig.RebroadcastMode. + */ +export const Config_DeviceConfig_RebroadcastModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 0, 1); + +/** + * + * Defines buzzer behavior for audio feedback + * + * @generated from enum meshtastic.Config.DeviceConfig.BuzzerMode + */ +export enum Config_DeviceConfig_BuzzerMode { + /** + * + * Default behavior. + * Buzzer is enabled for all audio feedback including button presses and alerts. + * + * @generated from enum value: ALL_ENABLED = 0; + */ + ALL_ENABLED = 0, + + /** + * + * Disabled. + * All buzzer audio feedback is disabled. + * + * @generated from enum value: DISABLED = 1; + */ + DISABLED = 1, + + /** + * + * Notifications Only. + * Buzzer is enabled only for notifications and alerts, but not for button presses. + * External notification config determines the specifics of the notification behavior. + * + * @generated from enum value: NOTIFICATIONS_ONLY = 2; + */ + NOTIFICATIONS_ONLY = 2, + + /** + * + * Non-notification system buzzer tones only. + * Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. + * + * @generated from enum value: SYSTEM_ONLY = 3; + */ + SYSTEM_ONLY = 3, + + /** + * + * Direct Message notifications only. + * Buzzer is enabled only for direct messages and alerts, but not for button presses. + * External notification config determines the specifics of the notification behavior. + * + * @generated from enum value: DIRECT_MSG_ONLY = 4; + */ + DIRECT_MSG_ONLY = 4, +} + +/** + * Describes the enum meshtastic.Config.DeviceConfig.BuzzerMode. + */ +export const Config_DeviceConfig_BuzzerModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 0, 2); + +/** + * + * Position Config + * + * @generated from message meshtastic.Config.PositionConfig + */ +export type Config_PositionConfig = Message<"meshtastic.Config.PositionConfig"> & { + /** + * + * We should send our position this often (but only if it has changed significantly) + * Defaults to 15 minutes + * + * @generated from field: uint32 position_broadcast_secs = 1; + */ + positionBroadcastSecs: number; + + /** + * + * Adaptive position braoadcast, which is now the default. + * + * @generated from field: bool position_broadcast_smart_enabled = 2; + */ + positionBroadcastSmartEnabled: boolean; + + /** + * + * If set, this node is at a fixed position. + * We will generate GPS position updates at the regular interval, but use whatever the last lat/lon/alt we have for the node. + * The lat/lon/alt can be set by an internal GPS or with the help of the app. + * + * @generated from field: bool fixed_position = 3; + */ + fixedPosition: boolean; + + /** + * + * Is GPS enabled for this node? + * + * @generated from field: bool gps_enabled = 4 [deprecated = true]; + * @deprecated + */ + gpsEnabled: boolean; + + /** + * + * How often should we try to get GPS position (in seconds) + * or zero for the default of once every 30 seconds + * or a very large value (maxint) to update only once at boot. + * + * @generated from field: uint32 gps_update_interval = 5; + */ + gpsUpdateInterval: number; + + /** + * + * Deprecated in favor of using smart / regular broadcast intervals as implicit attempt time + * + * @generated from field: uint32 gps_attempt_time = 6 [deprecated = true]; + * @deprecated + */ + gpsAttemptTime: number; + + /** + * + * Bit field of boolean configuration options for POSITION messages + * (bitwise OR of PositionFlags) + * + * @generated from field: uint32 position_flags = 7; + */ + positionFlags: number; + + /** + * + * (Re)define GPS_RX_PIN for your board. + * + * @generated from field: uint32 rx_gpio = 8; + */ + rxGpio: number; + + /** + * + * (Re)define GPS_TX_PIN for your board. + * + * @generated from field: uint32 tx_gpio = 9; + */ + txGpio: number; + + /** + * + * The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled + * + * @generated from field: uint32 broadcast_smart_minimum_distance = 10; + */ + broadcastSmartMinimumDistance: number; + + /** + * + * The minimum number of seconds (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled + * + * @generated from field: uint32 broadcast_smart_minimum_interval_secs = 11; + */ + broadcastSmartMinimumIntervalSecs: number; + + /** + * + * (Re)define PIN_GPS_EN for your board. + * + * @generated from field: uint32 gps_en_gpio = 12; + */ + gpsEnGpio: number; + + /** + * + * Set where GPS is enabled, disabled, or not present + * + * @generated from field: meshtastic.Config.PositionConfig.GpsMode gps_mode = 13; + */ + gpsMode: Config_PositionConfig_GpsMode; +}; + +/** + * Describes the message meshtastic.Config.PositionConfig. + * Use `create(Config_PositionConfigSchema)` to create a new message. + */ +export const Config_PositionConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 1); + +/** + * + * Bit field of boolean configuration options, indicating which optional + * fields to include when assembling POSITION messages. + * Longitude, latitude, altitude, speed, heading, and DOP + * are always included (also time if GPS-synced) + * NOTE: the more fields are included, the larger the message will be - + * leading to longer airtime and a higher risk of packet loss + * + * @generated from enum meshtastic.Config.PositionConfig.PositionFlags + */ +export enum Config_PositionConfig_PositionFlags { + /** + * + * Required for compilation + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * Include an altitude value (if available) + * + * @generated from enum value: ALTITUDE = 1; + */ + ALTITUDE = 1, + + /** + * + * Altitude value is MSL + * + * @generated from enum value: ALTITUDE_MSL = 2; + */ + ALTITUDE_MSL = 2, + + /** + * + * Include geoidal separation + * + * @generated from enum value: GEOIDAL_SEPARATION = 4; + */ + GEOIDAL_SEPARATION = 4, + + /** + * + * Include the DOP value ; PDOP used by default, see below + * + * @generated from enum value: DOP = 8; + */ + DOP = 8, + + /** + * + * If POS_DOP set, send separate HDOP / VDOP values instead of PDOP + * + * @generated from enum value: HVDOP = 16; + */ + HVDOP = 16, + + /** + * + * Include number of "satellites in view" + * + * @generated from enum value: SATINVIEW = 32; + */ + SATINVIEW = 32, + + /** + * + * Include a sequence number incremented per packet + * + * @generated from enum value: SEQ_NO = 64; + */ + SEQ_NO = 64, + + /** + * + * Include positional timestamp (from GPS solution) + * + * @generated from enum value: TIMESTAMP = 128; + */ + TIMESTAMP = 128, + + /** + * + * Include positional heading + * Intended for use with vehicle not walking speeds + * walking speeds are likely to be error prone like the compass + * + * @generated from enum value: HEADING = 256; + */ + HEADING = 256, + + /** + * + * Include positional speed + * Intended for use with vehicle not walking speeds + * walking speeds are likely to be error prone like the compass + * + * @generated from enum value: SPEED = 512; + */ + SPEED = 512, +} + +/** + * Describes the enum meshtastic.Config.PositionConfig.PositionFlags. + */ +export const Config_PositionConfig_PositionFlagsSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 1, 0); + +/** + * @generated from enum meshtastic.Config.PositionConfig.GpsMode + */ +export enum Config_PositionConfig_GpsMode { + /** + * + * GPS is present but disabled + * + * @generated from enum value: DISABLED = 0; + */ + DISABLED = 0, + + /** + * + * GPS is present and enabled + * + * @generated from enum value: ENABLED = 1; + */ + ENABLED = 1, + + /** + * + * GPS is not present on the device + * + * @generated from enum value: NOT_PRESENT = 2; + */ + NOT_PRESENT = 2, +} + +/** + * Describes the enum meshtastic.Config.PositionConfig.GpsMode. + */ +export const Config_PositionConfig_GpsModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 1, 1); + +/** + * + * Power Config\ + * See [Power Config](/docs/settings/config/power) for additional power config details. + * + * @generated from message meshtastic.Config.PowerConfig + */ +export type Config_PowerConfig = Message<"meshtastic.Config.PowerConfig"> & { + /** + * + * Description: Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. + * Don't use this setting if you want to use your device with the phone apps or are using a device without a user button. + * Technical Details: Works for ESP32 devices and NRF52 devices in the Sensor or Tracker roles + * + * @generated from field: bool is_power_saving = 1; + */ + isPowerSaving: boolean; + + /** + * + * Description: If non-zero, the device will fully power off this many seconds after external power is removed. + * + * @generated from field: uint32 on_battery_shutdown_after_secs = 2; + */ + onBatteryShutdownAfterSecs: number; + + /** + * + * Ratio of voltage divider for battery pin eg. 3.20 (R1=100k, R2=220k) + * Overrides the ADC_MULTIPLIER defined in variant for battery voltage calculation. + * https://meshtastic.org/docs/configuration/radio/power/#adc-multiplier-override + * Should be set to floating point value between 2 and 6 + * + * @generated from field: float adc_multiplier_override = 3; + */ + adcMultiplierOverride: number; + + /** + * + * Description: The number of seconds for to wait before turning off BLE in No Bluetooth states + * Technical Details: ESP32 Only 0 for default of 1 minute + * + * @generated from field: uint32 wait_bluetooth_secs = 4; + */ + waitBluetoothSecs: number; + + /** + * + * Super Deep Sleep Seconds + * While in Light Sleep if mesh_sds_timeout_secs is exceeded we will lower into super deep sleep + * for this value (default 1 year) or a button press + * 0 for default of one year + * + * @generated from field: uint32 sds_secs = 6; + */ + sdsSecs: number; + + /** + * + * Description: In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on + * Technical Details: ESP32 Only 0 for default of 300 + * + * @generated from field: uint32 ls_secs = 7; + */ + lsSecs: number; + + /** + * + * Description: While in light sleep when we receive packets on the LoRa radio we will wake and handle them and stay awake in no BLE mode for this value + * Technical Details: ESP32 Only 0 for default of 10 seconds + * + * @generated from field: uint32 min_wake_secs = 8; + */ + minWakeSecs: number; + + /** + * + * I2C address of INA_2XX to use for reading device battery voltage + * + * @generated from field: uint32 device_battery_ina_address = 9; + */ + deviceBatteryInaAddress: number; + + /** + * + * If non-zero, we want powermon log outputs. With the particular (bitfield) sources enabled. + * Note: we picked an ID of 32 so that lower more efficient IDs can be used for more frequently used options. + * + * @generated from field: uint64 powermon_enables = 32; + */ + powermonEnables: bigint; +}; + +/** + * Describes the message meshtastic.Config.PowerConfig. + * Use `create(Config_PowerConfigSchema)` to create a new message. + */ +export const Config_PowerConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 2); + +/** + * + * Network Config + * + * @generated from message meshtastic.Config.NetworkConfig + */ +export type Config_NetworkConfig = Message<"meshtastic.Config.NetworkConfig"> & { + /** + * + * Enable WiFi (disables Bluetooth) + * + * @generated from field: bool wifi_enabled = 1; + */ + wifiEnabled: boolean; + + /** + * + * If set, this node will try to join the specified wifi network and + * acquire an address via DHCP + * + * @generated from field: string wifi_ssid = 3; + */ + wifiSsid: string; + + /** + * + * If set, will be use to authenticate to the named wifi + * + * @generated from field: string wifi_psk = 4; + */ + wifiPsk: string; + + /** + * + * NTP server to use if WiFi is conneced, defaults to `meshtastic.pool.ntp.org` + * + * @generated from field: string ntp_server = 5; + */ + ntpServer: string; + + /** + * + * Enable Ethernet + * + * @generated from field: bool eth_enabled = 6; + */ + ethEnabled: boolean; + + /** + * + * acquire an address via DHCP or assign static + * + * @generated from field: meshtastic.Config.NetworkConfig.AddressMode address_mode = 7; + */ + addressMode: Config_NetworkConfig_AddressMode; + + /** + * + * struct to keep static address + * + * @generated from field: meshtastic.Config.NetworkConfig.IpV4Config ipv4_config = 8; + */ + ipv4Config?: Config_NetworkConfig_IpV4Config | undefined; + + /** + * + * rsyslog Server and Port + * + * @generated from field: string rsyslog_server = 9; + */ + rsyslogServer: string; + + /** + * + * Flags for enabling/disabling network protocols + * + * @generated from field: uint32 enabled_protocols = 10; + */ + enabledProtocols: number; + + /** + * + * Enable/Disable ipv6 support + * + * @generated from field: bool ipv6_enabled = 11; + */ + ipv6Enabled: boolean; +}; + +/** + * Describes the message meshtastic.Config.NetworkConfig. + * Use `create(Config_NetworkConfigSchema)` to create a new message. + */ +export const Config_NetworkConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 3); + +/** + * @generated from message meshtastic.Config.NetworkConfig.IpV4Config + */ +export type Config_NetworkConfig_IpV4Config = Message<"meshtastic.Config.NetworkConfig.IpV4Config"> & { + /** + * + * Static IP address + * + * @generated from field: fixed32 ip = 1; + */ + ip: number; + + /** + * + * Static gateway address + * + * @generated from field: fixed32 gateway = 2; + */ + gateway: number; + + /** + * + * Static subnet mask + * + * @generated from field: fixed32 subnet = 3; + */ + subnet: number; + + /** + * + * Static DNS server address + * + * @generated from field: fixed32 dns = 4; + */ + dns: number; +}; + +/** + * Describes the message meshtastic.Config.NetworkConfig.IpV4Config. + * Use `create(Config_NetworkConfig_IpV4ConfigSchema)` to create a new message. + */ +export const Config_NetworkConfig_IpV4ConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 3, 0); + +/** + * @generated from enum meshtastic.Config.NetworkConfig.AddressMode + */ +export enum Config_NetworkConfig_AddressMode { + /** + * + * obtain ip address via DHCP + * + * @generated from enum value: DHCP = 0; + */ + DHCP = 0, + + /** + * + * use static ip address + * + * @generated from enum value: STATIC = 1; + */ + STATIC = 1, +} + +/** + * Describes the enum meshtastic.Config.NetworkConfig.AddressMode. + */ +export const Config_NetworkConfig_AddressModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 3, 0); + +/** + * + * Available flags auxiliary network protocols + * + * @generated from enum meshtastic.Config.NetworkConfig.ProtocolFlags + */ +export enum Config_NetworkConfig_ProtocolFlags { + /** + * + * Do not broadcast packets over any network protocol + * + * @generated from enum value: NO_BROADCAST = 0; + */ + NO_BROADCAST = 0, + + /** + * + * Enable broadcasting packets via UDP over the local network + * + * @generated from enum value: UDP_BROADCAST = 1; + */ + UDP_BROADCAST = 1, +} + +/** + * Describes the enum meshtastic.Config.NetworkConfig.ProtocolFlags. + */ +export const Config_NetworkConfig_ProtocolFlagsSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 3, 1); + +/** + * + * Display Config + * + * @generated from message meshtastic.Config.DisplayConfig + */ +export type Config_DisplayConfig = Message<"meshtastic.Config.DisplayConfig"> & { + /** + * + * Number of seconds the screen stays on after pressing the user button or receiving a message + * 0 for default of one minute MAXUINT for always on + * + * @generated from field: uint32 screen_on_secs = 1; + */ + screenOnSecs: number; + + /** + * + * Deprecated in 2.7.4: Unused + * How the GPS coordinates are formatted on the OLED screen. + * + * @generated from field: meshtastic.Config.DisplayConfig.DeprecatedGpsCoordinateFormat gps_format = 2 [deprecated = true]; + * @deprecated + */ + gpsFormat: Config_DisplayConfig_DeprecatedGpsCoordinateFormat; + + /** + * + * Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds. + * Potentially useful for devices without user buttons. + * + * @generated from field: uint32 auto_screen_carousel_secs = 3; + */ + autoScreenCarouselSecs: number; + + /** + * + * If this is set, the displayed compass will always point north. if unset, the old behaviour + * (top of display is heading direction) is used. + * + * @generated from field: bool compass_north_top = 4 [deprecated = true]; + * @deprecated + */ + compassNorthTop: boolean; + + /** + * + * Flip screen vertically, for cases that mount the screen upside down + * + * @generated from field: bool flip_screen = 5; + */ + flipScreen: boolean; + + /** + * + * Perferred display units + * + * @generated from field: meshtastic.Config.DisplayConfig.DisplayUnits units = 6; + */ + units: Config_DisplayConfig_DisplayUnits; + + /** + * + * Override auto-detect in screen + * + * @generated from field: meshtastic.Config.DisplayConfig.OledType oled = 7; + */ + oled: Config_DisplayConfig_OledType; + + /** + * + * Display Mode + * + * @generated from field: meshtastic.Config.DisplayConfig.DisplayMode displaymode = 8; + */ + displaymode: Config_DisplayConfig_DisplayMode; + + /** + * + * Print first line in pseudo-bold? FALSE is original style, TRUE is bold + * + * @generated from field: bool heading_bold = 9; + */ + headingBold: boolean; + + /** + * + * Should we wake the screen up on accelerometer detected motion or tap + * + * @generated from field: bool wake_on_tap_or_motion = 10; + */ + wakeOnTapOrMotion: boolean; + + /** + * + * Indicates how to rotate or invert the compass output to accurate display on the display. + * + * @generated from field: meshtastic.Config.DisplayConfig.CompassOrientation compass_orientation = 11; + */ + compassOrientation: Config_DisplayConfig_CompassOrientation; + + /** + * + * If false (default), the device will display the time in 24-hour format on screen. + * If true, the device will display the time in 12-hour format on screen. + * + * @generated from field: bool use_12h_clock = 12; + */ + use12hClock: boolean; + + /** + * + * If false (default), the device will use short names for various display screens. + * If true, node names will show in long format + * + * @generated from field: bool use_long_node_name = 13; + */ + useLongNodeName: boolean; + + /** + * + * If true, the device will display message bubbles on screen. + * + * @generated from field: bool enable_message_bubbles = 14; + */ + enableMessageBubbles: boolean; +}; + +/** + * Describes the message meshtastic.Config.DisplayConfig. + * Use `create(Config_DisplayConfigSchema)` to create a new message. + */ +export const Config_DisplayConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 4); + +/** + * + * Deprecated in 2.7.4: Unused + * + * @generated from enum meshtastic.Config.DisplayConfig.DeprecatedGpsCoordinateFormat + */ +export enum Config_DisplayConfig_DeprecatedGpsCoordinateFormat { + /** + * @generated from enum value: UNUSED = 0; + */ + UNUSED = 0, +} + +/** + * Describes the enum meshtastic.Config.DisplayConfig.DeprecatedGpsCoordinateFormat. + */ +export const Config_DisplayConfig_DeprecatedGpsCoordinateFormatSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 4, 0); + +/** + * + * Unit display preference + * + * @generated from enum meshtastic.Config.DisplayConfig.DisplayUnits + */ +export enum Config_DisplayConfig_DisplayUnits { + /** + * + * Metric (Default) + * + * @generated from enum value: METRIC = 0; + */ + METRIC = 0, + + /** + * + * Imperial + * + * @generated from enum value: IMPERIAL = 1; + */ + IMPERIAL = 1, +} + +/** + * Describes the enum meshtastic.Config.DisplayConfig.DisplayUnits. + */ +export const Config_DisplayConfig_DisplayUnitsSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 4, 1); + +/** + * + * Override OLED outo detect with this if it fails. + * + * @generated from enum meshtastic.Config.DisplayConfig.OledType + */ +export enum Config_DisplayConfig_OledType { + /** + * + * Default / Autodetect + * + * @generated from enum value: OLED_AUTO = 0; + */ + OLED_AUTO = 0, + + /** + * + * Default / Autodetect + * + * @generated from enum value: OLED_SSD1306 = 1; + */ + OLED_SSD1306 = 1, + + /** + * + * Default / Autodetect + * + * @generated from enum value: OLED_SH1106 = 2; + */ + OLED_SH1106 = 2, + + /** + * + * Can not be auto detected but set by proto. Used for 128x64 screens + * + * @generated from enum value: OLED_SH1107 = 3; + */ + OLED_SH1107 = 3, + + /** + * + * Can not be auto detected but set by proto. Used for 128x128 screens + * + * @generated from enum value: OLED_SH1107_128_128 = 4; + */ + OLED_SH1107_128_128 = 4, + + /** + * + * Can not be auto detected but set by proto. Used for 64x128 rotated screens + * + * @generated from enum value: OLED_SH1107_ROTATED = 5; + */ + OLED_SH1107_ROTATED = 5, +} + +/** + * Describes the enum meshtastic.Config.DisplayConfig.OledType. + */ +export const Config_DisplayConfig_OledTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 4, 2); + +/** + * @generated from enum meshtastic.Config.DisplayConfig.DisplayMode + */ +export enum Config_DisplayConfig_DisplayMode { + /** + * + * Default. The old style for the 128x64 OLED screen + * + * @generated from enum value: DEFAULT = 0; + */ + DEFAULT = 0, + + /** + * + * Rearrange display elements to cater for bicolor OLED displays + * + * @generated from enum value: TWOCOLOR = 1; + */ + TWOCOLOR = 1, + + /** + * + * Same as TwoColor, but with inverted top bar. Not so good for Epaper displays + * + * @generated from enum value: INVERTED = 2; + */ + INVERTED = 2, + + /** + * + * TFT Full Color Displays (not implemented yet) + * + * @generated from enum value: COLOR = 3; + */ + COLOR = 3, +} + +/** + * Describes the enum meshtastic.Config.DisplayConfig.DisplayMode. + */ +export const Config_DisplayConfig_DisplayModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 4, 3); + +/** + * @generated from enum meshtastic.Config.DisplayConfig.CompassOrientation + */ +export enum Config_DisplayConfig_CompassOrientation { + /** + * + * The compass and the display are in the same orientation. + * + * @generated from enum value: DEGREES_0 = 0; + */ + DEGREES_0 = 0, + + /** + * + * Rotate the compass by 90 degrees. + * + * @generated from enum value: DEGREES_90 = 1; + */ + DEGREES_90 = 1, + + /** + * + * Rotate the compass by 180 degrees. + * + * @generated from enum value: DEGREES_180 = 2; + */ + DEGREES_180 = 2, + + /** + * + * Rotate the compass by 270 degrees. + * + * @generated from enum value: DEGREES_270 = 3; + */ + DEGREES_270 = 3, + + /** + * + * Don't rotate the compass, but invert the result. + * + * @generated from enum value: DEGREES_0_INVERTED = 4; + */ + DEGREES_0_INVERTED = 4, + + /** + * + * Rotate the compass by 90 degrees and invert. + * + * @generated from enum value: DEGREES_90_INVERTED = 5; + */ + DEGREES_90_INVERTED = 5, + + /** + * + * Rotate the compass by 180 degrees and invert. + * + * @generated from enum value: DEGREES_180_INVERTED = 6; + */ + DEGREES_180_INVERTED = 6, + + /** + * + * Rotate the compass by 270 degrees and invert. + * + * @generated from enum value: DEGREES_270_INVERTED = 7; + */ + DEGREES_270_INVERTED = 7, +} + +/** + * Describes the enum meshtastic.Config.DisplayConfig.CompassOrientation. + */ +export const Config_DisplayConfig_CompassOrientationSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 4, 4); + +/** + * + * Lora Config + * + * @generated from message meshtastic.Config.LoRaConfig + */ +export type Config_LoRaConfig = Message<"meshtastic.Config.LoRaConfig"> & { + /** + * + * When enabled, the `modem_preset` fields will be adhered to, else the `bandwidth`/`spread_factor`/`coding_rate` + * will be taked from their respective manually defined fields + * + * @generated from field: bool use_preset = 1; + */ + usePreset: boolean; + + /** + * + * Either modem_config or bandwidth/spreading/coding will be specified - NOT BOTH. + * As a heuristic: If bandwidth is specified, do not use modem_config. + * Because protobufs take ZERO space when the value is zero this works out nicely. + * This value is replaced by bandwidth/spread_factor/coding_rate. + * If you'd like to experiment with other options add them to MeshRadio.cpp in the device code. + * + * @generated from field: meshtastic.Config.LoRaConfig.ModemPreset modem_preset = 2; + */ + modemPreset: Config_LoRaConfig_ModemPreset; + + /** + * + * Bandwidth in MHz + * Certain bandwidth numbers are 'special' and will be converted to the + * appropriate floating point value: 31 -> 31.25MHz + * + * @generated from field: uint32 bandwidth = 3; + */ + bandwidth: number; + + /** + * + * A number from 7 to 12. + * Indicates number of chirps per symbol as 1< 7 results in the default + * + * @generated from field: uint32 hop_limit = 8; + */ + hopLimit: number; + + /** + * + * Disable TX from the LoRa radio. Useful for hot-swapping antennas and other tests. + * Defaults to false + * + * @generated from field: bool tx_enabled = 9; + */ + txEnabled: boolean; + + /** + * + * If zero, then use default max legal continuous power (ie. something that won't + * burn out the radio hardware) + * In most cases you should use zero here. + * Units are in dBm. + * + * @generated from field: int32 tx_power = 10; + */ + txPower: number; + + /** + * + * This controls the actual hardware frequency the radio transmits on. + * Most users should never need to be exposed to this field/concept. + * A channel number between 1 and NUM_CHANNELS (whatever the max is in the current region). + * If ZERO then the rule is "use the old channel name hash based + * algorithm to derive the channel number") + * If using the hash algorithm the channel number will be: hash(channel_name) % + * NUM_CHANNELS (Where num channels depends on the regulatory region). + * + * @generated from field: uint32 channel_num = 11; + */ + channelNum: number; + + /** + * + * If true, duty cycle limits will be exceeded and thus you're possibly not following + * the local regulations if you're not a HAM. + * Has no effect if the duty cycle of the used region is 100%. + * + * @generated from field: bool override_duty_cycle = 12; + */ + overrideDutyCycle: boolean; + + /** + * + * If true, sets RX boosted gain mode on SX126X based radios + * + * @generated from field: bool sx126x_rx_boosted_gain = 13; + */ + sx126xRxBoostedGain: boolean; + + /** + * + * This parameter is for advanced users and licensed HAM radio operators. + * Ignore Channel Calculation and use this frequency instead. The frequency_offset + * will still be applied. This will allow you to use out-of-band frequencies. + * Please respect your local laws and regulations. If you are a HAM, make sure you + * enable HAM mode and turn off encryption. + * + * @generated from field: float override_frequency = 14; + */ + overrideFrequency: number; + + /** + * + * If true, disable the build-in PA FAN using pin define in RF95_FAN_EN. + * + * @generated from field: bool pa_fan_disabled = 15; + */ + paFanDisabled: boolean; + + /** + * + * For testing it is useful sometimes to force a node to never listen to + * particular other nodes (simulating radio out of range). All nodenums listed + * in ignore_incoming will have packets they send dropped on receive (by router.cpp) + * + * @generated from field: repeated uint32 ignore_incoming = 103; + */ + ignoreIncoming: number[]; + + /** + * + * If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it. + * + * @generated from field: bool ignore_mqtt = 104; + */ + ignoreMqtt: boolean; + + /** + * + * Sets the ok_to_mqtt bit on outgoing packets + * + * @generated from field: bool config_ok_to_mqtt = 105; + */ + configOkToMqtt: boolean; + + /** + * + * Set where LORA FEM is enabled, disabled, or not present + * + * @generated from field: meshtastic.Config.LoRaConfig.FEM_LNA_Mode fem_lna_mode = 106; + */ + femLnaMode: Config_LoRaConfig_FEM_LNA_Mode; + + /** + * + * Don't use radiolib to initialize the radio, instead listen for a serialHal connection + * + * @generated from field: bool serial_hal_only = 107; + */ + serialHalOnly: boolean; +}; + +/** + * Describes the message meshtastic.Config.LoRaConfig. + * Use `create(Config_LoRaConfigSchema)` to create a new message. + */ +export const Config_LoRaConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 5); + +/** + * @generated from enum meshtastic.Config.LoRaConfig.RegionCode + */ +export enum Config_LoRaConfig_RegionCode { + /** + * + * Region is not set + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * United States + * + * @generated from enum value: US = 1; + */ + US = 1, + + /** + * + * European Union 433mhz + * + * @generated from enum value: EU_433 = 2; + */ + EU_433 = 2, + + /** + * + * European Union 868mhz + * + * @generated from enum value: EU_868 = 3; + */ + EU_868 = 3, + + /** + * + * China + * + * @generated from enum value: CN = 4; + */ + CN = 4, + + /** + * + * Japan + * + * @generated from enum value: JP = 5; + */ + JP = 5, + + /** + * + * Australia / New Zealand + * + * @generated from enum value: ANZ = 6; + */ + ANZ = 6, + + /** + * + * Korea + * + * @generated from enum value: KR = 7; + */ + KR = 7, + + /** + * + * Taiwan + * + * @generated from enum value: TW = 8; + */ + TW = 8, + + /** + * + * Russia + * + * @generated from enum value: RU = 9; + */ + RU = 9, + + /** + * + * India + * + * @generated from enum value: IN = 10; + */ + IN = 10, + + /** + * + * New Zealand 865mhz + * + * @generated from enum value: NZ_865 = 11; + */ + NZ_865 = 11, + + /** + * + * Thailand + * + * @generated from enum value: TH = 12; + */ + TH = 12, + + /** + * + * WLAN Band + * + * @generated from enum value: LORA_24 = 13; + */ + LORA_24 = 13, + + /** + * + * Ukraine 433mhz + * + * @generated from enum value: UA_433 = 14; + */ + UA_433 = 14, + + /** + * + * Ukraine 868mhz + * + * @generated from enum value: UA_868 = 15; + */ + UA_868 = 15, + + /** + * + * Malaysia 433mhz + * + * @generated from enum value: MY_433 = 16; + */ + MY_433 = 16, + + /** + * + * Malaysia 919mhz + * + * @generated from enum value: MY_919 = 17; + */ + MY_919 = 17, + + /** + * + * Singapore 923mhz + * + * @generated from enum value: SG_923 = 18; + */ + SG_923 = 18, + + /** + * + * Philippines 433mhz + * + * @generated from enum value: PH_433 = 19; + */ + PH_433 = 19, + + /** + * + * Philippines 868mhz + * + * @generated from enum value: PH_868 = 20; + */ + PH_868 = 20, + + /** + * + * Philippines 915mhz + * + * @generated from enum value: PH_915 = 21; + */ + PH_915 = 21, + + /** + * + * Australia / New Zealand 433MHz + * + * @generated from enum value: ANZ_433 = 22; + */ + ANZ_433 = 22, + + /** + * + * Kazakhstan 433MHz + * + * @generated from enum value: KZ_433 = 23; + */ + KZ_433 = 23, + + /** + * + * Kazakhstan 863MHz + * + * @generated from enum value: KZ_863 = 24; + */ + KZ_863 = 24, + + /** + * + * Nepal 865MHz + * + * @generated from enum value: NP_865 = 25; + */ + NP_865 = 25, + + /** + * + * Brazil 902MHz + * + * @generated from enum value: BR_902 = 26; + */ + BR_902 = 26, + + /** + * + * ITU Region 1 Amateur Radio 2m band (144-146 MHz) + * + * @generated from enum value: ITU1_2M = 27; + */ + ITU1_2M = 27, + + /** + * + * ITU Region 2 Amateur Radio 2m band (144-148 MHz) + * + * @generated from enum value: ITU2_2M = 28; + */ + ITU2_2M = 28, + + /** + * + * EU 866MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD) + * + * @generated from enum value: EU_866 = 29; + */ + EU_866 = 29, + + /** + * + * EU 874MHz and 917MHz bands (Band no. 1 and 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD) + * + * @generated from enum value: EU_874 = 30; + */ + EU_874 = 30, + + /** + * @generated from enum value: EU_917 = 31; + */ + EU_917 = 31, + + /** + * + * EU 868MHz band, with narrow presets + * + * @generated from enum value: EU_N_868 = 32; + */ + EU_N_868 = 32, + + /** + * + * ITU Region 3 Amateur Radio 2m band (144-148 MHz) + * + * @generated from enum value: ITU3_2M = 33; + */ + ITU3_2M = 33, + + /** + * + * ITU Region 1 Amateur Radio 70cm band (430-440 MHz) + * + * @generated from enum value: ITU1_70CM = 34; + */ + ITU1_70CM = 34, + + /** + * + * ITU Region 2 Amateur Radio 70cm band (420-450 MHz) + * Note: Some countries do not allocate 420-430 MHz or 440-450 MHz. + * Check local law! + * + * @generated from enum value: ITU2_70CM = 35; + */ + ITU2_70CM = 35, + + /** + * + * ITU Region 3 Amateur Radio 70cm band (430-450 MHz) + * Note: Some countries do not allocate 440-450 MHz. Check local law! + * + * @generated from enum value: ITU3_70CM = 36; + */ + ITU3_70CM = 36, + + /** + * + * ITU Region 2 Amateur Radio 1.25m '125cm' band (220-225 MHz) + * Note: Some countries do not allocate 220-222 MHz (Ex: USA/Canada). + * Check local law! + * + * @generated from enum value: ITU2_125CM = 37; + */ + ITU2_125CM = 37, +} + +/** + * Describes the enum meshtastic.Config.LoRaConfig.RegionCode. + */ +export const Config_LoRaConfig_RegionCodeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 5, 0); + +/** + * + * Standard predefined channel settings + * Note: these mappings must match ModemPreset Choice in the device code. + * + * @generated from enum meshtastic.Config.LoRaConfig.ModemPreset + */ +export enum Config_LoRaConfig_ModemPreset { + /** + * + * Long Range - Fast + * + * @generated from enum value: LONG_FAST = 0; + */ + LONG_FAST = 0, + + /** + * + * Long Range - Slow + * Deprecated in 2.7: Unpopular slow preset. + * + * @generated from enum value: LONG_SLOW = 1 [deprecated = true]; + * @deprecated + */ + LONG_SLOW = 1, + + /** + * + * Very Long Range - Slow + * Deprecated in 2.5: Works only with txco and is unusably slow + * + * @generated from enum value: VERY_LONG_SLOW = 2 [deprecated = true]; + * @deprecated + */ + VERY_LONG_SLOW = 2, + + /** + * + * Medium Range - Slow + * + * @generated from enum value: MEDIUM_SLOW = 3; + */ + MEDIUM_SLOW = 3, + + /** + * + * Medium Range - Fast + * + * @generated from enum value: MEDIUM_FAST = 4; + */ + MEDIUM_FAST = 4, + + /** + * + * Short Range - Slow + * + * @generated from enum value: SHORT_SLOW = 5; + */ + SHORT_SLOW = 5, + + /** + * + * Short Range - Fast + * + * @generated from enum value: SHORT_FAST = 6; + */ + SHORT_FAST = 6, + + /** + * + * Long Range - Moderately Fast + * + * @generated from enum value: LONG_MODERATE = 7; + */ + LONG_MODERATE = 7, + + /** + * + * Short Range - Turbo + * This is the fastest preset and the only one with 500kHz bandwidth. + * It is not legal to use in all regions due to this wider bandwidth. + * + * @generated from enum value: SHORT_TURBO = 8; + */ + SHORT_TURBO = 8, + + /** + * + * Long Range - Turbo + * This preset performs similarly to LongFast, but with 500Khz bandwidth. + * + * @generated from enum value: LONG_TURBO = 9; + */ + LONG_TURBO = 9, + + /** + * + * Lite Fast + * Medium range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. + * Comparable link budget to MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC. + * + * @generated from enum value: LITE_FAST = 10; + */ + LITE_FAST = 10, + + /** + * + * Lite Slow + * Medium-to-moderate range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. + * Comparable link budget to LONG_FAST but compliant with Band no. 47b of 2006/771/EC. + * + * @generated from enum value: LITE_SLOW = 11; + */ + LITE_SLOW = 11, + + /** + * + * Narrow Fast + * Medium-to-moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. + * Comparable link budget to SHORT_SLOW, but with half the data rate. + * Intended to avoid interference with other devices. + * + * @generated from enum value: NARROW_FAST = 12; + */ + NARROW_FAST = 12, + + /** + * + * Narrow Slow + * Moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. + * Comparable link budget and data rate to LONG_FAST. + * + * @generated from enum value: NARROW_SLOW = 13; + */ + NARROW_SLOW = 13, + + /** + * + * Tiny Fast + * Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + * Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + * Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + * Only compatible with SX127x and SX126x chipsets. + * Comparable link budget and data rate to LONG_FAST. + * + * @generated from enum value: TINY_FAST = 14; + */ + TINY_FAST = 14, + + /** + * + * Tiny Slow + * Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + * Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + * Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + * Only compatible with SX127x and SX126x chipsets. + * Comparable link budget and data rate to LONG_MODERATE. + * + * @generated from enum value: TINY_SLOW = 15; + */ + TINY_SLOW = 15, +} + +/** + * Describes the enum meshtastic.Config.LoRaConfig.ModemPreset. + */ +export const Config_LoRaConfig_ModemPresetSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 5, 1); + +/** + * @generated from enum meshtastic.Config.LoRaConfig.FEM_LNA_Mode + */ +export enum Config_LoRaConfig_FEM_LNA_Mode { + /** + * + * FEM_LNA is present but disabled + * + * @generated from enum value: DISABLED = 0; + */ + DISABLED = 0, + + /** + * + * FEM_LNA is present and enabled + * + * @generated from enum value: ENABLED = 1; + */ + ENABLED = 1, + + /** + * + * FEM_LNA is not present on the device + * + * @generated from enum value: NOT_PRESENT = 2; + */ + NOT_PRESENT = 2, +} + +/** + * Describes the enum meshtastic.Config.LoRaConfig.FEM_LNA_Mode. + */ +export const Config_LoRaConfig_FEM_LNA_ModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 5, 2); + +/** + * @generated from message meshtastic.Config.BluetoothConfig + */ +export type Config_BluetoothConfig = Message<"meshtastic.Config.BluetoothConfig"> & { + /** + * + * Enable Bluetooth on the device + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * Determines the pairing strategy for the device + * + * @generated from field: meshtastic.Config.BluetoothConfig.PairingMode mode = 2; + */ + mode: Config_BluetoothConfig_PairingMode; + + /** + * + * Specified PIN for PairingMode.FixedPin + * + * @generated from field: uint32 fixed_pin = 3; + */ + fixedPin: number; +}; + +/** + * Describes the message meshtastic.Config.BluetoothConfig. + * Use `create(Config_BluetoothConfigSchema)` to create a new message. + */ +export const Config_BluetoothConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 6); + +/** + * @generated from enum meshtastic.Config.BluetoothConfig.PairingMode + */ +export enum Config_BluetoothConfig_PairingMode { + /** + * + * Device generates a random PIN that will be shown on the screen of the device for pairing + * + * @generated from enum value: RANDOM_PIN = 0; + */ + RANDOM_PIN = 0, + + /** + * + * Device requires a specified fixed PIN for pairing + * + * @generated from enum value: FIXED_PIN = 1; + */ + FIXED_PIN = 1, + + /** + * + * Device requires no PIN for pairing + * + * @generated from enum value: NO_PIN = 2; + */ + NO_PIN = 2, +} + +/** + * Describes the enum meshtastic.Config.BluetoothConfig.PairingMode. + */ +export const Config_BluetoothConfig_PairingModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_config, 0, 6, 0); + +/** + * @generated from message meshtastic.Config.SecurityConfig + */ +export type Config_SecurityConfig = Message<"meshtastic.Config.SecurityConfig"> & { + /** + * + * The public key of the user's device. + * Sent out to other nodes on the mesh to allow them to compute a shared secret key. + * + * @generated from field: bytes public_key = 1; + */ + publicKey: Uint8Array; + + /** + * + * The private key of the device. + * Used to create a shared key with a remote device. + * + * @generated from field: bytes private_key = 2; + */ + privateKey: Uint8Array; + + /** + * + * The public key authorized to send admin messages to this node. + * + * @generated from field: repeated bytes admin_key = 3; + */ + adminKey: Uint8Array[]; + + /** + * + * If true, device is considered to be "managed" by a mesh administrator via admin messages + * Device is managed by a mesh administrator. + * + * @generated from field: bool is_managed = 4; + */ + isManaged: boolean; + + /** + * + * Serial Console over the Stream API." + * + * @generated from field: bool serial_enabled = 5; + */ + serialEnabled: boolean; + + /** + * + * By default we turn off logging as soon as an API client connects (to keep shared serial link quiet). + * Output live debug logging over serial or bluetooth is set to true. + * + * @generated from field: bool debug_log_api_enabled = 6; + */ + debugLogApiEnabled: boolean; + + /** + * + * Allow incoming device control over the insecure legacy admin channel. + * + * @generated from field: bool admin_channel_enabled = 8; + */ + adminChannelEnabled: boolean; +}; + +/** + * Describes the message meshtastic.Config.SecurityConfig. + * Use `create(Config_SecurityConfigSchema)` to create a new message. + */ +export const Config_SecurityConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 7); + +/** + * + * Blank config request, strictly for getting the session key + * + * @generated from message meshtastic.Config.SessionkeyConfig + */ +export type Config_SessionkeyConfig = Message<"meshtastic.Config.SessionkeyConfig"> & { +}; + +/** + * Describes the message meshtastic.Config.SessionkeyConfig. + * Use `create(Config_SessionkeyConfigSchema)` to create a new message. + */ +export const Config_SessionkeyConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_config, 0, 8); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/connection_status_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/connection_status_pb.ts new file mode 100644 index 00000000..3768ff67 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/connection_status_pb.ts @@ -0,0 +1,237 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/connection_status.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/connection_status.proto. + */ +export const file_meshtastic_connection_status: GenFile = /*@__PURE__*/ + fileDesc("CiJtZXNodGFzdGljL2Nvbm5lY3Rpb25fc3RhdHVzLnByb3RvEgptZXNodGFzdGljIrECChZEZXZpY2VDb25uZWN0aW9uU3RhdHVzEjMKBHdpZmkYASABKAsyIC5tZXNodGFzdGljLldpZmlDb25uZWN0aW9uU3RhdHVzSACIAQESOwoIZXRoZXJuZXQYAiABKAsyJC5tZXNodGFzdGljLkV0aGVybmV0Q29ubmVjdGlvblN0YXR1c0gBiAEBEj0KCWJsdWV0b290aBgDIAEoCzIlLm1lc2h0YXN0aWMuQmx1ZXRvb3RoQ29ubmVjdGlvblN0YXR1c0gCiAEBEjcKBnNlcmlhbBgEIAEoCzIiLm1lc2h0YXN0aWMuU2VyaWFsQ29ubmVjdGlvblN0YXR1c0gDiAEBQgcKBV93aWZpQgsKCV9ldGhlcm5ldEIMCgpfYmx1ZXRvb3RoQgkKB19zZXJpYWwiZwoUV2lmaUNvbm5lY3Rpb25TdGF0dXMSMwoGc3RhdHVzGAEgASgLMiMubWVzaHRhc3RpYy5OZXR3b3JrQ29ubmVjdGlvblN0YXR1cxIMCgRzc2lkGAIgASgJEgwKBHJzc2kYAyABKAUiTwoYRXRoZXJuZXRDb25uZWN0aW9uU3RhdHVzEjMKBnN0YXR1cxgBIAEoCzIjLm1lc2h0YXN0aWMuTmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMiewoXTmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMSEgoKaXBfYWRkcmVzcxgBIAEoBxIUCgxpc19jb25uZWN0ZWQYAiABKAgSGQoRaXNfbXF0dF9jb25uZWN0ZWQYAyABKAgSGwoTaXNfc3lzbG9nX2Nvbm5lY3RlZBgEIAEoCCJMChlCbHVldG9vdGhDb25uZWN0aW9uU3RhdHVzEgsKA3BpbhgBIAEoDRIMCgRyc3NpGAIgASgFEhQKDGlzX2Nvbm5lY3RlZBgDIAEoCCI8ChZTZXJpYWxDb25uZWN0aW9uU3RhdHVzEgwKBGJhdWQYASABKA0SFAoMaXNfY29ubmVjdGVkGAIgASgIQmYKFG9yZy5tZXNodGFzdGljLnByb3RvQhBDb25uU3RhdHVzUHJvdG9zWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw"); + +/** + * @generated from message meshtastic.DeviceConnectionStatus + */ +export type DeviceConnectionStatus = Message<"meshtastic.DeviceConnectionStatus"> & { + /** + * + * WiFi Status + * + * @generated from field: optional meshtastic.WifiConnectionStatus wifi = 1; + */ + wifi?: WifiConnectionStatus | undefined; + + /** + * + * WiFi Status + * + * @generated from field: optional meshtastic.EthernetConnectionStatus ethernet = 2; + */ + ethernet?: EthernetConnectionStatus | undefined; + + /** + * + * Bluetooth Status + * + * @generated from field: optional meshtastic.BluetoothConnectionStatus bluetooth = 3; + */ + bluetooth?: BluetoothConnectionStatus | undefined; + + /** + * + * Serial Status + * + * @generated from field: optional meshtastic.SerialConnectionStatus serial = 4; + */ + serial?: SerialConnectionStatus | undefined; +}; + +/** + * Describes the message meshtastic.DeviceConnectionStatus. + * Use `create(DeviceConnectionStatusSchema)` to create a new message. + */ +export const DeviceConnectionStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_connection_status, 0); + +/** + * + * WiFi connection status + * + * @generated from message meshtastic.WifiConnectionStatus + */ +export type WifiConnectionStatus = Message<"meshtastic.WifiConnectionStatus"> & { + /** + * + * Connection status + * + * @generated from field: meshtastic.NetworkConnectionStatus status = 1; + */ + status?: NetworkConnectionStatus | undefined; + + /** + * + * WiFi access point SSID + * + * @generated from field: string ssid = 2; + */ + ssid: string; + + /** + * + * RSSI of wireless connection + * + * @generated from field: int32 rssi = 3; + */ + rssi: number; +}; + +/** + * Describes the message meshtastic.WifiConnectionStatus. + * Use `create(WifiConnectionStatusSchema)` to create a new message. + */ +export const WifiConnectionStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_connection_status, 1); + +/** + * + * Ethernet connection status + * + * @generated from message meshtastic.EthernetConnectionStatus + */ +export type EthernetConnectionStatus = Message<"meshtastic.EthernetConnectionStatus"> & { + /** + * + * Connection status + * + * @generated from field: meshtastic.NetworkConnectionStatus status = 1; + */ + status?: NetworkConnectionStatus | undefined; +}; + +/** + * Describes the message meshtastic.EthernetConnectionStatus. + * Use `create(EthernetConnectionStatusSchema)` to create a new message. + */ +export const EthernetConnectionStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_connection_status, 2); + +/** + * + * Ethernet or WiFi connection status + * + * @generated from message meshtastic.NetworkConnectionStatus + */ +export type NetworkConnectionStatus = Message<"meshtastic.NetworkConnectionStatus"> & { + /** + * + * IP address of device + * + * @generated from field: fixed32 ip_address = 1; + */ + ipAddress: number; + + /** + * + * Whether the device has an active connection or not + * + * @generated from field: bool is_connected = 2; + */ + isConnected: boolean; + + /** + * + * Whether the device has an active connection to an MQTT broker or not + * + * @generated from field: bool is_mqtt_connected = 3; + */ + isMqttConnected: boolean; + + /** + * + * Whether the device is actively remote syslogging or not + * + * @generated from field: bool is_syslog_connected = 4; + */ + isSyslogConnected: boolean; +}; + +/** + * Describes the message meshtastic.NetworkConnectionStatus. + * Use `create(NetworkConnectionStatusSchema)` to create a new message. + */ +export const NetworkConnectionStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_connection_status, 3); + +/** + * + * Bluetooth connection status + * + * @generated from message meshtastic.BluetoothConnectionStatus + */ +export type BluetoothConnectionStatus = Message<"meshtastic.BluetoothConnectionStatus"> & { + /** + * + * The pairing PIN for bluetooth + * + * @generated from field: uint32 pin = 1; + */ + pin: number; + + /** + * + * RSSI of bluetooth connection + * + * @generated from field: int32 rssi = 2; + */ + rssi: number; + + /** + * + * Whether the device has an active connection or not + * + * @generated from field: bool is_connected = 3; + */ + isConnected: boolean; +}; + +/** + * Describes the message meshtastic.BluetoothConnectionStatus. + * Use `create(BluetoothConnectionStatusSchema)` to create a new message. + */ +export const BluetoothConnectionStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_connection_status, 4); + +/** + * + * Serial connection status + * + * @generated from message meshtastic.SerialConnectionStatus + */ +export type SerialConnectionStatus = Message<"meshtastic.SerialConnectionStatus"> & { + /** + * + * Serial baud rate + * + * @generated from field: uint32 baud = 1; + */ + baud: number; + + /** + * + * Whether the device has an active connection or not + * + * @generated from field: bool is_connected = 2; + */ + isConnected: boolean; +}; + +/** + * Describes the message meshtastic.SerialConnectionStatus. + * Use `create(SerialConnectionStatusSchema)` to create a new message. + */ +export const SerialConnectionStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_connection_status, 5); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/device_ui_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/device_ui_pb.ts new file mode 100644 index 00000000..20fe4344 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/device_ui_pb.ts @@ -0,0 +1,698 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/device_ui.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/device_ui.proto. + */ +export const file_meshtastic_device_ui: GenFile = /*@__PURE__*/ + fileDesc("ChptZXNodGFzdGljL2RldmljZV91aS5wcm90bxIKbWVzaHRhc3RpYyLABQoORGV2aWNlVUlDb25maWcSDwoHdmVyc2lvbhgBIAEoDRIZChFzY3JlZW5fYnJpZ2h0bmVzcxgCIAEoDRIWCg5zY3JlZW5fdGltZW91dBgDIAEoDRITCgtzY3JlZW5fbG9jaxgEIAEoCBIVCg1zZXR0aW5nc19sb2NrGAUgASgIEhAKCHBpbl9jb2RlGAYgASgNEiAKBXRoZW1lGAcgASgOMhEubWVzaHRhc3RpYy5UaGVtZRIVCg1hbGVydF9lbmFibGVkGAggASgIEhYKDmJhbm5lcl9lbmFibGVkGAkgASgIEhQKDHJpbmdfdG9uZV9pZBgKIAEoDRImCghsYW5ndWFnZRgLIAEoDjIULm1lc2h0YXN0aWMuTGFuZ3VhZ2USKwoLbm9kZV9maWx0ZXIYDCABKAsyFi5tZXNodGFzdGljLk5vZGVGaWx0ZXISMQoObm9kZV9oaWdobGlnaHQYDSABKAsyGS5tZXNodGFzdGljLk5vZGVIaWdobGlnaHQSGAoQY2FsaWJyYXRpb25fZGF0YRgOIAEoDBIhCghtYXBfZGF0YRgPIAEoCzIPLm1lc2h0YXN0aWMuTWFwEi0KDGNvbXBhc3NfbW9kZRgQIAEoDjIXLm1lc2h0YXN0aWMuQ29tcGFzc01vZGUSGAoQc2NyZWVuX3JnYl9jb2xvchgRIAEoDRIbChNpc19jbG9ja2ZhY2VfYW5hbG9nGBIgASgIEkIKCmdwc19mb3JtYXQYEyABKA4yLi5tZXNodGFzdGljLkRldmljZVVJQ29uZmlnLkdwc0Nvb3JkaW5hdGVGb3JtYXQiVgoTR3BzQ29vcmRpbmF0ZUZvcm1hdBIHCgNERUMQABIHCgNETVMQARIHCgNVVE0QAhIICgRNR1JTEAMSBwoDT0xDEAQSCAoET1NHUhAFEgcKA01MUxAGIqcBCgpOb2RlRmlsdGVyEhYKDnVua25vd25fc3dpdGNoGAEgASgIEhYKDm9mZmxpbmVfc3dpdGNoGAIgASgIEhkKEXB1YmxpY19rZXlfc3dpdGNoGAMgASgIEhEKCWhvcHNfYXdheRgEIAEoBRIXCg9wb3NpdGlvbl9zd2l0Y2gYBSABKAgSEQoJbm9kZV9uYW1lGAYgASgJEg8KB2NoYW5uZWwYByABKAUifgoNTm9kZUhpZ2hsaWdodBITCgtjaGF0X3N3aXRjaBgBIAEoCBIXCg9wb3NpdGlvbl9zd2l0Y2gYAiABKAgSGAoQdGVsZW1ldHJ5X3N3aXRjaBgDIAEoCBISCgppYXFfc3dpdGNoGAQgASgIEhEKCW5vZGVfbmFtZRgFIAEoCSI9CghHZW9Qb2ludBIMCgR6b29tGAEgASgFEhAKCGxhdGl0dWRlGAIgASgFEhEKCWxvbmdpdHVkZRgDIAEoBSJMCgNNYXASIgoEaG9tZRgBIAEoCzIULm1lc2h0YXN0aWMuR2VvUG9pbnQSDQoFc3R5bGUYAiABKAkSEgoKZm9sbG93X2dwcxgDIAEoCCo+CgtDb21wYXNzTW9kZRILCgdEWU5BTUlDEAASDgoKRklYRURfUklORxABEhIKDkZSRUVaRV9IRUFESU5HEAIqJQoFVGhlbWUSCAoEREFSSxAAEgkKBUxJR0hUEAESBwoDUkVEEAIqwAIKCExhbmd1YWdlEgsKB0VOR0xJU0gQABIKCgZGUkVOQ0gQARIKCgZHRVJNQU4QAhILCgdJVEFMSUFOEAMSDgoKUE9SVFVHVUVTRRAEEgsKB1NQQU5JU0gQBRILCgdTV0VESVNIEAYSCwoHRklOTklTSBAHEgoKBlBPTElTSBAIEgsKB1RVUktJU0gQCRILCgdTRVJCSUFOEAoSCwoHUlVTU0lBThALEgkKBURVVENIEAwSCQoFR1JFRUsQDRINCglOT1JXRUdJQU4QDhINCglTTE9WRU5JQU4QDxINCglVS1JBSU5JQU4QEBINCglCVUxHQVJJQU4QERIJCgVDWkVDSBASEgoKBkRBTklTSBATEhYKElNJTVBMSUZJRURfQ0hJTkVTRRAeEhcKE1RSQURJVElPTkFMX0NISU5FU0UQH0JkChRvcmcubWVzaHRhc3RpYy5wcm90b0IORGV2aWNlVUlQcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * @generated from message meshtastic.DeviceUIConfig + */ +export type DeviceUIConfig = Message<"meshtastic.DeviceUIConfig"> & { + /** + * + * A version integer used to invalidate saved files when we make incompatible changes. + * + * @generated from field: uint32 version = 1; + */ + version: number; + + /** + * + * TFT display brightness 1..255 + * + * @generated from field: uint32 screen_brightness = 2; + */ + screenBrightness: number; + + /** + * + * Screen timeout 0..900 + * + * @generated from field: uint32 screen_timeout = 3; + */ + screenTimeout: number; + + /** + * + * Screen/Settings lock enabled + * + * @generated from field: bool screen_lock = 4; + */ + screenLock: boolean; + + /** + * @generated from field: bool settings_lock = 5; + */ + settingsLock: boolean; + + /** + * @generated from field: uint32 pin_code = 6; + */ + pinCode: number; + + /** + * + * Color theme + * + * @generated from field: meshtastic.Theme theme = 7; + */ + theme: Theme; + + /** + * + * Audible message, banner and ring tone + * + * @generated from field: bool alert_enabled = 8; + */ + alertEnabled: boolean; + + /** + * @generated from field: bool banner_enabled = 9; + */ + bannerEnabled: boolean; + + /** + * @generated from field: uint32 ring_tone_id = 10; + */ + ringToneId: number; + + /** + * + * Localization + * + * @generated from field: meshtastic.Language language = 11; + */ + language: Language; + + /** + * + * Node list filter + * + * @generated from field: meshtastic.NodeFilter node_filter = 12; + */ + nodeFilter?: NodeFilter | undefined; + + /** + * + * Node list highlightening + * + * @generated from field: meshtastic.NodeHighlight node_highlight = 13; + */ + nodeHighlight?: NodeHighlight | undefined; + + /** + * + * 8 integers for screen calibration data + * + * @generated from field: bytes calibration_data = 14; + */ + calibrationData: Uint8Array; + + /** + * + * Map related data + * + * @generated from field: meshtastic.Map map_data = 15; + */ + mapData?: Map | undefined; + + /** + * + * Compass mode + * + * @generated from field: meshtastic.CompassMode compass_mode = 16; + */ + compassMode: CompassMode; + + /** + * + * RGB color for BaseUI + * 0xRRGGBB format, e.g. 0xFF0000 for red + * + * @generated from field: uint32 screen_rgb_color = 17; + */ + screenRgbColor: number; + + /** + * + * Clockface analog style + * true for analog clockface, false for digital clockface + * + * @generated from field: bool is_clockface_analog = 18; + */ + isClockfaceAnalog: boolean; + + /** + * + * How the GPS coordinates are formatted on the OLED screen. + * + * @generated from field: meshtastic.DeviceUIConfig.GpsCoordinateFormat gps_format = 19; + */ + gpsFormat: DeviceUIConfig_GpsCoordinateFormat; +}; + +/** + * Describes the message meshtastic.DeviceUIConfig. + * Use `create(DeviceUIConfigSchema)` to create a new message. + */ +export const DeviceUIConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_device_ui, 0); + +/** + * + * How the GPS coordinates are displayed on the OLED screen. + * + * @generated from enum meshtastic.DeviceUIConfig.GpsCoordinateFormat + */ +export enum DeviceUIConfig_GpsCoordinateFormat { + /** + * + * GPS coordinates are displayed in the normal decimal degrees format: + * DD.DDDDDD DDD.DDDDDD + * + * @generated from enum value: DEC = 0; + */ + DEC = 0, + + /** + * + * GPS coordinates are displayed in the degrees minutes seconds format: + * DD°MM'SS"C DDD°MM'SS"C, where C is the compass point representing the locations quadrant + * + * @generated from enum value: DMS = 1; + */ + DMS = 1, + + /** + * + * Universal Transverse Mercator format: + * ZZB EEEEEE NNNNNNN, where Z is zone, B is band, E is easting, N is northing + * + * @generated from enum value: UTM = 2; + */ + UTM = 2, + + /** + * + * Military Grid Reference System format: + * ZZB CD EEEEE NNNNN, where Z is zone, B is band, C is the east 100k square, D is the north 100k square, + * E is easting, N is northing + * + * @generated from enum value: MGRS = 3; + */ + MGRS = 3, + + /** + * + * Open Location Code (aka Plus Codes). + * + * @generated from enum value: OLC = 4; + */ + OLC = 4, + + /** + * + * Ordnance Survey Grid Reference (the National Grid System of the UK). + * Format: AB EEEEE NNNNN, where A is the east 100k square, B is the north 100k square, + * E is the easting, N is the northing + * + * @generated from enum value: OSGR = 5; + */ + OSGR = 5, + + /** + * + * Maidenhead Locator System + * Described here: https://en.wikipedia.org/wiki/Maidenhead_Locator_System + * + * @generated from enum value: MLS = 6; + */ + MLS = 6, +} + +/** + * Describes the enum meshtastic.DeviceUIConfig.GpsCoordinateFormat. + */ +export const DeviceUIConfig_GpsCoordinateFormatSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_device_ui, 0, 0); + +/** + * @generated from message meshtastic.NodeFilter + */ +export type NodeFilter = Message<"meshtastic.NodeFilter"> & { + /** + * + * Filter unknown nodes + * + * @generated from field: bool unknown_switch = 1; + */ + unknownSwitch: boolean; + + /** + * + * Filter offline nodes + * + * @generated from field: bool offline_switch = 2; + */ + offlineSwitch: boolean; + + /** + * + * Filter nodes w/o public key + * + * @generated from field: bool public_key_switch = 3; + */ + publicKeySwitch: boolean; + + /** + * + * Filter based on hops away + * + * @generated from field: int32 hops_away = 4; + */ + hopsAway: number; + + /** + * + * Filter nodes w/o position + * + * @generated from field: bool position_switch = 5; + */ + positionSwitch: boolean; + + /** + * + * Filter nodes by matching name string + * + * @generated from field: string node_name = 6; + */ + nodeName: string; + + /** + * + * Filter based on channel + * + * @generated from field: int32 channel = 7; + */ + channel: number; +}; + +/** + * Describes the message meshtastic.NodeFilter. + * Use `create(NodeFilterSchema)` to create a new message. + */ +export const NodeFilterSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_device_ui, 1); + +/** + * @generated from message meshtastic.NodeHighlight + */ +export type NodeHighlight = Message<"meshtastic.NodeHighlight"> & { + /** + * + * Hightlight nodes w/ active chat + * + * @generated from field: bool chat_switch = 1; + */ + chatSwitch: boolean; + + /** + * + * Highlight nodes w/ position + * + * @generated from field: bool position_switch = 2; + */ + positionSwitch: boolean; + + /** + * + * Highlight nodes w/ telemetry data + * + * @generated from field: bool telemetry_switch = 3; + */ + telemetrySwitch: boolean; + + /** + * + * Highlight nodes w/ iaq data + * + * @generated from field: bool iaq_switch = 4; + */ + iaqSwitch: boolean; + + /** + * + * Highlight nodes by matching name string + * + * @generated from field: string node_name = 5; + */ + nodeName: string; +}; + +/** + * Describes the message meshtastic.NodeHighlight. + * Use `create(NodeHighlightSchema)` to create a new message. + */ +export const NodeHighlightSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_device_ui, 2); + +/** + * @generated from message meshtastic.GeoPoint + */ +export type GeoPoint = Message<"meshtastic.GeoPoint"> & { + /** + * + * Zoom level + * + * @generated from field: int32 zoom = 1; + */ + zoom: number; + + /** + * + * Coordinate: latitude + * + * @generated from field: int32 latitude = 2; + */ + latitude: number; + + /** + * + * Coordinate: longitude + * + * @generated from field: int32 longitude = 3; + */ + longitude: number; +}; + +/** + * Describes the message meshtastic.GeoPoint. + * Use `create(GeoPointSchema)` to create a new message. + */ +export const GeoPointSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_device_ui, 3); + +/** + * @generated from message meshtastic.Map + */ +export type Map = Message<"meshtastic.Map"> & { + /** + * + * Home coordinates + * + * @generated from field: meshtastic.GeoPoint home = 1; + */ + home?: GeoPoint | undefined; + + /** + * + * Map tile style + * + * @generated from field: string style = 2; + */ + style: string; + + /** + * + * Map scroll follows GPS + * + * @generated from field: bool follow_gps = 3; + */ + followGps: boolean; +}; + +/** + * Describes the message meshtastic.Map. + * Use `create(MapSchema)` to create a new message. + */ +export const MapSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_device_ui, 4); + +/** + * @generated from enum meshtastic.CompassMode + */ +export enum CompassMode { + /** + * + * Compass with dynamic ring and heading + * + * @generated from enum value: DYNAMIC = 0; + */ + DYNAMIC = 0, + + /** + * + * Compass with fixed ring and heading + * + * @generated from enum value: FIXED_RING = 1; + */ + FIXED_RING = 1, + + /** + * + * Compass with heading and freeze option + * + * @generated from enum value: FREEZE_HEADING = 2; + */ + FREEZE_HEADING = 2, +} + +/** + * Describes the enum meshtastic.CompassMode. + */ +export const CompassModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_device_ui, 0); + +/** + * @generated from enum meshtastic.Theme + */ +export enum Theme { + /** + * + * Dark + * + * @generated from enum value: DARK = 0; + */ + DARK = 0, + + /** + * + * Light + * + * @generated from enum value: LIGHT = 1; + */ + LIGHT = 1, + + /** + * + * Red + * + * @generated from enum value: RED = 2; + */ + RED = 2, +} + +/** + * Describes the enum meshtastic.Theme. + */ +export const ThemeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_device_ui, 1); + +/** + * + * Localization + * + * @generated from enum meshtastic.Language + */ +export enum Language { + /** + * + * English + * + * @generated from enum value: ENGLISH = 0; + */ + ENGLISH = 0, + + /** + * + * French + * + * @generated from enum value: FRENCH = 1; + */ + FRENCH = 1, + + /** + * + * German + * + * @generated from enum value: GERMAN = 2; + */ + GERMAN = 2, + + /** + * + * Italian + * + * @generated from enum value: ITALIAN = 3; + */ + ITALIAN = 3, + + /** + * + * Portuguese + * + * @generated from enum value: PORTUGUESE = 4; + */ + PORTUGUESE = 4, + + /** + * + * Spanish + * + * @generated from enum value: SPANISH = 5; + */ + SPANISH = 5, + + /** + * + * Swedish + * + * @generated from enum value: SWEDISH = 6; + */ + SWEDISH = 6, + + /** + * + * Finnish + * + * @generated from enum value: FINNISH = 7; + */ + FINNISH = 7, + + /** + * + * Polish + * + * @generated from enum value: POLISH = 8; + */ + POLISH = 8, + + /** + * + * Turkish + * + * @generated from enum value: TURKISH = 9; + */ + TURKISH = 9, + + /** + * + * Serbian + * + * @generated from enum value: SERBIAN = 10; + */ + SERBIAN = 10, + + /** + * + * Russian + * + * @generated from enum value: RUSSIAN = 11; + */ + RUSSIAN = 11, + + /** + * + * Dutch + * + * @generated from enum value: DUTCH = 12; + */ + DUTCH = 12, + + /** + * + * Greek + * + * @generated from enum value: GREEK = 13; + */ + GREEK = 13, + + /** + * + * Norwegian + * + * @generated from enum value: NORWEGIAN = 14; + */ + NORWEGIAN = 14, + + /** + * + * Slovenian + * + * @generated from enum value: SLOVENIAN = 15; + */ + SLOVENIAN = 15, + + /** + * + * Ukrainian + * + * @generated from enum value: UKRAINIAN = 16; + */ + UKRAINIAN = 16, + + /** + * + * Bulgarian + * + * @generated from enum value: BULGARIAN = 17; + */ + BULGARIAN = 17, + + /** + * + * Czech + * + * @generated from enum value: CZECH = 18; + */ + CZECH = 18, + + /** + * + * Danish + * + * @generated from enum value: DANISH = 19; + */ + DANISH = 19, + + /** + * + * Simplified Chinese (experimental) + * + * @generated from enum value: SIMPLIFIED_CHINESE = 30; + */ + SIMPLIFIED_CHINESE = 30, + + /** + * + * Traditional Chinese (experimental) + * + * @generated from enum value: TRADITIONAL_CHINESE = 31; + */ + TRADITIONAL_CHINESE = 31, +} + +/** + * Describes the enum meshtastic.Language. + */ +export const LanguageSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_device_ui, 2); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/deviceonly_legacy_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/deviceonly_legacy_pb.ts new file mode 100644 index 00000000..34a91fb1 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/deviceonly_legacy_pb.ts @@ -0,0 +1,132 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/deviceonly_legacy.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { PositionLite, UserLite } from "./deviceonly_pb"; +import { file_meshtastic_deviceonly } from "./deviceonly_pb"; +import type { DeviceMetrics } from "./telemetry_pb"; +import { file_meshtastic_telemetry } from "./telemetry_pb"; +import { file_nanopb } from "../nanopb_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/deviceonly_legacy.proto. + */ +export const file_meshtastic_deviceonly_legacy: GenFile = /*@__PURE__*/ + fileDesc("CiJtZXNodGFzdGljL2RldmljZW9ubHlfbGVnYWN5LnByb3RvEgptZXNodGFzdGljItwCChNOb2RlSW5mb0xpdGVfTGVnYWN5EgsKA251bRgBIAEoDRIiCgR1c2VyGAIgASgLMhQubWVzaHRhc3RpYy5Vc2VyTGl0ZRIqCghwb3NpdGlvbhgDIAEoCzIYLm1lc2h0YXN0aWMuUG9zaXRpb25MaXRlEgsKA3NuchgEIAEoAhISCgpsYXN0X2hlYXJkGAUgASgHEjEKDmRldmljZV9tZXRyaWNzGAYgASgLMhkubWVzaHRhc3RpYy5EZXZpY2VNZXRyaWNzEg8KB2NoYW5uZWwYByABKA0SEAoIdmlhX21xdHQYCCABKAgSFgoJaG9wc19hd2F5GAkgASgNSACIAQESEwoLaXNfZmF2b3JpdGUYCiABKAgSEgoKaXNfaWdub3JlZBgLIAEoCBIQCghuZXh0X2hvcBgMIAEoDRIQCghiaXRmaWVsZBgNIAEoDUIMCgpfaG9wc19hd2F5IokBChNOb2RlRGF0YWJhc2VfTGVnYWN5Eg8KB3ZlcnNpb24YASABKA0SYQoFbm9kZXMYAiADKAsyHy5tZXNodGFzdGljLk5vZGVJbmZvTGl0ZV9MZWdhY3lCMZI/LpIBK3N0ZDo6dmVjdG9yPG1lc2h0YXN0aWNfTm9kZUluZm9MaXRlX0xlZ2FjeT5CdAoUb3JnLm1lc2h0YXN0aWMucHJvdG9CEERldmljZU9ubHlMZWdhY3laImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAJI/C8IBCDx2ZWN0b3I+YgZwcm90bzM", [file_meshtastic_deviceonly, file_meshtastic_telemetry, file_nanopb]); + +/** + * + * Legacy NodeInfoLite descriptor used only to decode pre-split + * /prefs/nodes.proto saves during the v24 -> v25 migration boot. + * This preserves the original NodeInfoLite-compatible field numbers needed + * to parse old wire bytes cleanly, including user (2), position (3), + * device_metrics (6), and the legacy-only compatibility fields via_mqtt (8), + * is_favorite (10), and is_ignored (11). Steady-state code does not use + * this struct; it is dropped after migration completes. This file should be + * removed once DEVICESTATE_MIN_VER advances past 24. + * + * @generated from message meshtastic.NodeInfoLite_Legacy + */ +export type NodeInfoLite_Legacy = Message<"meshtastic.NodeInfoLite_Legacy"> & { + /** + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * @generated from field: meshtastic.UserLite user = 2; + */ + user?: UserLite | undefined; + + /** + * @generated from field: meshtastic.PositionLite position = 3; + */ + position?: PositionLite | undefined; + + /** + * @generated from field: float snr = 4; + */ + snr: number; + + /** + * @generated from field: fixed32 last_heard = 5; + */ + lastHeard: number; + + /** + * @generated from field: meshtastic.DeviceMetrics device_metrics = 6; + */ + deviceMetrics?: DeviceMetrics | undefined; + + /** + * @generated from field: uint32 channel = 7; + */ + channel: number; + + /** + * @generated from field: bool via_mqtt = 8; + */ + viaMqtt: boolean; + + /** + * @generated from field: optional uint32 hops_away = 9; + */ + hopsAway?: number | undefined; + + /** + * @generated from field: bool is_favorite = 10; + */ + isFavorite: boolean; + + /** + * @generated from field: bool is_ignored = 11; + */ + isIgnored: boolean; + + /** + * @generated from field: uint32 next_hop = 12; + */ + nextHop: number; + + /** + * @generated from field: uint32 bitfield = 13; + */ + bitfield: number; +}; + +/** + * Describes the message meshtastic.NodeInfoLite_Legacy. + * Use `create(NodeInfoLite_LegacySchema)` to create a new message. + */ +export const NodeInfoLite_LegacySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly_legacy, 0); + +/** + * + * Legacy NodeDatabase shape: one repeated array of fat NodeInfoLite_Legacy + * with no satellite position/telemetry arrays. + * + * @generated from message meshtastic.NodeDatabase_Legacy + */ +export type NodeDatabase_Legacy = Message<"meshtastic.NodeDatabase_Legacy"> & { + /** + * @generated from field: uint32 version = 1; + */ + version: number; + + /** + * @generated from field: repeated meshtastic.NodeInfoLite_Legacy nodes = 2; + */ + nodes: NodeInfoLite_Legacy[]; +}; + +/** + * Describes the message meshtastic.NodeDatabase_Legacy. + * Use `create(NodeDatabase_LegacySchema)` to create a new message. + */ +export const NodeDatabase_LegacySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly_legacy, 1); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/deviceonly_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/deviceonly_pb.ts new file mode 100644 index 00000000..9707782b --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/deviceonly_pb.ts @@ -0,0 +1,636 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/deviceonly.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Channel } from "./channel_pb"; +import { file_meshtastic_channel } from "./channel_pb"; +import type { Config_DeviceConfig_Role } from "./config_pb"; +import { file_meshtastic_config } from "./config_pb"; +import type { LocalConfig, LocalModuleConfig } from "./localonly_pb"; +import { file_meshtastic_localonly } from "./localonly_pb"; +import type { HardwareModel, MeshPacket, MyNodeInfo, NodeRemoteHardwarePin, Position_LocSource, StatusMessage, User } from "./mesh_pb"; +import { file_meshtastic_mesh } from "./mesh_pb"; +import type { DeviceMetrics, EnvironmentMetrics } from "./telemetry_pb"; +import { file_meshtastic_telemetry } from "./telemetry_pb"; +import { file_nanopb } from "../nanopb_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/deviceonly.proto. + */ +export const file_meshtastic_deviceonly: GenFile = /*@__PURE__*/ + fileDesc("ChttZXNodGFzdGljL2RldmljZW9ubHkucHJvdG8SCm1lc2h0YXN0aWMiqAEKDFBvc2l0aW9uTGl0ZRISCgpsYXRpdHVkZV9pGAEgASgPEhMKC2xvbmdpdHVkZV9pGAIgASgPEhAKCGFsdGl0dWRlGAMgASgFEgwKBHRpbWUYBCABKAcSNwoPbG9jYXRpb25fc291cmNlGAUgASgOMh4ubWVzaHRhc3RpYy5Qb3NpdGlvbi5Mb2NTb3VyY2USFgoOcHJlY2lzaW9uX2JpdHMYBiABKA0iggIKCFVzZXJMaXRlEhMKB21hY2FkZHIYASABKAxCAhgBEhEKCWxvbmdfbmFtZRgCIAEoCRISCgpzaG9ydF9uYW1lGAMgASgJEisKCGh3X21vZGVsGAQgASgOMhkubWVzaHRhc3RpYy5IYXJkd2FyZU1vZGVsEhMKC2lzX2xpY2Vuc2VkGAUgASgIEjIKBHJvbGUYBiABKA4yJC5tZXNodGFzdGljLkNvbmZpZy5EZXZpY2VDb25maWcuUm9sZRISCgpwdWJsaWNfa2V5GAcgASgMEhwKD2lzX3VubWVzc2FnYWJsZRgJIAEoCEgAiAEBQhIKEF9pc191bm1lc3NhZ2FibGUiqgMKDE5vZGVJbmZvTGl0ZRILCgNudW0YASABKA0SCwoDc25yGAQgASgCEhIKCmxhc3RfaGVhcmQYBSABKAcSDwoHY2hhbm5lbBgHIAEoDRIWCglob3BzX2F3YXkYCSABKA1IAIgBARIQCghuZXh0X2hvcBgMIAEoDRIQCghiaXRmaWVsZBgNIAEoDRIRCglsb25nX25hbWUYDiABKAkSEgoKc2hvcnRfbmFtZRgPIAEoCRIrCghod19tb2RlbBgQIAEoDjIZLm1lc2h0YXN0aWMuSGFyZHdhcmVNb2RlbBIyCgRyb2xlGBEgASgOMiQubWVzaHRhc3RpYy5Db25maWcuRGV2aWNlQ29uZmlnLlJvbGUSEgoKcHVibGljX2tleRgSIAEoDBIOCgZzbnJfcTQYEyABKBFCDAoKX2hvcHNfYXdheUoECAIQA0oECAMQBEoECAYQB0oECAgQCUoECAoQC0oECAsQDFIEdXNlclIIcG9zaXRpb25SDmRldmljZV9tZXRyaWNzUgh2aWFfbXF0dFILaXNfZmF2b3JpdGVSCmlzX2lnbm9yZWQi6wIKC0RldmljZVN0YXRlEicKB215X25vZGUYAiABKAsyFi5tZXNodGFzdGljLk15Tm9kZUluZm8SHwoFb3duZXIYAyABKAsyEC5tZXNodGFzdGljLlVzZXISLQoNcmVjZWl2ZV9xdWV1ZRgFIAMoCzIWLm1lc2h0YXN0aWMuTWVzaFBhY2tldBIPCgd2ZXJzaW9uGAggASgNEi8KD3J4X3RleHRfbWVzc2FnZRgHIAEoCzIWLm1lc2h0YXN0aWMuTWVzaFBhY2tldBITCgdub19zYXZlGAkgASgIQgIYARIZCg1kaWRfZ3BzX3Jlc2V0GAsgASgIQgIYARIrCgtyeF93YXlwb2ludBgMIAEoCzIWLm1lc2h0YXN0aWMuTWVzaFBhY2tldBJEChlub2RlX3JlbW90ZV9oYXJkd2FyZV9waW5zGA0gAygLMiEubWVzaHRhc3RpYy5Ob2RlUmVtb3RlSGFyZHdhcmVQaW4iTAoRTm9kZVBvc2l0aW9uRW50cnkSCwoDbnVtGAEgASgNEioKCHBvc2l0aW9uGAIgASgLMhgubWVzaHRhc3RpYy5Qb3NpdGlvbkxpdGUiVAoSTm9kZVRlbGVtZXRyeUVudHJ5EgsKA251bRgBIAEoDRIxCg5kZXZpY2VfbWV0cmljcxgCIAEoCzIZLm1lc2h0YXN0aWMuRGV2aWNlTWV0cmljcyJgChROb2RlRW52aXJvbm1lbnRFbnRyeRILCgNudW0YASABKA0SOwoTZW52aXJvbm1lbnRfbWV0cmljcxgCIAEoCzIeLm1lc2h0YXN0aWMuRW52aXJvbm1lbnRNZXRyaWNzIkkKD05vZGVTdGF0dXNFbnRyeRILCgNudW0YASABKA0SKQoGc3RhdHVzGAIgASgLMhkubWVzaHRhc3RpYy5TdGF0dXNNZXNzYWdlIoMECgxOb2RlRGF0YWJhc2USDwoHdmVyc2lvbhgBIAEoDRJTCgVub2RlcxgCIAMoCzIYLm1lc2h0YXN0aWMuTm9kZUluZm9MaXRlQiqSPyeSASRzdGQ6OnZlY3RvcjxtZXNodGFzdGljX05vZGVJbmZvTGl0ZT4SYQoJcG9zaXRpb25zGAMgAygLMh0ubWVzaHRhc3RpYy5Ob2RlUG9zaXRpb25FbnRyeUIvkj8skgEpc3RkOjp2ZWN0b3I8bWVzaHRhc3RpY19Ob2RlUG9zaXRpb25FbnRyeT4SYwoJdGVsZW1ldHJ5GAQgAygLMh4ubWVzaHRhc3RpYy5Ob2RlVGVsZW1ldHJ5RW50cnlCMJI/LZIBKnN0ZDo6dmVjdG9yPG1lc2h0YXN0aWNfTm9kZVRlbGVtZXRyeUVudHJ5PhJaCgZzdGF0dXMYBSADKAsyGy5tZXNodGFzdGljLk5vZGVTdGF0dXNFbnRyeUItkj8qkgEnc3RkOjp2ZWN0b3I8bWVzaHRhc3RpY19Ob2RlU3RhdHVzRW50cnk+EmkKC2Vudmlyb25tZW50GAYgAygLMiAubWVzaHRhc3RpYy5Ob2RlRW52aXJvbm1lbnRFbnRyeUIykj8vkgEsc3RkOjp2ZWN0b3I8bWVzaHRhc3RpY19Ob2RlRW52aXJvbm1lbnRFbnRyeT4iRQoLQ2hhbm5lbEZpbGUSJQoIY2hhbm5lbHMYASADKAsyEy5tZXNodGFzdGljLkNoYW5uZWwSDwoHdmVyc2lvbhgCIAEoDSLiAQoRQmFja3VwUHJlZmVyZW5jZXMSDwoHdmVyc2lvbhgBIAEoDRIRCgl0aW1lc3RhbXAYAiABKAcSJwoGY29uZmlnGAMgASgLMhcubWVzaHRhc3RpYy5Mb2NhbENvbmZpZxI0Cg1tb2R1bGVfY29uZmlnGAQgASgLMh0ubWVzaHRhc3RpYy5Mb2NhbE1vZHVsZUNvbmZpZxIpCghjaGFubmVscxgFIAEoCzIXLm1lc2h0YXN0aWMuQ2hhbm5lbEZpbGUSHwoFb3duZXIYBiABKAsyEC5tZXNodGFzdGljLlVzZXJCbgoUb3JnLm1lc2h0YXN0aWMucHJvdG9CCkRldmljZU9ubHlaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAJI/C8IBCDx2ZWN0b3I+YgZwcm90bzM", [file_meshtastic_channel, file_meshtastic_config, file_meshtastic_localonly, file_meshtastic_mesh, file_meshtastic_telemetry, file_nanopb]); + +/** + * + * Position with static location information only for NodeDBLite + * + * @generated from message meshtastic.PositionLite + */ +export type PositionLite = Message<"meshtastic.PositionLite"> & { + /** + * + * The new preferred location encoding, multiply by 1e-7 to get degrees + * in floating point + * + * @generated from field: sfixed32 latitude_i = 1; + */ + latitudeI: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: sfixed32 longitude_i = 2; + */ + longitudeI: number; + + /** + * + * In meters above MSL (but see issue #359) + * + * @generated from field: int32 altitude = 3; + */ + altitude: number; + + /** + * + * This is usually not sent over the mesh (to save space), but it is sent + * from the phone so that the local device can set its RTC If it is sent over + * the mesh (because there are devices on the mesh without GPS), it will only + * be sent by devices which has a hardware GPS clock. + * seconds since 1970 + * + * @generated from field: fixed32 time = 4; + */ + time: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.Position.LocSource location_source = 5; + */ + locationSource: Position_LocSource; + + /** + * + * Indicates the bits of precision set by the sending node + * + * @generated from field: uint32 precision_bits = 6; + */ + precisionBits: number; +}; + +/** + * Describes the message meshtastic.PositionLite. + * Use `create(PositionLiteSchema)` to create a new message. + */ +export const PositionLiteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 0); + +/** + * @generated from message meshtastic.UserLite + */ +export type UserLite = Message<"meshtastic.UserLite"> & { + /** + * + * This is the addr of the radio. + * + * @generated from field: bytes macaddr = 1 [deprecated = true]; + * @deprecated + */ + macaddr: Uint8Array; + + /** + * + * A full name for this user, i.e. "Kevin Hester" + * + * @generated from field: string long_name = 2; + */ + longName: string; + + /** + * + * A VERY short name, ideally two characters. + * Suitable for a tiny OLED screen + * + * @generated from field: string short_name = 3; + */ + shortName: string; + + /** + * + * TBEAM, HELTEC, etc... + * Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. + * Apps will still need the string here for older builds + * (so OTA update can find the right image), but if the enum is available it will be used instead. + * + * @generated from field: meshtastic.HardwareModel hw_model = 4; + */ + hwModel: HardwareModel; + + /** + * + * In some regions Ham radio operators have different bandwidth limitations than others. + * If this user is a licensed operator, set this flag. + * Also, "long_name" should be their licence number. + * + * @generated from field: bool is_licensed = 5; + */ + isLicensed: boolean; + + /** + * + * Indicates that the user's role in the mesh + * + * @generated from field: meshtastic.Config.DeviceConfig.Role role = 6; + */ + role: Config_DeviceConfig_Role; + + /** + * + * The public key of the user's device. + * This is sent out to other nodes on the mesh to allow them to compute a shared secret key. + * + * @generated from field: bytes public_key = 7; + */ + publicKey: Uint8Array; + + /** + * + * Whether or not the node can be messaged + * + * @generated from field: optional bool is_unmessagable = 9; + */ + isUnmessagable?: boolean | undefined; +}; + +/** + * Describes the message meshtastic.UserLite. + * Use `create(UserLiteSchema)` to create a new message. + */ +export const UserLiteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 1); + +/** + * @generated from message meshtastic.NodeInfoLite + */ +export type NodeInfoLite = Message<"meshtastic.NodeInfoLite"> & { + /** + * + * The node number + * + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * + * In-memory SNR of the last received message in dB. Not serialised directly: + * always zeroed before encode; persisted as snr_q4 = 19 below. + * + * @generated from field: float snr = 4; + */ + snr: number; + + /** + * + * Set to indicate the last time we received a packet from this node + * + * @generated from field: fixed32 last_heard = 5; + */ + lastHeard: number; + + /** + * + * local channel index we heard that node on. Only populated if its not the default channel. + * + * @generated from field: uint32 channel = 7; + */ + channel: number; + + /** + * + * Number of hops away from us this node is (0 if direct neighbor) + * + * @generated from field: optional uint32 hops_away = 9; + */ + hopsAway?: number | undefined; + + /** + * + * Last byte of the node number of the node that should be used as the next hop to reach this node. + * + * @generated from field: uint32 next_hop = 12; + */ + nextHop: number; + + /** + * + * Bitfield for storing booleans. See NODEINFO_BITFIELD_* in src/mesh/NodeDB.h. + * + * @generated from field: uint32 bitfield = 13; + */ + bitfield: number; + + /** + * + * A full name for this user, i.e. "Kevin Hester". + * + * @generated from field: string long_name = 14; + */ + longName: string; + + /** + * + * A VERY short name, ideally two characters or an emoji. + * Suitable for a tiny OLED screen. + * + * @generated from field: string short_name = 15; + */ + shortName: string; + + /** + * + * Hardware model the user's device is running. + * + * @generated from field: meshtastic.HardwareModel hw_model = 16; + */ + hwModel: HardwareModel; + + /** + * + * The user's role in the mesh. + * + * @generated from field: meshtastic.Config.DeviceConfig.Role role = 17; + */ + role: Config_DeviceConfig_Role; + + /** + * + * The public key of the user's device, for PKI-based encrypted DMs. + * + * @generated from field: bytes public_key = 18; + */ + publicKey: Uint8Array; + + /** + * + * Q4-encoded SNR: dB × 4, sint32 zigzag. Matches RouteDiscovery convention. + * Encode: snr_q4 = (int32_t)(snr * 4.0f). Decode: snr = snr_q4 / 4.0f. + * float snr is always zeroed on disk; this field carries all persisted SNR. + * + * @generated from field: sint32 snr_q4 = 19; + */ + snrQ4: number; +}; + +/** + * Describes the message meshtastic.NodeInfoLite. + * Use `create(NodeInfoLiteSchema)` to create a new message. + */ +export const NodeInfoLiteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 2); + +/** + * + * This message is never sent over the wire, but it is used for serializing DB + * state to flash in the device code + * FIXME, since we write this each time we enter deep sleep (and have infinite + * flash) it would be better to use some sort of append only data structure for + * the receive queue and use the preferences store for the other stuff + * + * @generated from message meshtastic.DeviceState + */ +export type DeviceState = Message<"meshtastic.DeviceState"> & { + /** + * + * Read only settings/info about this node + * + * @generated from field: meshtastic.MyNodeInfo my_node = 2; + */ + myNode?: MyNodeInfo | undefined; + + /** + * + * My owner info + * + * @generated from field: meshtastic.User owner = 3; + */ + owner?: User | undefined; + + /** + * + * Received packets saved for delivery to the phone + * + * @generated from field: repeated meshtastic.MeshPacket receive_queue = 5; + */ + receiveQueue: MeshPacket[]; + + /** + * + * A version integer used to invalidate old save files when we make + * incompatible changes This integer is set at build time and is private to + * NodeDB.cpp in the device code. + * + * @generated from field: uint32 version = 8; + */ + version: number; + + /** + * + * We keep the last received text message (only) stored in the device flash, + * so we can show it on the screen. + * Might be null + * + * @generated from field: meshtastic.MeshPacket rx_text_message = 7; + */ + rxTextMessage?: MeshPacket | undefined; + + /** + * + * Used only during development. + * Indicates developer is testing and changes should never be saved to flash. + * Deprecated in 2.3.1 + * + * @generated from field: bool no_save = 9 [deprecated = true]; + * @deprecated + */ + noSave: boolean; + + /** + * + * Previously used to manage GPS factory resets. + * Deprecated in 2.5.23 + * + * @generated from field: bool did_gps_reset = 11 [deprecated = true]; + * @deprecated + */ + didGpsReset: boolean; + + /** + * + * We keep the last received waypoint stored in the device flash, + * so we can show it on the screen. + * Might be null + * + * @generated from field: meshtastic.MeshPacket rx_waypoint = 12; + */ + rxWaypoint?: MeshPacket | undefined; + + /** + * + * The mesh's nodes with their available gpio pins for RemoteHardware module + * + * @generated from field: repeated meshtastic.NodeRemoteHardwarePin node_remote_hardware_pins = 13; + */ + nodeRemoteHardwarePins: NodeRemoteHardwarePin[]; +}; + +/** + * Describes the message meshtastic.DeviceState. + * Use `create(DeviceStateSchema)` to create a new message. + */ +export const DeviceStateSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 3); + +/** + * @generated from message meshtastic.NodePositionEntry + */ +export type NodePositionEntry = Message<"meshtastic.NodePositionEntry"> & { + /** + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * @generated from field: meshtastic.PositionLite position = 2; + */ + position?: PositionLite | undefined; +}; + +/** + * Describes the message meshtastic.NodePositionEntry. + * Use `create(NodePositionEntrySchema)` to create a new message. + */ +export const NodePositionEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 4); + +/** + * @generated from message meshtastic.NodeTelemetryEntry + */ +export type NodeTelemetryEntry = Message<"meshtastic.NodeTelemetryEntry"> & { + /** + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * @generated from field: meshtastic.DeviceMetrics device_metrics = 2; + */ + deviceMetrics?: DeviceMetrics | undefined; +}; + +/** + * Describes the message meshtastic.NodeTelemetryEntry. + * Use `create(NodeTelemetryEntrySchema)` to create a new message. + */ +export const NodeTelemetryEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 5); + +/** + * @generated from message meshtastic.NodeEnvironmentEntry + */ +export type NodeEnvironmentEntry = Message<"meshtastic.NodeEnvironmentEntry"> & { + /** + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * @generated from field: meshtastic.EnvironmentMetrics environment_metrics = 2; + */ + environmentMetrics?: EnvironmentMetrics | undefined; +}; + +/** + * Describes the message meshtastic.NodeEnvironmentEntry. + * Use `create(NodeEnvironmentEntrySchema)` to create a new message. + */ +export const NodeEnvironmentEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 6); + +/** + * @generated from message meshtastic.NodeStatusEntry + */ +export type NodeStatusEntry = Message<"meshtastic.NodeStatusEntry"> & { + /** + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * @generated from field: meshtastic.StatusMessage status = 2; + */ + status?: StatusMessage | undefined; +}; + +/** + * Describes the message meshtastic.NodeStatusEntry. + * Use `create(NodeStatusEntrySchema)` to create a new message. + */ +export const NodeStatusEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 7); + +/** + * @generated from message meshtastic.NodeDatabase + */ +export type NodeDatabase = Message<"meshtastic.NodeDatabase"> & { + /** + * + * A version integer used to invalidate old save files when we make + * incompatible changes This integer is set at build time and is private to + * NodeDB.cpp in the device code. + * + * @generated from field: uint32 version = 1; + */ + version: number; + + /** + * + * New lite version of NodeDB to decrease memory footprint + * + * @generated from field: repeated meshtastic.NodeInfoLite nodes = 2; + */ + nodes: NodeInfoLite[]; + + /** + * Per-NodeNum satellite arrays. Constrained platforms (e.g. STM32WL) omit + * these via MESHTASTIC_EXCLUDE_*DB build flags. + * + * @generated from field: repeated meshtastic.NodePositionEntry positions = 3; + */ + positions: NodePositionEntry[]; + + /** + * @generated from field: repeated meshtastic.NodeTelemetryEntry telemetry = 4; + */ + telemetry: NodeTelemetryEntry[]; + + /** + * @generated from field: repeated meshtastic.NodeStatusEntry status = 5; + */ + status: NodeStatusEntry[]; + + /** + * @generated from field: repeated meshtastic.NodeEnvironmentEntry environment = 6; + */ + environment: NodeEnvironmentEntry[]; +}; + +/** + * Describes the message meshtastic.NodeDatabase. + * Use `create(NodeDatabaseSchema)` to create a new message. + */ +export const NodeDatabaseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 8); + +/** + * + * The on-disk saved channels + * + * @generated from message meshtastic.ChannelFile + */ +export type ChannelFile = Message<"meshtastic.ChannelFile"> & { + /** + * + * The channels our node knows about + * + * @generated from field: repeated meshtastic.Channel channels = 1; + */ + channels: Channel[]; + + /** + * + * A version integer used to invalidate old save files when we make + * incompatible changes This integer is set at build time and is private to + * NodeDB.cpp in the device code. + * + * @generated from field: uint32 version = 2; + */ + version: number; +}; + +/** + * Describes the message meshtastic.ChannelFile. + * Use `create(ChannelFileSchema)` to create a new message. + */ +export const ChannelFileSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 9); + +/** + * + * The on-disk backup of the node's preferences + * + * @generated from message meshtastic.BackupPreferences + */ +export type BackupPreferences = Message<"meshtastic.BackupPreferences"> & { + /** + * + * The version of the backup + * + * @generated from field: uint32 version = 1; + */ + version: number; + + /** + * + * The timestamp of the backup (if node has time) + * + * @generated from field: fixed32 timestamp = 2; + */ + timestamp: number; + + /** + * + * The node's configuration + * + * @generated from field: meshtastic.LocalConfig config = 3; + */ + config?: LocalConfig | undefined; + + /** + * + * The node's module configuration + * + * @generated from field: meshtastic.LocalModuleConfig module_config = 4; + */ + moduleConfig?: LocalModuleConfig | undefined; + + /** + * + * The node's channels + * + * @generated from field: meshtastic.ChannelFile channels = 5; + */ + channels?: ChannelFile | undefined; + + /** + * + * The node's user (owner) information + * + * @generated from field: meshtastic.User owner = 6; + */ + owner?: User | undefined; +}; + +/** + * Describes the message meshtastic.BackupPreferences. + * Use `create(BackupPreferencesSchema)` to create a new message. + */ +export const BackupPreferencesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_deviceonly, 10); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/interdevice_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/interdevice_pb.ts new file mode 100644 index 00000000..1e17a12d --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/interdevice_pb.ts @@ -0,0 +1,160 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/interdevice.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/interdevice.proto. + */ +export const file_meshtastic_interdevice: GenFile = /*@__PURE__*/ + fileDesc("ChxtZXNodGFzdGljL2ludGVyZGV2aWNlLnByb3RvEgptZXNodGFzdGljImoKClNlbnNvckRhdGESJQoEdHlwZRgBIAEoDjIXLm1lc2h0YXN0aWMuTWVzc2FnZVR5cGUSFQoLZmxvYXRfdmFsdWUYAiABKAJIABIWCgx1aW50MzJfdmFsdWUYAyABKA1IAEIGCgRkYXRhIlYKEkludGVyZGV2aWNlTWVzc2FnZRIOCgRubWVhGAEgASgJSAASKAoGc2Vuc29yGAIgASgLMhYubWVzaHRhc3RpYy5TZW5zb3JEYXRhSABCBgoEZGF0YSrVAQoLTWVzc2FnZVR5cGUSBwoDQUNLEAASFQoQQ09MTEVDVF9JTlRFUlZBTBCgARIMCgdCRUVQX09OEKEBEg0KCEJFRVBfT0ZGEKIBEg0KCFNIVVRET1dOEKMBEg0KCFBPV0VSX09OEKQBEg8KClNDRDQxX1RFTVAQsAESEwoOU0NENDFfSFVNSURJVFkQsQESDgoJU0NENDFfQ08yELIBEg8KCkFIVDIwX1RFTVAQswESEwoOQUhUMjBfSFVNSURJVFkQtAESDwoKVFZPQ19JTkRFWBC1AUJnChRvcmcubWVzaHRhc3RpYy5wcm90b0IRSW50ZXJkZXZpY2VQcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * @generated from message meshtastic.SensorData + */ +export type SensorData = Message<"meshtastic.SensorData"> & { + /** + * The message type + * + * @generated from field: meshtastic.MessageType type = 1; + */ + type: MessageType; + + /** + * The sensor data, either as a float or an uint32 + * + * @generated from oneof meshtastic.SensorData.data + */ + data: { + /** + * @generated from field: float float_value = 2; + */ + value: number; + case: "floatValue"; + } | { + /** + * @generated from field: uint32 uint32_value = 3; + */ + value: number; + case: "uint32Value"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.SensorData. + * Use `create(SensorDataSchema)` to create a new message. + */ +export const SensorDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_interdevice, 0); + +/** + * @generated from message meshtastic.InterdeviceMessage + */ +export type InterdeviceMessage = Message<"meshtastic.InterdeviceMessage"> & { + /** + * The message data + * + * @generated from oneof meshtastic.InterdeviceMessage.data + */ + data: { + /** + * @generated from field: string nmea = 1; + */ + value: string; + case: "nmea"; + } | { + /** + * @generated from field: meshtastic.SensorData sensor = 2; + */ + value: SensorData; + case: "sensor"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.InterdeviceMessage. + * Use `create(InterdeviceMessageSchema)` to create a new message. + */ +export const InterdeviceMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_interdevice, 1); + +/** + * @generated from enum meshtastic.MessageType + */ +export enum MessageType { + /** + * @generated from enum value: ACK = 0; + */ + ACK = 0, + + /** + * in ms + * + * @generated from enum value: COLLECT_INTERVAL = 160; + */ + COLLECT_INTERVAL = 160, + + /** + * duration ms + * + * @generated from enum value: BEEP_ON = 161; + */ + BEEP_ON = 161, + + /** + * cancel prematurely + * + * @generated from enum value: BEEP_OFF = 162; + */ + BEEP_OFF = 162, + + /** + * @generated from enum value: SHUTDOWN = 163; + */ + SHUTDOWN = 163, + + /** + * @generated from enum value: POWER_ON = 164; + */ + POWER_ON = 164, + + /** + * @generated from enum value: SCD41_TEMP = 176; + */ + SCD41_TEMP = 176, + + /** + * @generated from enum value: SCD41_HUMIDITY = 177; + */ + SCD41_HUMIDITY = 177, + + /** + * @generated from enum value: SCD41_CO2 = 178; + */ + SCD41_CO2 = 178, + + /** + * @generated from enum value: AHT20_TEMP = 179; + */ + AHT20_TEMP = 179, + + /** + * @generated from enum value: AHT20_HUMIDITY = 180; + */ + AHT20_HUMIDITY = 180, + + /** + * @generated from enum value: TVOC_INDEX = 181; + */ + TVOC_INDEX = 181, +} + +/** + * Describes the enum meshtastic.MessageType. + */ +export const MessageTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_interdevice, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/localonly_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/localonly_pb.ts new file mode 100644 index 00000000..fceda704 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/localonly_pb.ts @@ -0,0 +1,254 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/localonly.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Config_BluetoothConfig, Config_DeviceConfig, Config_DisplayConfig, Config_LoRaConfig, Config_NetworkConfig, Config_PositionConfig, Config_PowerConfig, Config_SecurityConfig } from "./config_pb"; +import { file_meshtastic_config } from "./config_pb"; +import type { ModuleConfig_AmbientLightingConfig, ModuleConfig_AudioConfig, ModuleConfig_CannedMessageConfig, ModuleConfig_DetectionSensorConfig, ModuleConfig_ExternalNotificationConfig, ModuleConfig_MQTTConfig, ModuleConfig_NeighborInfoConfig, ModuleConfig_PaxcounterConfig, ModuleConfig_RangeTestConfig, ModuleConfig_RemoteHardwareConfig, ModuleConfig_SerialConfig, ModuleConfig_StatusMessageConfig, ModuleConfig_StoreForwardConfig, ModuleConfig_TAKConfig, ModuleConfig_TelemetryConfig, ModuleConfig_TrafficManagementConfig } from "./module_config_pb"; +import { file_meshtastic_module_config } from "./module_config_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/localonly.proto. + */ +export const file_meshtastic_localonly: GenFile = /*@__PURE__*/ + fileDesc("ChptZXNodGFzdGljL2xvY2Fsb25seS5wcm90bxIKbWVzaHRhc3RpYyKyAwoLTG9jYWxDb25maWcSLwoGZGV2aWNlGAEgASgLMh8ubWVzaHRhc3RpYy5Db25maWcuRGV2aWNlQ29uZmlnEjMKCHBvc2l0aW9uGAIgASgLMiEubWVzaHRhc3RpYy5Db25maWcuUG9zaXRpb25Db25maWcSLQoFcG93ZXIYAyABKAsyHi5tZXNodGFzdGljLkNvbmZpZy5Qb3dlckNvbmZpZxIxCgduZXR3b3JrGAQgASgLMiAubWVzaHRhc3RpYy5Db25maWcuTmV0d29ya0NvbmZpZxIxCgdkaXNwbGF5GAUgASgLMiAubWVzaHRhc3RpYy5Db25maWcuRGlzcGxheUNvbmZpZxIrCgRsb3JhGAYgASgLMh0ubWVzaHRhc3RpYy5Db25maWcuTG9SYUNvbmZpZxI1CglibHVldG9vdGgYByABKAsyIi5tZXNodGFzdGljLkNvbmZpZy5CbHVldG9vdGhDb25maWcSDwoHdmVyc2lvbhgIIAEoDRIzCghzZWN1cml0eRgJIAEoCzIhLm1lc2h0YXN0aWMuQ29uZmlnLlNlY3VyaXR5Q29uZmlnIr8IChFMb2NhbE1vZHVsZUNvbmZpZxIxCgRtcXR0GAEgASgLMiMubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuTVFUVENvbmZpZxI1CgZzZXJpYWwYAiABKAsyJS5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5TZXJpYWxDb25maWcSUgoVZXh0ZXJuYWxfbm90aWZpY2F0aW9uGAMgASgLMjMubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuRXh0ZXJuYWxOb3RpZmljYXRpb25Db25maWcSQgoNc3RvcmVfZm9yd2FyZBgEIAEoCzIrLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLlN0b3JlRm9yd2FyZENvbmZpZxI8CgpyYW5nZV90ZXN0GAUgASgLMigubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuUmFuZ2VUZXN0Q29uZmlnEjsKCXRlbGVtZXRyeRgGIAEoCzIoLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLlRlbGVtZXRyeUNvbmZpZxJECg5jYW5uZWRfbWVzc2FnZRgHIAEoCzIsLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkNhbm5lZE1lc3NhZ2VDb25maWcSMwoFYXVkaW8YCSABKAsyJC5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5BdWRpb0NvbmZpZxJGCg9yZW1vdGVfaGFyZHdhcmUYCiABKAsyLS5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5SZW1vdGVIYXJkd2FyZUNvbmZpZxJCCg1uZWlnaGJvcl9pbmZvGAsgASgLMisubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuTmVpZ2hib3JJbmZvQ29uZmlnEkgKEGFtYmllbnRfbGlnaHRpbmcYDCABKAsyLi5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5BbWJpZW50TGlnaHRpbmdDb25maWcSSAoQZGV0ZWN0aW9uX3NlbnNvchgNIAEoCzIuLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkRldGVjdGlvblNlbnNvckNvbmZpZxI9CgpwYXhjb3VudGVyGA4gASgLMikubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuUGF4Y291bnRlckNvbmZpZxJDCg1zdGF0dXNtZXNzYWdlGA8gASgLMiwubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuU3RhdHVzTWVzc2FnZUNvbmZpZxJMChJ0cmFmZmljX21hbmFnZW1lbnQYECABKAsyMC5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5UcmFmZmljTWFuYWdlbWVudENvbmZpZxIvCgN0YWsYESABKAsyIi5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5UQUtDb25maWcSDwoHdmVyc2lvbhgIIAEoDUJlChRvcmcubWVzaHRhc3RpYy5wcm90b0IPTG9jYWxPbmx5UHJvdG9zWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw", [file_meshtastic_config, file_meshtastic_module_config]); + +/** + * @generated from message meshtastic.LocalConfig + */ +export type LocalConfig = Message<"meshtastic.LocalConfig"> & { + /** + * + * The part of the config that is specific to the Device + * + * @generated from field: meshtastic.Config.DeviceConfig device = 1; + */ + device?: Config_DeviceConfig | undefined; + + /** + * + * The part of the config that is specific to the GPS Position + * + * @generated from field: meshtastic.Config.PositionConfig position = 2; + */ + position?: Config_PositionConfig | undefined; + + /** + * + * The part of the config that is specific to the Power settings + * + * @generated from field: meshtastic.Config.PowerConfig power = 3; + */ + power?: Config_PowerConfig | undefined; + + /** + * + * The part of the config that is specific to the Wifi Settings + * + * @generated from field: meshtastic.Config.NetworkConfig network = 4; + */ + network?: Config_NetworkConfig | undefined; + + /** + * + * The part of the config that is specific to the Display + * + * @generated from field: meshtastic.Config.DisplayConfig display = 5; + */ + display?: Config_DisplayConfig | undefined; + + /** + * + * The part of the config that is specific to the Lora Radio + * + * @generated from field: meshtastic.Config.LoRaConfig lora = 6; + */ + lora?: Config_LoRaConfig | undefined; + + /** + * + * The part of the config that is specific to the Bluetooth settings + * + * @generated from field: meshtastic.Config.BluetoothConfig bluetooth = 7; + */ + bluetooth?: Config_BluetoothConfig | undefined; + + /** + * + * A version integer used to invalidate old save files when we make + * incompatible changes This integer is set at build time and is private to + * NodeDB.cpp in the device code. + * + * @generated from field: uint32 version = 8; + */ + version: number; + + /** + * + * The part of the config that is specific to Security settings + * + * @generated from field: meshtastic.Config.SecurityConfig security = 9; + */ + security?: Config_SecurityConfig | undefined; +}; + +/** + * Describes the message meshtastic.LocalConfig. + * Use `create(LocalConfigSchema)` to create a new message. + */ +export const LocalConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_localonly, 0); + +/** + * @generated from message meshtastic.LocalModuleConfig + */ +export type LocalModuleConfig = Message<"meshtastic.LocalModuleConfig"> & { + /** + * + * The part of the config that is specific to the MQTT module + * + * @generated from field: meshtastic.ModuleConfig.MQTTConfig mqtt = 1; + */ + mqtt?: ModuleConfig_MQTTConfig | undefined; + + /** + * + * The part of the config that is specific to the Serial module + * + * @generated from field: meshtastic.ModuleConfig.SerialConfig serial = 2; + */ + serial?: ModuleConfig_SerialConfig | undefined; + + /** + * + * The part of the config that is specific to the ExternalNotification module + * + * @generated from field: meshtastic.ModuleConfig.ExternalNotificationConfig external_notification = 3; + */ + externalNotification?: ModuleConfig_ExternalNotificationConfig | undefined; + + /** + * + * The part of the config that is specific to the Store & Forward module + * + * @generated from field: meshtastic.ModuleConfig.StoreForwardConfig store_forward = 4; + */ + storeForward?: ModuleConfig_StoreForwardConfig | undefined; + + /** + * + * The part of the config that is specific to the RangeTest module + * + * @generated from field: meshtastic.ModuleConfig.RangeTestConfig range_test = 5; + */ + rangeTest?: ModuleConfig_RangeTestConfig | undefined; + + /** + * + * The part of the config that is specific to the Telemetry module + * + * @generated from field: meshtastic.ModuleConfig.TelemetryConfig telemetry = 6; + */ + telemetry?: ModuleConfig_TelemetryConfig | undefined; + + /** + * + * The part of the config that is specific to the Canned Message module + * + * @generated from field: meshtastic.ModuleConfig.CannedMessageConfig canned_message = 7; + */ + cannedMessage?: ModuleConfig_CannedMessageConfig | undefined; + + /** + * + * The part of the config that is specific to the Audio module + * + * @generated from field: meshtastic.ModuleConfig.AudioConfig audio = 9; + */ + audio?: ModuleConfig_AudioConfig | undefined; + + /** + * + * The part of the config that is specific to the Remote Hardware module + * + * @generated from field: meshtastic.ModuleConfig.RemoteHardwareConfig remote_hardware = 10; + */ + remoteHardware?: ModuleConfig_RemoteHardwareConfig | undefined; + + /** + * + * The part of the config that is specific to the Neighbor Info module + * + * @generated from field: meshtastic.ModuleConfig.NeighborInfoConfig neighbor_info = 11; + */ + neighborInfo?: ModuleConfig_NeighborInfoConfig | undefined; + + /** + * + * The part of the config that is specific to the Ambient Lighting module + * + * @generated from field: meshtastic.ModuleConfig.AmbientLightingConfig ambient_lighting = 12; + */ + ambientLighting?: ModuleConfig_AmbientLightingConfig | undefined; + + /** + * + * The part of the config that is specific to the Detection Sensor module + * + * @generated from field: meshtastic.ModuleConfig.DetectionSensorConfig detection_sensor = 13; + */ + detectionSensor?: ModuleConfig_DetectionSensorConfig | undefined; + + /** + * + * Paxcounter Config + * + * @generated from field: meshtastic.ModuleConfig.PaxcounterConfig paxcounter = 14; + */ + paxcounter?: ModuleConfig_PaxcounterConfig | undefined; + + /** + * + * StatusMessage Config + * + * @generated from field: meshtastic.ModuleConfig.StatusMessageConfig statusmessage = 15; + */ + statusmessage?: ModuleConfig_StatusMessageConfig | undefined; + + /** + * + * The part of the config that is specific to the Traffic Management module + * + * @generated from field: meshtastic.ModuleConfig.TrafficManagementConfig traffic_management = 16; + */ + trafficManagement?: ModuleConfig_TrafficManagementConfig | undefined; + + /** + * + * TAK Config + * + * @generated from field: meshtastic.ModuleConfig.TAKConfig tak = 17; + */ + tak?: ModuleConfig_TAKConfig | undefined; + + /** + * + * A version integer used to invalidate old save files when we make + * incompatible changes This integer is set at build time and is private to + * NodeDB.cpp in the device code. + * + * @generated from field: uint32 version = 8; + */ + version: number; +}; + +/** + * Describes the message meshtastic.LocalModuleConfig. + * Use `create(LocalModuleConfigSchema)` to create a new message. + */ +export const LocalModuleConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_localonly, 1); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/mesh_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/mesh_pb.ts new file mode 100644 index 00000000..96681d01 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/mesh_pb.ts @@ -0,0 +1,4852 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/mesh.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Channel } from "./channel_pb"; +import { file_meshtastic_channel } from "./channel_pb"; +import type { Config, Config_DeviceConfig_Role } from "./config_pb"; +import { file_meshtastic_config } from "./config_pb"; +import type { DeviceUIConfig } from "./device_ui_pb"; +import { file_meshtastic_device_ui } from "./device_ui_pb"; +import type { ModuleConfig, RemoteHardwarePin } from "./module_config_pb"; +import { file_meshtastic_module_config } from "./module_config_pb"; +import type { PortNum } from "./portnums_pb"; +import { file_meshtastic_portnums } from "./portnums_pb"; +import type { DeviceMetrics } from "./telemetry_pb"; +import { file_meshtastic_telemetry } from "./telemetry_pb"; +import type { XModem } from "./xmodem_pb"; +import { file_meshtastic_xmodem } from "./xmodem_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/mesh.proto. + */ +export const file_meshtastic_mesh: GenFile = /*@__PURE__*/ + fileDesc("ChVtZXNodGFzdGljL21lc2gucHJvdG8SCm1lc2h0YXN0aWMihwcKCFBvc2l0aW9uEhcKCmxhdGl0dWRlX2kYASABKA9IAIgBARIYCgtsb25naXR1ZGVfaRgCIAEoD0gBiAEBEhUKCGFsdGl0dWRlGAMgASgFSAKIAQESDAoEdGltZRgEIAEoBxI3Cg9sb2NhdGlvbl9zb3VyY2UYBSABKA4yHi5tZXNodGFzdGljLlBvc2l0aW9uLkxvY1NvdXJjZRI3Cg9hbHRpdHVkZV9zb3VyY2UYBiABKA4yHi5tZXNodGFzdGljLlBvc2l0aW9uLkFsdFNvdXJjZRIRCgl0aW1lc3RhbXAYByABKAcSHwoXdGltZXN0YW1wX21pbGxpc19hZGp1c3QYCCABKAUSGQoMYWx0aXR1ZGVfaGFlGAkgASgRSAOIAQESKAobYWx0aXR1ZGVfZ2VvaWRhbF9zZXBhcmF0aW9uGAogASgRSASIAQESDAoEUERPUBgLIAEoDRIMCgRIRE9QGAwgASgNEgwKBFZET1AYDSABKA0SFAoMZ3BzX2FjY3VyYWN5GA4gASgNEhkKDGdyb3VuZF9zcGVlZBgPIAEoDUgFiAEBEhkKDGdyb3VuZF90cmFjaxgQIAEoDUgGiAEBEhMKC2ZpeF9xdWFsaXR5GBEgASgNEhAKCGZpeF90eXBlGBIgASgNEhQKDHNhdHNfaW5fdmlldxgTIAEoDRIRCglzZW5zb3JfaWQYFCABKA0SEwoLbmV4dF91cGRhdGUYFSABKA0SEgoKc2VxX251bWJlchgWIAEoDRIWCg5wcmVjaXNpb25fYml0cxgXIAEoDSJOCglMb2NTb3VyY2USDQoJTE9DX1VOU0VUEAASDgoKTE9DX01BTlVBTBABEhAKDExPQ19JTlRFUk5BTBACEhAKDExPQ19FWFRFUk5BTBADImIKCUFsdFNvdXJjZRINCglBTFRfVU5TRVQQABIOCgpBTFRfTUFOVUFMEAESEAoMQUxUX0lOVEVSTkFMEAISEAoMQUxUX0VYVEVSTkFMEAMSEgoOQUxUX0JBUk9NRVRSSUMQBEINCgtfbGF0aXR1ZGVfaUIOCgxfbG9uZ2l0dWRlX2lCCwoJX2FsdGl0dWRlQg8KDV9hbHRpdHVkZV9oYWVCHgocX2FsdGl0dWRlX2dlb2lkYWxfc2VwYXJhdGlvbkIPCg1fZ3JvdW5kX3NwZWVkQg8KDV9ncm91bmRfdHJhY2siigIKBFVzZXISCgoCaWQYASABKAkSEQoJbG9uZ19uYW1lGAIgASgJEhIKCnNob3J0X25hbWUYAyABKAkSEwoHbWFjYWRkchgEIAEoDEICGAESKwoIaHdfbW9kZWwYBSABKA4yGS5tZXNodGFzdGljLkhhcmR3YXJlTW9kZWwSEwoLaXNfbGljZW5zZWQYBiABKAgSMgoEcm9sZRgHIAEoDjIkLm1lc2h0YXN0aWMuQ29uZmlnLkRldmljZUNvbmZpZy5Sb2xlEhIKCnB1YmxpY19rZXkYCCABKAwSHAoPaXNfdW5tZXNzYWdhYmxlGAkgASgISACIAQFCEgoQX2lzX3VubWVzc2FnYWJsZSJaCg5Sb3V0ZURpc2NvdmVyeRINCgVyb3V0ZRgBIAMoBxITCgtzbnJfdG93YXJkcxgCIAMoBRISCgpyb3V0ZV9iYWNrGAMgAygHEhAKCHNucl9iYWNrGAQgAygFIpkECgdSb3V0aW5nEjMKDXJvdXRlX3JlcXVlc3QYASABKAsyGi5tZXNodGFzdGljLlJvdXRlRGlzY292ZXJ5SAASMQoLcm91dGVfcmVwbHkYAiABKAsyGi5tZXNodGFzdGljLlJvdXRlRGlzY292ZXJ5SAASMQoMZXJyb3JfcmVhc29uGAMgASgOMhkubWVzaHRhc3RpYy5Sb3V0aW5nLkVycm9ySAAi5wIKBUVycm9yEggKBE5PTkUQABIMCghOT19ST1VURRABEgsKB0dPVF9OQUsQAhILCgdUSU1FT1VUEAMSEAoMTk9fSU5URVJGQUNFEAQSEgoOTUFYX1JFVFJBTlNNSVQQBRIOCgpOT19DSEFOTkVMEAYSDQoJVE9PX0xBUkdFEAcSDwoLTk9fUkVTUE9OU0UQCBIUChBEVVRZX0NZQ0xFX0xJTUlUEAkSDwoLQkFEX1JFUVVFU1QQIBISCg5OT1RfQVVUSE9SSVpFRBAhEg4KClBLSV9GQUlMRUQQIhIWChJQS0lfVU5LTk9XTl9QVUJLRVkQIxIZChVBRE1JTl9CQURfU0VTU0lPTl9LRVkQJBIhCh1BRE1JTl9QVUJMSUNfS0VZX1VOQVVUSE9SSVpFRBAlEhcKE1JBVEVfTElNSVRfRVhDRUVERUQQJhIcChhQS0lfU0VORF9GQUlMX1BVQkxJQ19LRVkQJ0IJCgd2YXJpYW50IuUBCgREYXRhEiQKB3BvcnRudW0YASABKA4yEy5tZXNodGFzdGljLlBvcnROdW0SDwoHcGF5bG9hZBgCIAEoDBIVCg13YW50X3Jlc3BvbnNlGAMgASgIEgwKBGRlc3QYBCABKAcSDgoGc291cmNlGAUgASgHEhIKCnJlcXVlc3RfaWQYBiABKAcSEAoIcmVwbHlfaWQYByABKAcSDQoFZW1vamkYCCABKAcSFQoIYml0ZmllbGQYCSABKA1IAIgBARIYChB4ZWRkc2Ffc2lnbmF0dXJlGAogASgMQgsKCV9iaXRmaWVsZCI+Cg9LZXlWZXJpZmljYXRpb24SDQoFbm9uY2UYASABKAQSDQoFaGFzaDEYAiABKAwSDQoFaGFzaDIYAyABKAwiywMKFFN0b3JlRm9yd2FyZFBsdXNQbHVzEk0KEXNmcHBfbWVzc2FnZV90eXBlGAEgASgOMjIubWVzaHRhc3RpYy5TdG9yZUZvcndhcmRQbHVzUGx1cy5TRlBQX21lc3NhZ2VfdHlwZRIUCgxtZXNzYWdlX2hhc2gYAiABKAwSEwoLY29tbWl0X2hhc2gYAyABKAwSEQoJcm9vdF9oYXNoGAQgASgMEg8KB21lc3NhZ2UYBSABKAwSFwoPZW5jYXBzdWxhdGVkX2lkGAYgASgNEhcKD2VuY2Fwc3VsYXRlZF90bxgHIAEoDRIZChFlbmNhcHN1bGF0ZWRfZnJvbRgIIAEoDRIbChNlbmNhcHN1bGF0ZWRfcnh0aW1lGAkgASgNEhMKC2NoYWluX2NvdW50GAogASgNIpUBChFTRlBQX21lc3NhZ2VfdHlwZRISCg5DQU5PTl9BTk5PVU5DRRAAEg8KC0NIQUlOX1FVRVJZEAESEAoMTElOS19SRVFVRVNUEAMSEAoMTElOS19QUk9WSURFEAQSGgoWTElOS19QUk9WSURFX0ZJUlNUSEFMRhAFEhsKF0xJTktfUFJPVklERV9TRUNPTkRIQUxGEAYi4wIKC1JlbW90ZVNoZWxsEioKAm9wGAEgASgOMh4ubWVzaHRhc3RpYy5SZW1vdGVTaGVsbC5PcENvZGUSEgoKc2Vzc2lvbl9pZBgCIAEoDRILCgNzZXEYAyABKA0SDwoHYWNrX3NlcRgEIAEoDRIPCgdwYXlsb2FkGAUgASgMEgwKBGNvbHMYBiABKA0SDAoEcm93cxgHIAEoDRINCgVmbGFncxgIIAEoDRITCgtsYXN0X3R4X3NlcRgJIAEoDRITCgtsYXN0X3J4X3NlcRgKIAEoDSKPAQoGT3BDb2RlEgwKCE9QX1VOU0VUEAASCAoET1BFThABEgkKBUlOUFVUEAISCgoGUkVTSVpFEAMSCQoFQ0xPU0UQBBIICgRQSU5HEAUSBwoDQUNLEAYSCwoHT1BFTl9PSxBAEgoKBk9VVFBVVBBBEgoKBkNMT1NFRBBCEgkKBUVSUk9SEEMSCAoEUE9ORxBEIrwBCghXYXlwb2ludBIKCgJpZBgBIAEoDRIXCgpsYXRpdHVkZV9pGAIgASgPSACIAQESGAoLbG9uZ2l0dWRlX2kYAyABKA9IAYgBARIOCgZleHBpcmUYBCABKA0SEQoJbG9ja2VkX3RvGAUgASgNEgwKBG5hbWUYBiABKAkSEwoLZGVzY3JpcHRpb24YByABKAkSDAoEaWNvbhgIIAEoB0INCgtfbGF0aXR1ZGVfaUIOCgxfbG9uZ2l0dWRlX2kiHwoNU3RhdHVzTWVzc2FnZRIOCgZzdGF0dXMYASABKAkibAoWTXF0dENsaWVudFByb3h5TWVzc2FnZRINCgV0b3BpYxgBIAEoCRIOCgRkYXRhGAIgASgMSAASDgoEdGV4dBgDIAEoCUgAEhAKCHJldGFpbmVkGAQgASgIQhEKD3BheWxvYWRfdmFyaWFudCLnBwoKTWVzaFBhY2tldBIMCgRmcm9tGAEgASgHEgoKAnRvGAIgASgHEg8KB2NoYW5uZWwYAyABKA0SIwoHZGVjb2RlZBgEIAEoCzIQLm1lc2h0YXN0aWMuRGF0YUgAEhMKCWVuY3J5cHRlZBgFIAEoDEgAEgoKAmlkGAYgASgHEg8KB3J4X3RpbWUYByABKAcSDgoGcnhfc25yGAggASgCEhEKCWhvcF9saW1pdBgJIAEoDRIQCgh3YW50X2FjaxgKIAEoCBIxCghwcmlvcml0eRgLIAEoDjIfLm1lc2h0YXN0aWMuTWVzaFBhY2tldC5Qcmlvcml0eRIPCgdyeF9yc3NpGAwgASgFEjMKB2RlbGF5ZWQYDSABKA4yHi5tZXNodGFzdGljLk1lc2hQYWNrZXQuRGVsYXllZEICGAESEAoIdmlhX21xdHQYDiABKAgSEQoJaG9wX3N0YXJ0GA8gASgNEhIKCnB1YmxpY19rZXkYECABKAwSFQoNcGtpX2VuY3J5cHRlZBgRIAEoCBIQCghuZXh0X2hvcBgSIAEoDRISCgpyZWxheV9ub2RlGBMgASgNEhAKCHR4X2FmdGVyGBQgASgNEkYKE3RyYW5zcG9ydF9tZWNoYW5pc20YFSABKA4yKS5tZXNodGFzdGljLk1lc2hQYWNrZXQuVHJhbnNwb3J0TWVjaGFuaXNtEhUKDXhlZGRzYV9zaWduZWQYFiABKAgifgoIUHJpb3JpdHkSCQoFVU5TRVQQABIHCgNNSU4QARIOCgpCQUNLR1JPVU5EEAoSCwoHREVGQVVMVBBAEgwKCFJFTElBQkxFEEYSDAoIUkVTUE9OU0UQUBIICgRISUdIEGQSCQoFQUxFUlQQbhIHCgNBQ0sQeBIHCgNNQVgQfyJCCgdEZWxheWVkEgwKCE5PX0RFTEFZEAASFQoRREVMQVlFRF9CUk9BRENBU1QQARISCg5ERUxBWUVEX0RJUkVDVBACIuoBChJUcmFuc3BvcnRNZWNoYW5pc20SFgoSVFJBTlNQT1JUX0lOVEVSTkFMEAASEgoOVFJBTlNQT1JUX0xPUkEQARIXChNUUkFOU1BPUlRfTE9SQV9BTFQxEAISFwoTVFJBTlNQT1JUX0xPUkFfQUxUMhADEhcKE1RSQU5TUE9SVF9MT1JBX0FMVDMQBBISCg5UUkFOU1BPUlRfTVFUVBAFEhsKF1RSQU5TUE9SVF9NVUxUSUNBU1RfVURQEAYSEQoNVFJBTlNQT1JUX0FQSRAHEhkKFVRSQU5TUE9SVF9VTklDQVNUX1VEUBAIQhEKD3BheWxvYWRfdmFyaWFudCL0AgoITm9kZUluZm8SCwoDbnVtGAEgASgNEh4KBHVzZXIYAiABKAsyEC5tZXNodGFzdGljLlVzZXISJgoIcG9zaXRpb24YAyABKAsyFC5tZXNodGFzdGljLlBvc2l0aW9uEgsKA3NuchgEIAEoAhISCgpsYXN0X2hlYXJkGAUgASgHEjEKDmRldmljZV9tZXRyaWNzGAYgASgLMhkubWVzaHRhc3RpYy5EZXZpY2VNZXRyaWNzEg8KB2NoYW5uZWwYByABKA0SEAoIdmlhX21xdHQYCCABKAgSFgoJaG9wc19hd2F5GAkgASgNSACIAQESEwoLaXNfZmF2b3JpdGUYCiABKAgSEgoKaXNfaWdub3JlZBgLIAEoCBIgChhpc19rZXlfbWFudWFsbHlfdmVyaWZpZWQYDCABKAgSEAoIaXNfbXV0ZWQYDSABKAgSGQoRaGFzX3hlZGRzYV9zaWduZWQYDiABKAhCDAoKX2hvcHNfYXdheSLBAQoKTXlOb2RlSW5mbxITCgtteV9ub2RlX251bRgBIAEoDRIUCgxyZWJvb3RfY291bnQYCCABKA0SFwoPbWluX2FwcF92ZXJzaW9uGAsgASgNEhEKCWRldmljZV9pZBgMIAEoDBIPCgdwaW9fZW52GA0gASgJEjUKEGZpcm13YXJlX2VkaXRpb24YDiABKA4yGy5tZXNodGFzdGljLkZpcm13YXJlRWRpdGlvbhIUCgxub2RlZGJfY291bnQYDyABKA0iwAEKCUxvZ1JlY29yZBIPCgdtZXNzYWdlGAEgASgJEgwKBHRpbWUYAiABKAcSDgoGc291cmNlGAMgASgJEioKBWxldmVsGAQgASgOMhsubWVzaHRhc3RpYy5Mb2dSZWNvcmQuTGV2ZWwiWAoFTGV2ZWwSCQoFVU5TRVQQABIMCghDUklUSUNBTBAyEgkKBUVSUk9SECgSCwoHV0FSTklORxAeEggKBElORk8QFBIJCgVERUJVRxAKEgkKBVRSQUNFEAUiUAoLUXVldWVTdGF0dXMSCwoDcmVzGAEgASgFEgwKBGZyZWUYAiABKA0SDgoGbWF4bGVuGAMgASgNEhYKDm1lc2hfcGFja2V0X2lkGAQgASgNIrAGCglGcm9tUmFkaW8SCgoCaWQYASABKA0SKAoGcGFja2V0GAIgASgLMhYubWVzaHRhc3RpYy5NZXNoUGFja2V0SAASKQoHbXlfaW5mbxgDIAEoCzIWLm1lc2h0YXN0aWMuTXlOb2RlSW5mb0gAEikKCW5vZGVfaW5mbxgEIAEoCzIULm1lc2h0YXN0aWMuTm9kZUluZm9IABIkCgZjb25maWcYBSABKAsyEi5tZXNodGFzdGljLkNvbmZpZ0gAEisKCmxvZ19yZWNvcmQYBiABKAsyFS5tZXNodGFzdGljLkxvZ1JlY29yZEgAEhwKEmNvbmZpZ19jb21wbGV0ZV9pZBgHIAEoDUgAEhIKCHJlYm9vdGVkGAggASgISAASMAoMbW9kdWxlQ29uZmlnGAkgASgLMhgubWVzaHRhc3RpYy5Nb2R1bGVDb25maWdIABImCgdjaGFubmVsGAogASgLMhMubWVzaHRhc3RpYy5DaGFubmVsSAASLgoLcXVldWVTdGF0dXMYCyABKAsyFy5tZXNodGFzdGljLlF1ZXVlU3RhdHVzSAASKgoMeG1vZGVtUGFja2V0GAwgASgLMhIubWVzaHRhc3RpYy5YTW9kZW1IABIuCghtZXRhZGF0YRgNIAEoCzIaLm1lc2h0YXN0aWMuRGV2aWNlTWV0YWRhdGFIABJEChZtcXR0Q2xpZW50UHJveHlNZXNzYWdlGA4gASgLMiIubWVzaHRhc3RpYy5NcXR0Q2xpZW50UHJveHlNZXNzYWdlSAASKAoIZmlsZUluZm8YDyABKAsyFC5tZXNodGFzdGljLkZpbGVJbmZvSAASPAoSY2xpZW50Tm90aWZpY2F0aW9uGBAgASgLMh4ubWVzaHRhc3RpYy5DbGllbnROb3RpZmljYXRpb25IABI0Cg5kZXZpY2V1aUNvbmZpZxgRIAEoCzIaLm1lc2h0YXN0aWMuRGV2aWNlVUlDb25maWdIABI1Cg9sb2NrZG93bl9zdGF0dXMYEiABKAsyGi5tZXNodGFzdGljLkxvY2tkb3duU3RhdHVzSABCEQoPcGF5bG9hZF92YXJpYW50IpMCCg5Mb2NrZG93blN0YXR1cxIvCgVzdGF0ZRgBIAEoDjIgLm1lc2h0YXN0aWMuTG9ja2Rvd25TdGF0dXMuU3RhdGUSEwoLbG9ja19yZWFzb24YAiABKAkSFwoPYm9vdHNfcmVtYWluaW5nGAMgASgNEhkKEXZhbGlkX3VudGlsX2Vwb2NoGAQgASgNEhcKD2JhY2tvZmZfc2Vjb25kcxgFIAEoDSJuCgVTdGF0ZRIVChFTVEFURV9VTlNQRUNJRklFRBAAEhMKD05FRURTX1BST1ZJU0lPThABEgoKBkxPQ0tFRBACEgwKCFVOTE9DS0VEEAMSEQoNVU5MT0NLX0ZBSUxFRBAEEgwKCERJU0FCTEVEEAUi+gMKEkNsaWVudE5vdGlmaWNhdGlvbhIVCghyZXBseV9pZBgBIAEoDUgBiAEBEgwKBHRpbWUYAiABKAcSKgoFbGV2ZWwYAyABKA4yGy5tZXNodGFzdGljLkxvZ1JlY29yZC5MZXZlbBIPCgdtZXNzYWdlGAQgASgJElEKHmtleV92ZXJpZmljYXRpb25fbnVtYmVyX2luZm9ybRgLIAEoCzInLm1lc2h0YXN0aWMuS2V5VmVyaWZpY2F0aW9uTnVtYmVySW5mb3JtSAASUwofa2V5X3ZlcmlmaWNhdGlvbl9udW1iZXJfcmVxdWVzdBgMIAEoCzIoLm1lc2h0YXN0aWMuS2V5VmVyaWZpY2F0aW9uTnVtYmVyUmVxdWVzdEgAEkIKFmtleV92ZXJpZmljYXRpb25fZmluYWwYDSABKAsyIC5tZXNodGFzdGljLktleVZlcmlmaWNhdGlvbkZpbmFsSAASQAoVZHVwbGljYXRlZF9wdWJsaWNfa2V5GA4gASgLMh8ubWVzaHRhc3RpYy5EdXBsaWNhdGVkUHVibGljS2V5SAASNAoPbG93X2VudHJvcHlfa2V5GA8gASgLMhkubWVzaHRhc3RpYy5Mb3dFbnRyb3B5S2V5SABCEQoPcGF5bG9hZF92YXJpYW50QgsKCV9yZXBseV9pZCJeChtLZXlWZXJpZmljYXRpb25OdW1iZXJJbmZvcm0SDQoFbm9uY2UYASABKAQSFwoPcmVtb3RlX2xvbmduYW1lGAIgASgJEhcKD3NlY3VyaXR5X251bWJlchgDIAEoDSJGChxLZXlWZXJpZmljYXRpb25OdW1iZXJSZXF1ZXN0Eg0KBW5vbmNlGAEgASgEEhcKD3JlbW90ZV9sb25nbmFtZRgCIAEoCSJxChRLZXlWZXJpZmljYXRpb25GaW5hbBINCgVub25jZRgBIAEoBBIXCg9yZW1vdGVfbG9uZ25hbWUYAiABKAkSEAoIaXNTZW5kZXIYAyABKAgSHwoXdmVyaWZpY2F0aW9uX2NoYXJhY3RlcnMYBCABKAkiFQoTRHVwbGljYXRlZFB1YmxpY0tleSIPCg1Mb3dFbnRyb3B5S2V5IjEKCEZpbGVJbmZvEhEKCWZpbGVfbmFtZRgBIAEoCRISCgpzaXplX2J5dGVzGAIgASgNIpQCCgdUb1JhZGlvEigKBnBhY2tldBgBIAEoCzIWLm1lc2h0YXN0aWMuTWVzaFBhY2tldEgAEhgKDndhbnRfY29uZmlnX2lkGAMgASgNSAASFAoKZGlzY29ubmVjdBgEIAEoCEgAEioKDHhtb2RlbVBhY2tldBgFIAEoCzISLm1lc2h0YXN0aWMuWE1vZGVtSAASRAoWbXF0dENsaWVudFByb3h5TWVzc2FnZRgGIAEoCzIiLm1lc2h0YXN0aWMuTXF0dENsaWVudFByb3h5TWVzc2FnZUgAEioKCWhlYXJ0YmVhdBgHIAEoCzIVLm1lc2h0YXN0aWMuSGVhcnRiZWF0SABCEQoPcGF5bG9hZF92YXJpYW50IkAKCkNvbXByZXNzZWQSJAoHcG9ydG51bRgBIAEoDjITLm1lc2h0YXN0aWMuUG9ydE51bRIMCgRkYXRhGAIgASgMIocBCgxOZWlnaGJvckluZm8SDwoHbm9kZV9pZBgBIAEoDRIXCg9sYXN0X3NlbnRfYnlfaWQYAiABKA0SJAocbm9kZV9icm9hZGNhc3RfaW50ZXJ2YWxfc2VjcxgDIAEoDRInCgluZWlnaGJvcnMYBCADKAsyFC5tZXNodGFzdGljLk5laWdoYm9yImQKCE5laWdoYm9yEg8KB25vZGVfaWQYASABKA0SCwoDc25yGAIgASgCEhQKDGxhc3RfcnhfdGltZRgDIAEoBxIkChxub2RlX2Jyb2FkY2FzdF9pbnRlcnZhbF9zZWNzGAQgASgNItcCCg5EZXZpY2VNZXRhZGF0YRIYChBmaXJtd2FyZV92ZXJzaW9uGAEgASgJEhwKFGRldmljZV9zdGF0ZV92ZXJzaW9uGAIgASgNEhMKC2NhblNodXRkb3duGAMgASgIEg8KB2hhc1dpZmkYBCABKAgSFAoMaGFzQmx1ZXRvb3RoGAUgASgIEhMKC2hhc0V0aGVybmV0GAYgASgIEjIKBHJvbGUYByABKA4yJC5tZXNodGFzdGljLkNvbmZpZy5EZXZpY2VDb25maWcuUm9sZRIWCg5wb3NpdGlvbl9mbGFncxgIIAEoDRIrCghod19tb2RlbBgJIAEoDjIZLm1lc2h0YXN0aWMuSGFyZHdhcmVNb2RlbBIZChFoYXNSZW1vdGVIYXJkd2FyZRgKIAEoCBIOCgZoYXNQS0MYCyABKAgSGAoQZXhjbHVkZWRfbW9kdWxlcxgMIAEoDSIaCglIZWFydGJlYXQSDQoFbm9uY2UYASABKA0iVQoVTm9kZVJlbW90ZUhhcmR3YXJlUGluEhAKCG5vZGVfbnVtGAEgASgNEioKA3BpbhgCIAEoCzIdLm1lc2h0YXN0aWMuUmVtb3RlSGFyZHdhcmVQaW4iZQoOQ2h1bmtlZFBheWxvYWQSEgoKcGF5bG9hZF9pZBgBIAEoDRITCgtjaHVua19jb3VudBgCIAEoDRITCgtjaHVua19pbmRleBgDIAEoDRIVCg1wYXlsb2FkX2NodW5rGAQgASgMIh8KDXJlc2VuZF9jaHVua3MSDgoGY2h1bmtzGAEgAygNIqoBChZDaHVua2VkUGF5bG9hZFJlc3BvbnNlEhIKCnBheWxvYWRfaWQYASABKA0SGgoQcmVxdWVzdF90cmFuc2ZlchgCIAEoCEgAEhkKD2FjY2VwdF90cmFuc2ZlchgDIAEoCEgAEjIKDXJlc2VuZF9jaHVua3MYBCABKAsyGS5tZXNodGFzdGljLnJlc2VuZF9jaHVua3NIAEIRCg9wYXlsb2FkX3ZhcmlhbnQqrBUKDUhhcmR3YXJlTW9kZWwSCQoFVU5TRVQQABIMCghUTE9SQV9WMhABEgwKCFRMT1JBX1YxEAISEgoOVExPUkFfVjJfMV8xUDYQAxIJCgVUQkVBTRAEEg8KC0hFTFRFQ19WMl8wEAUSDgoKVEJFQU1fVjBQNxAGEgoKBlRfRUNITxAHEhAKDFRMT1JBX1YxXzFQMxAIEgsKB1JBSzQ2MzEQCRIPCgtIRUxURUNfVjJfMRAKEg0KCUhFTFRFQ19WMRALEhgKFExJTFlHT19UQkVBTV9TM19DT1JFEAwSDAoIUkFLMTEyMDAQDRILCgdOQU5PX0cxEA4SEgoOVExPUkFfVjJfMV8xUDgQDxIPCgtUTE9SQV9UM19TMxAQEhQKEE5BTk9fRzFfRVhQTE9SRVIQERIRCg1OQU5PX0cyX1VMVFJBEBISDQoJTE9SQV9UWVBFEBMSCwoHV0lQSE9ORRAUEg4KCldJT19XTTExMTAQFRILCgdSQUsyNTYwEBYSEwoPSEVMVEVDX0hSVV8zNjAxEBcSGgoWSEVMVEVDX1dJUkVMRVNTX0JSSURHRRAYEg4KClNUQVRJT05fRzEQGRIMCghSQUsxMTMxMBAaEhQKEFNFTlNFTE9SQV9SUDIwNDAQGxIQCgxTRU5TRUxPUkFfUzMQHBINCglDQU5BUllPTkUQHRIPCgtSUDIwNDBfTE9SQRAeEg4KClNUQVRJT05fRzIQHxIRCg1MT1JBX1JFTEFZX1YxECASDwoLVF9FQ0hPX1BMVVMQIRIHCgNQUFIQIhIPCgtHRU5JRUJMT0NLUxAjEhEKDU5SRjUyX1VOS05PV04QJBINCglQT1JURFVJTk8QJRIPCgtBTkRST0lEX1NJTRAmEgoKBkRJWV9WMRAnEhUKEU5SRjUyODQwX1BDQTEwMDU5ECgSCgoGRFJfREVWECkSCwoHTTVTVEFDSxAqEg0KCUhFTFRFQ19WMxArEhEKDUhFTFRFQ19XU0xfVjMQLBITCg9CRVRBRlBWXzI0MDBfVFgQLRIXChNCRVRBRlBWXzkwMF9OQU5PX1RYEC4SDAoIUlBJX1BJQ08QLxIbChdIRUxURUNfV0lSRUxFU1NfVFJBQ0tFUhAwEhkKFUhFTFRFQ19XSVJFTEVTU19QQVBFUhAxEgoKBlRfREVDSxAyEg4KClRfV0FUQ0hfUzMQMxIRCg1QSUNPTVBVVEVSX1MzEDQSDwoLSEVMVEVDX0hUNjIQNRISCg5FQllURV9FU1AzMl9TMxA2EhEKDUVTUDMyX1MzX1BJQ08QNxINCglDSEFUVEVSXzIQOBIeChpIRUxURUNfV0lSRUxFU1NfUEFQRVJfVjFfMBA5EiAKHEhFTFRFQ19XSVJFTEVTU19UUkFDS0VSX1YxXzAQOhILCgdVTlBIT05FEDsSDAoIVERfTE9SQUMQPBITCg9DREVCWVRFX0VPUkFfUzMQPRIPCgtUV0NfTUVTSF9WNBA+EhYKEk5SRjUyX1BST01JQ1JPX0RJWRA/Eh8KG1JBRElPTUFTVEVSXzkwMF9CQU5ESVRfTkFOTxBAEhwKGEhFTFRFQ19DQVBTVUxFX1NFTlNPUl9WMxBBEh0KGUhFTFRFQ19WSVNJT05fTUFTVEVSX1QxOTAQQhIdChlIRUxURUNfVklTSU9OX01BU1RFUl9FMjEzEEMSHQoZSEVMVEVDX1ZJU0lPTl9NQVNURVJfRTI5MBBEEhkKFUhFTFRFQ19NRVNIX05PREVfVDExNBBFEhYKElNFTlNFQ0FQX0lORElDQVRPUhBGEhMKD1RSQUNLRVJfVDEwMDBfRRBHEgsKB1JBSzMxNzIQSBIKCgZXSU9fRTUQSRIaChZSQURJT01BU1RFUl85MDBfQkFORElUEEoSEwoPTUUyNUxTMDFfNFkxMFREEEsSGAoUUlAyMDQwX0ZFQVRIRVJfUkZNOTUQTBIVChFNNVNUQUNLX0NPUkVCQVNJQxBNEhEKDU01U1RBQ0tfQ09SRTIQThINCglSUElfUElDTzIQTxISCg5NNVNUQUNLX0NPUkVTMxBQEhEKDVNFRUVEX1hJQU9fUzMQURILCgdNUzI0U0YxEFISDAoIVExPUkFfQzYQUxIPCgtXSVNNRVNIX1RBUBBUEg0KCVJPVVRBU1RJQxBVEgwKCE1FU0hfVEFCEFYSDAoITUVTSExJTksQVxISCg5YSUFPX05SRjUyX0tJVBBYEhAKDFRISU5LTk9ERV9NMRBZEhAKDFRISU5LTk9ERV9NMhBaEg8KC1RfRVRIX0VMSVRFEFsSFQoRSEVMVEVDX1NFTlNPUl9IVUIQXBINCglNVVpJX0JBU0UQXRIWChJIRUxURUNfTUVTSF9QT0NLRVQQXhIUChBTRUVFRF9TT0xBUl9OT0RFEF8SGAoUTk9NQURTVEFSX01FVEVPUl9QUk8QYBINCglDUk9XUEFORUwQYRILCgdMSU5LXzMyEGISGAoUU0VFRURfV0lPX1RSQUNLRVJfTDEQYxIdChlTRUVFRF9XSU9fVFJBQ0tFUl9MMV9FSU5LEGQSDwoLTVVaSV9SMV9ORU8QZRIOCgpUX0RFQ0tfUFJPEGYSEAoMVF9MT1JBX1BBR0VSEGcSFAoQTTVTVEFDS19SRVNFUlZFRBBoEg8KC1dJU01FU0hfVEFHEGkSCwoHUkFLMzMxMhBqEhAKDFRISU5LTk9ERV9NNRBrEhUKEUhFTFRFQ19NRVNIX1NPTEFSEGwSDwoLVF9FQ0hPX0xJVEUQbRINCglIRUxURUNfVjQQbhIPCgtNNVNUQUNLX0M2TBBvEhkKFU01U1RBQ0tfQ0FSRFBVVEVSX0FEVhBwEh4KGkhFTFRFQ19XSVJFTEVTU19UUkFDS0VSX1YyEHESEQoNVF9XQVRDSF9VTFRSQRByEhAKDFRISU5LTk9ERV9NMxBzEhIKDldJU01FU0hfVEFQX1YyEHQSCwoHUkFLMzQwMRB1EgsKB1JBSzY0MjEQdhIQCgxUSElOS05PREVfTTQQdxIQCgxUSElOS05PREVfTTYQeBISCg5NRVNIU1RJQ0tfMTI2MhB5EhAKDFRCRUFNXzFfV0FUVBB6EhQKEFQ1X1MzX0VQQVBFUl9QUk8QexINCglUQkVBTV9CUEYQfBISCg5NSU5JX0VQQVBFUl9TMxB9EhMKD1RESVNQTEFZX1MzX1BSTxB+EhkKFUhFTFRFQ19NRVNIX05PREVfVDA5NhB/EhgKE1RSQUNLRVJfVDEwMDBfRV9QUk8QgAESEQoMVEhJTktOT0RFX003EIEBEhEKDFRISU5LTk9ERV9NOBCCARIRCgxUSElOS05PREVfTTkQgwESEQoMSEVMVEVDX1Y0X1I4EIQBEhgKE0hFTFRFQ19NRVNIX05PREVfVDEQhQESDwoKU1RBVElPTl9HMxCGARITCg5UX0lNUFVMU0VfUExVUxCHARIQCgtUX0VDSE9fQ0FSRBCIARIZChRTRUVFRF9XSU9fVFJBQ0tFUl9MMhCJARIRCgxDUk9XUEFORUxfUDQQigESGQoUSEVMVEVDX01FU0hfVE9XRVJfVjIQiwESEwoOTUVTSE5PTE9HWV9XMTAQjAESDwoKUFJJVkFURV9IVxD/ASosCglDb25zdGFudHMSCAoEWkVSTxAAEhUKEERBVEFfUEFZTE9BRF9MRU4Q6QEqtAIKEUNyaXRpY2FsRXJyb3JDb2RlEggKBE5PTkUQABIPCgtUWF9XQVRDSERPRxABEhQKEFNMRUVQX0VOVEVSX1dBSVQQAhIMCghOT19SQURJTxADEg8KC1VOU1BFQ0lGSUVEEAQSFQoRVUJMT1hfVU5JVF9GQUlMRUQQBRINCglOT19BWFAxOTIQBhIZChVJTlZBTElEX1JBRElPX1NFVFRJTkcQBxITCg9UUkFOU01JVF9GQUlMRUQQCBIMCghCUk9XTk9VVBAJEhIKDlNYMTI2Ml9GQUlMVVJFEAoSEQoNUkFESU9fU1BJX0JVRxALEiAKHEZMQVNIX0NPUlJVUFRJT05fUkVDT1ZFUkFCTEUQDBIiCh5GTEFTSF9DT1JSVVBUSU9OX1VOUkVDT1ZFUkFCTEUQDSp/Cg9GaXJtd2FyZUVkaXRpb24SCwoHVkFOSUxMQRAAEhEKDVNNQVJUX0NJVElaRU4QARIOCgpPUEVOX1NBVUNFEBASCgoGREVGQ09OEBESDwoLQlVSTklOR19NQU4QEhIOCgpIQU1WRU5USU9OEBMSDwoLRElZX0VESVRJT04QfyqAAwoPRXhjbHVkZWRNb2R1bGVzEhEKDUVYQ0xVREVEX05PTkUQABIPCgtNUVRUX0NPTkZJRxABEhEKDVNFUklBTF9DT05GSUcQAhITCg9FWFROT1RJRl9DT05GSUcQBBIXChNTVE9SRUZPUldBUkRfQ09ORklHEAgSFAoQUkFOR0VURVNUX0NPTkZJRxAQEhQKEFRFTEVNRVRSWV9DT05GSUcQIBIUChBDQU5ORURNU0dfQ09ORklHEEASEQoMQVVESU9fQ09ORklHEIABEhoKFVJFTU9URUhBUkRXQVJFX0NPTkZJRxCAAhIYChNORUlHSEJPUklORk9fQ09ORklHEIAEEhsKFkFNQklFTlRMSUdIVElOR19DT05GSUcQgAgSGwoWREVURUNUSU9OU0VOU09SX0NPTkZJRxCAEBIWChFQQVhDT1VOVEVSX0NPTkZJRxCAIBIVChBCTFVFVE9PVEhfQ09ORklHEIBAEhQKDk5FVFdPUktfQ09ORklHEICAAUJgChRvcmcubWVzaHRhc3RpYy5wcm90b0IKTWVzaFByb3Rvc1oiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZKoCFE1lc2h0YXN0aWMuUHJvdG9idWZzugIAYgZwcm90bzM", [file_meshtastic_channel, file_meshtastic_config, file_meshtastic_device_ui, file_meshtastic_module_config, file_meshtastic_portnums, file_meshtastic_telemetry, file_meshtastic_xmodem]); + +/** + * + * A GPS Position + * + * @generated from message meshtastic.Position + */ +export type Position = Message<"meshtastic.Position"> & { + /** + * + * The new preferred location encoding, multiply by 1e-7 to get degrees + * in floating point + * + * @generated from field: optional sfixed32 latitude_i = 1; + */ + latitudeI?: number | undefined; + + /** + * + * TODO: REPLACE + * + * @generated from field: optional sfixed32 longitude_i = 2; + */ + longitudeI?: number | undefined; + + /** + * + * In meters above MSL (but see issue #359) + * + * @generated from field: optional int32 altitude = 3; + */ + altitude?: number | undefined; + + /** + * + * This is usually not sent over the mesh (to save space), but it is sent + * from the phone so that the local device can set its time if it is sent over + * the mesh (because there are devices on the mesh without GPS or RTC). + * seconds since 1970 + * + * @generated from field: fixed32 time = 4; + */ + time: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.Position.LocSource location_source = 5; + */ + locationSource: Position_LocSource; + + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.Position.AltSource altitude_source = 6; + */ + altitudeSource: Position_AltSource; + + /** + * + * Positional timestamp (actual timestamp of GPS solution) in integer epoch seconds + * + * @generated from field: fixed32 timestamp = 7; + */ + timestamp: number; + + /** + * + * Pos. timestamp milliseconds adjustment (rarely available or required) + * + * @generated from field: int32 timestamp_millis_adjust = 8; + */ + timestampMillisAdjust: number; + + /** + * + * HAE altitude in meters - can be used instead of MSL altitude + * + * @generated from field: optional sint32 altitude_hae = 9; + */ + altitudeHae?: number | undefined; + + /** + * + * Geoidal separation in meters + * + * @generated from field: optional sint32 altitude_geoidal_separation = 10; + */ + altitudeGeoidalSeparation?: number | undefined; + + /** + * + * Horizontal, Vertical and Position Dilution of Precision, in 1/100 units + * - PDOP is sufficient for most cases + * - for higher precision scenarios, HDOP and VDOP can be used instead, + * in which case PDOP becomes redundant (PDOP=sqrt(HDOP^2 + VDOP^2)) + * TODO: REMOVE/INTEGRATE + * + * @generated from field: uint32 PDOP = 11; + */ + PDOP: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: uint32 HDOP = 12; + */ + HDOP: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: uint32 VDOP = 13; + */ + VDOP: number; + + /** + * + * GPS accuracy (a hardware specific constant) in mm + * multiplied with DOP to calculate positional accuracy + * Default: "'bout three meters-ish" :) + * + * @generated from field: uint32 gps_accuracy = 14; + */ + gpsAccuracy: number; + + /** + * + * Ground speed in m/s and True North TRACK in 1/100 degrees + * Clarification of terms: + * - "track" is the direction of motion (measured in horizontal plane) + * - "heading" is where the fuselage points (measured in horizontal plane) + * - "yaw" indicates a relative rotation about the vertical axis + * TODO: REMOVE/INTEGRATE + * + * @generated from field: optional uint32 ground_speed = 15; + */ + groundSpeed?: number | undefined; + + /** + * + * TODO: REPLACE + * + * @generated from field: optional uint32 ground_track = 16; + */ + groundTrack?: number | undefined; + + /** + * + * GPS fix quality (from NMEA GxGGA statement or similar) + * + * @generated from field: uint32 fix_quality = 17; + */ + fixQuality: number; + + /** + * + * GPS fix type 2D/3D (from NMEA GxGSA statement) + * + * @generated from field: uint32 fix_type = 18; + */ + fixType: number; + + /** + * + * GPS "Satellites in View" number + * + * @generated from field: uint32 sats_in_view = 19; + */ + satsInView: number; + + /** + * + * Sensor ID - in case multiple positioning sensors are being used + * + * @generated from field: uint32 sensor_id = 20; + */ + sensorId: number; + + /** + * + * Estimated/expected time (in seconds) until next update: + * - if we update at fixed intervals of X seconds, use X + * - if we update at dynamic intervals (based on relative movement etc), + * but "AT LEAST every Y seconds", use Y + * + * @generated from field: uint32 next_update = 21; + */ + nextUpdate: number; + + /** + * + * A sequence number, incremented with each Position message to help + * detect lost updates if needed + * + * @generated from field: uint32 seq_number = 22; + */ + seqNumber: number; + + /** + * + * Indicates the bits of precision set by the sending node + * + * @generated from field: uint32 precision_bits = 23; + */ + precisionBits: number; +}; + +/** + * Describes the message meshtastic.Position. + * Use `create(PositionSchema)` to create a new message. + */ +export const PositionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 0); + +/** + * + * How the location was acquired: manual, onboard GPS, external (EUD) GPS + * + * @generated from enum meshtastic.Position.LocSource + */ +export enum Position_LocSource { + /** + * + * TODO: REPLACE + * + * @generated from enum value: LOC_UNSET = 0; + */ + LOC_UNSET = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: LOC_MANUAL = 1; + */ + LOC_MANUAL = 1, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: LOC_INTERNAL = 2; + */ + LOC_INTERNAL = 2, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: LOC_EXTERNAL = 3; + */ + LOC_EXTERNAL = 3, +} + +/** + * Describes the enum meshtastic.Position.LocSource. + */ +export const Position_LocSourceSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 0, 0); + +/** + * + * How the altitude was acquired: manual, GPS int/ext, etc + * Default: same as location_source if present + * + * @generated from enum meshtastic.Position.AltSource + */ +export enum Position_AltSource { + /** + * + * TODO: REPLACE + * + * @generated from enum value: ALT_UNSET = 0; + */ + ALT_UNSET = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: ALT_MANUAL = 1; + */ + ALT_MANUAL = 1, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: ALT_INTERNAL = 2; + */ + ALT_INTERNAL = 2, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: ALT_EXTERNAL = 3; + */ + ALT_EXTERNAL = 3, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: ALT_BAROMETRIC = 4; + */ + ALT_BAROMETRIC = 4, +} + +/** + * Describes the enum meshtastic.Position.AltSource. + */ +export const Position_AltSourceSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 0, 1); + +/** + * + * Broadcast when a newly powered mesh node wants to find a node num it can use + * Sent from the phone over bluetooth to set the user id for the owner of this node. + * Also sent from nodes to each other when a new node signs on (so all clients can have this info) + * The algorithm is as follows: + * when a node starts up, it broadcasts their user and the normal flow is for all + * other nodes to reply with their User as well (so the new node can build its nodedb) + * If a node ever receives a User (not just the first broadcast) message where + * the sender node number equals our node number, that indicates a collision has + * occurred and the following steps should happen: + * If the receiving node (that was already in the mesh)'s macaddr is LOWER than the + * new User who just tried to sign in: it gets to keep its nodenum. + * We send a broadcast message of OUR User (we use a broadcast so that the other node can + * receive our message, considering we have the same id - it also serves to let + * observers correct their nodedb) - this case is rare so it should be okay. + * If any node receives a User where the macaddr is GTE than their local macaddr, + * they have been vetoed and should pick a new random nodenum (filtering against + * whatever it knows about the nodedb) and rebroadcast their User. + * A few nodenums are reserved and will never be requested: + * 0xff - broadcast + * 0 through 3 - for future use + * + * @generated from message meshtastic.User + */ +export type User = Message<"meshtastic.User"> & { + /** + * + * A globally unique ID string for this user. + * In the case of Signal that would mean +16504442323, for the default macaddr derived id it would be !<8 hexidecimal bytes>. + * Note: app developers are encouraged to also use the following standard + * node IDs "^all" (for broadcast), "^local" (for the locally connected node) + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * + * A full name for this user, i.e. "Kevin Hester" + * Limited to 24 bytes of UTF-8: longer names are accepted from senders + * built against the older 39-byte limit, but devices truncate them before + * storing or rebroadcasting. Clients should enforce 24 bytes in their UI. + * + * @generated from field: string long_name = 2; + */ + longName: string; + + /** + * + * A VERY short name, ideally two characters. + * Suitable for a tiny OLED screen + * + * @generated from field: string short_name = 3; + */ + shortName: string; + + /** + * + * Deprecated in Meshtastic 2.1.x + * This is the addr of the radio. + * Not populated by the phone, but added by the esp32 when broadcasting + * + * @generated from field: bytes macaddr = 4 [deprecated = true]; + * @deprecated + */ + macaddr: Uint8Array; + + /** + * + * TBEAM, HELTEC, etc... + * Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. + * Apps will still need the string here for older builds + * (so OTA update can find the right image), but if the enum is available it will be used instead. + * + * @generated from field: meshtastic.HardwareModel hw_model = 5; + */ + hwModel: HardwareModel; + + /** + * + * In some regions Ham radio operators have different bandwidth limitations than others. + * If this user is a licensed operator, set this flag. + * Also, "long_name" should be their licence number. + * + * @generated from field: bool is_licensed = 6; + */ + isLicensed: boolean; + + /** + * + * Indicates that the user's role in the mesh + * + * @generated from field: meshtastic.Config.DeviceConfig.Role role = 7; + */ + role: Config_DeviceConfig_Role; + + /** + * + * The public key of the user's device. + * This is sent out to other nodes on the mesh to allow them to compute a shared secret key. + * + * @generated from field: bytes public_key = 8; + */ + publicKey: Uint8Array; + + /** + * + * Whether or not the node can be messaged + * + * @generated from field: optional bool is_unmessagable = 9; + */ + isUnmessagable?: boolean | undefined; +}; + +/** + * Describes the message meshtastic.User. + * Use `create(UserSchema)` to create a new message. + */ +export const UserSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 1); + +/** + * + * A message used in a traceroute + * + * @generated from message meshtastic.RouteDiscovery + */ +export type RouteDiscovery = Message<"meshtastic.RouteDiscovery"> & { + /** + * + * The list of nodenums this packet has visited so far to the destination. + * + * @generated from field: repeated fixed32 route = 1; + */ + route: number[]; + + /** + * + * The list of SNRs (in dB, scaled by 4) in the route towards the destination. + * + * @generated from field: repeated int32 snr_towards = 2; + */ + snrTowards: number[]; + + /** + * + * The list of nodenums the packet has visited on the way back from the destination. + * + * @generated from field: repeated fixed32 route_back = 3; + */ + routeBack: number[]; + + /** + * + * The list of SNRs (in dB, scaled by 4) in the route back from the destination. + * + * @generated from field: repeated int32 snr_back = 4; + */ + snrBack: number[]; +}; + +/** + * Describes the message meshtastic.RouteDiscovery. + * Use `create(RouteDiscoverySchema)` to create a new message. + */ +export const RouteDiscoverySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 2); + +/** + * + * A Routing control Data packet handled by the routing module + * + * @generated from message meshtastic.Routing + */ +export type Routing = Message<"meshtastic.Routing"> & { + /** + * @generated from oneof meshtastic.Routing.variant + */ + variant: { + /** + * + * A route request going from the requester + * + * @generated from field: meshtastic.RouteDiscovery route_request = 1; + */ + value: RouteDiscovery; + case: "routeRequest"; + } | { + /** + * + * A route reply + * + * @generated from field: meshtastic.RouteDiscovery route_reply = 2; + */ + value: RouteDiscovery; + case: "routeReply"; + } | { + /** + * + * A failure in delivering a message (usually used for routing control messages, but might be provided + * in addition to ack.fail_id to provide details on the type of failure). + * + * @generated from field: meshtastic.Routing.Error error_reason = 3; + */ + value: Routing_Error; + case: "errorReason"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.Routing. + * Use `create(RoutingSchema)` to create a new message. + */ +export const RoutingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 3); + +/** + * + * A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide + * details on the type of failure). + * + * @generated from enum meshtastic.Routing.Error + */ +export enum Routing_Error { + /** + * + * This message is not a failure + * + * @generated from enum value: NONE = 0; + */ + NONE = 0, + + /** + * + * Our node doesn't have a route to the requested destination anymore. + * + * @generated from enum value: NO_ROUTE = 1; + */ + NO_ROUTE = 1, + + /** + * + * We received a nak while trying to forward on your behalf + * + * @generated from enum value: GOT_NAK = 2; + */ + GOT_NAK = 2, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TIMEOUT = 3; + */ + TIMEOUT = 3, + + /** + * + * No suitable interface could be found for delivering this packet + * + * @generated from enum value: NO_INTERFACE = 4; + */ + NO_INTERFACE = 4, + + /** + * + * We reached the max retransmission count (typically for naive flood routing) + * + * @generated from enum value: MAX_RETRANSMIT = 5; + */ + MAX_RETRANSMIT = 5, + + /** + * + * No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) + * + * @generated from enum value: NO_CHANNEL = 6; + */ + NO_CHANNEL = 6, + + /** + * + * The packet was too big for sending (exceeds interface MTU after encoding) + * + * @generated from enum value: TOO_LARGE = 7; + */ + TOO_LARGE = 7, + + /** + * + * The request had want_response set, the request reached the destination node, but no service on that node wants to send a response + * (possibly due to bad channel permissions) + * + * @generated from enum value: NO_RESPONSE = 8; + */ + NO_RESPONSE = 8, + + /** + * + * Cannot send currently because duty cycle regulations will be violated. + * + * @generated from enum value: DUTY_CYCLE_LIMIT = 9; + */ + DUTY_CYCLE_LIMIT = 9, + + /** + * + * The application layer service on the remote node received your request, but considered your request somehow invalid + * + * @generated from enum value: BAD_REQUEST = 32; + */ + BAD_REQUEST = 32, + + /** + * + * The application layer service on the remote node received your request, but considered your request not authorized + * (i.e you did not send the request on the required bound channel) + * + * @generated from enum value: NOT_AUTHORIZED = 33; + */ + NOT_AUTHORIZED = 33, + + /** + * + * The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) + * + * @generated from enum value: PKI_FAILED = 34; + */ + PKI_FAILED = 34, + + /** + * + * The receiving node does not have a Public Key to decode with + * + * @generated from enum value: PKI_UNKNOWN_PUBKEY = 35; + */ + PKI_UNKNOWN_PUBKEY = 35, + + /** + * + * Admin packet otherwise checks out, but uses a bogus or expired session key + * + * @generated from enum value: ADMIN_BAD_SESSION_KEY = 36; + */ + ADMIN_BAD_SESSION_KEY = 36, + + /** + * + * Admin packet sent using PKC, but not from a public key on the admin key list + * + * @generated from enum value: ADMIN_PUBLIC_KEY_UNAUTHORIZED = 37; + */ + ADMIN_PUBLIC_KEY_UNAUTHORIZED = 37, + + /** + * + * Airtime fairness rate limit exceeded for a packet + * This typically enforced per portnum and is used to prevent a single node from monopolizing airtime + * + * @generated from enum value: RATE_LIMIT_EXCEEDED = 38; + */ + RATE_LIMIT_EXCEEDED = 38, + + /** + * + * PKI encryption failed, due to no public key for the remote node + * This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet + * + * @generated from enum value: PKI_SEND_FAIL_PUBLIC_KEY = 39; + */ + PKI_SEND_FAIL_PUBLIC_KEY = 39, +} + +/** + * Describes the enum meshtastic.Routing.Error. + */ +export const Routing_ErrorSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 3, 0); + +/** + * + * (Formerly called SubPacket) + * The payload portion fo a packet, this is the actual bytes that are sent + * inside a radio packet (because from/to are broken out by the comms library) + * + * @generated from message meshtastic.Data + */ +export type Data = Message<"meshtastic.Data"> & { + /** + * + * Formerly named typ and of type Type + * + * @generated from field: meshtastic.PortNum portnum = 1; + */ + portnum: PortNum; + + /** + * + * TODO: REPLACE + * + * @generated from field: bytes payload = 2; + */ + payload: Uint8Array; + + /** + * + * Not normally used, but for testing a sender can request that recipient + * responds in kind (i.e. if it received a position, it should unicast back it's position). + * Note: that if you set this on a broadcast you will receive many replies. + * + * @generated from field: bool want_response = 3; + */ + wantResponse: boolean; + + /** + * + * The address of the destination node. + * This field is is filled in by the mesh radio device software, application + * layer software should never need it. + * RouteDiscovery messages _must_ populate this. + * Other message types might need to if they are doing multihop routing. + * + * @generated from field: fixed32 dest = 4; + */ + dest: number; + + /** + * + * The address of the original sender for this message. + * This field should _only_ be populated for reliable multihop packets (to keep + * packets small). + * + * @generated from field: fixed32 source = 5; + */ + source: number; + + /** + * + * Only used in routing or response messages. + * Indicates the original message ID that this message is reporting failure on. (formerly called original_id) + * + * @generated from field: fixed32 request_id = 6; + */ + requestId: number; + + /** + * + * If set, this message is intened to be a reply to a previously sent message with the defined id. + * + * @generated from field: fixed32 reply_id = 7; + */ + replyId: number; + + /** + * + * Defaults to false. If true, then what is in the payload should be treated as an emoji like giving + * a message a heart or poop emoji. + * + * @generated from field: fixed32 emoji = 8; + */ + emoji: number; + + /** + * + * Bitfield for extra flags. First use is to indicate that user approves the packet being uploaded to MQTT. + * + * @generated from field: optional uint32 bitfield = 9; + */ + bitfield?: number | undefined; + + /** + * + * XEdDSA signature for the payload + * + * @generated from field: bytes xeddsa_signature = 10; + */ + xeddsaSignature: Uint8Array; +}; + +/** + * Describes the message meshtastic.Data. + * Use `create(DataSchema)` to create a new message. + */ +export const DataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 4); + +/** + * + * The actual over-the-mesh message doing KeyVerification + * + * @generated from message meshtastic.KeyVerification + */ +export type KeyVerification = Message<"meshtastic.KeyVerification"> & { + /** + * + * random value Selected by the requesting node + * + * @generated from field: uint64 nonce = 1; + */ + nonce: bigint; + + /** + * + * The final authoritative hash, only to be sent by NodeA at the end of the handshake + * + * @generated from field: bytes hash1 = 2; + */ + hash1: Uint8Array; + + /** + * + * The intermediary hash (actually derived from hash1), + * sent from NodeB to NodeA in response to the initial message. + * + * @generated from field: bytes hash2 = 3; + */ + hash2: Uint8Array; +}; + +/** + * Describes the message meshtastic.KeyVerification. + * Use `create(KeyVerificationSchema)` to create a new message. + */ +export const KeyVerificationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 5); + +/** + * + * The actual over-the-mesh message doing store and forward++ + * + * @generated from message meshtastic.StoreForwardPlusPlus + */ +export type StoreForwardPlusPlus = Message<"meshtastic.StoreForwardPlusPlus"> & { + /** + * + * Which message type is this + * + * @generated from field: meshtastic.StoreForwardPlusPlus.SFPP_message_type sfpp_message_type = 1; + */ + sfppMessageType: StoreForwardPlusPlus_SFPP_message_type; + + /** + * + * The hash of the specific message + * + * @generated from field: bytes message_hash = 2; + */ + messageHash: Uint8Array; + + /** + * + * The hash of a link on a chain + * + * @generated from field: bytes commit_hash = 3; + */ + commitHash: Uint8Array; + + /** + * + * the root hash of a chain + * + * @generated from field: bytes root_hash = 4; + */ + rootHash: Uint8Array; + + /** + * + * The encrypted bytes from a message + * + * @generated from field: bytes message = 5; + */ + message: Uint8Array; + + /** + * + * Message ID of the contained message + * + * @generated from field: uint32 encapsulated_id = 6; + */ + encapsulatedId: number; + + /** + * + * Destination of the contained message + * + * @generated from field: uint32 encapsulated_to = 7; + */ + encapsulatedTo: number; + + /** + * + * Sender of the contained message + * + * @generated from field: uint32 encapsulated_from = 8; + */ + encapsulatedFrom: number; + + /** + * + * The receive time of the message in question + * + * @generated from field: uint32 encapsulated_rxtime = 9; + */ + encapsulatedRxtime: number; + + /** + * + * Used in a LINK_REQUEST to specify the message X spots back from head + * + * @generated from field: uint32 chain_count = 10; + */ + chainCount: number; +}; + +/** + * Describes the message meshtastic.StoreForwardPlusPlus. + * Use `create(StoreForwardPlusPlusSchema)` to create a new message. + */ +export const StoreForwardPlusPlusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 6); + +/** + * + * Enum of message types + * + * @generated from enum meshtastic.StoreForwardPlusPlus.SFPP_message_type + */ +export enum StoreForwardPlusPlus_SFPP_message_type { + /** + * + * Send an announcement of the canonical tip of a chain + * + * @generated from enum value: CANON_ANNOUNCE = 0; + */ + CANON_ANNOUNCE = 0, + + /** + * + * Query whether a specific link is on the chain + * + * @generated from enum value: CHAIN_QUERY = 1; + */ + CHAIN_QUERY = 1, + + /** + * + * Request the next link in the chain + * + * @generated from enum value: LINK_REQUEST = 3; + */ + LINK_REQUEST = 3, + + /** + * + * Provide a link to add to the chain + * + * @generated from enum value: LINK_PROVIDE = 4; + */ + LINK_PROVIDE = 4, + + /** + * + * If we must fragment, send the first half + * + * @generated from enum value: LINK_PROVIDE_FIRSTHALF = 5; + */ + LINK_PROVIDE_FIRSTHALF = 5, + + /** + * + * If we must fragment, send the second half + * + * @generated from enum value: LINK_PROVIDE_SECONDHALF = 6; + */ + LINK_PROVIDE_SECONDHALF = 6, +} + +/** + * Describes the enum meshtastic.StoreForwardPlusPlus.SFPP_message_type. + */ +export const StoreForwardPlusPlus_SFPP_message_typeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 6, 0); + +/** + * + * The actual over-the-mesh message doing RemoteShell + * + * @generated from message meshtastic.RemoteShell + */ +export type RemoteShell = Message<"meshtastic.RemoteShell"> & { + /** + * + * Structured frame operation. + * + * @generated from field: meshtastic.RemoteShell.OpCode op = 1; + */ + op: RemoteShell_OpCode; + + /** + * + * Logical PTY session identifier. + * + * @generated from field: uint32 session_id = 2; + */ + sessionId: number; + + /** + * + * Monotonic sequence number for this frame. + * + * @generated from field: uint32 seq = 3; + */ + seq: number; + + /** + * + * Cumulative ack sequence number. + * + * @generated from field: uint32 ack_seq = 4; + */ + ackSeq: number; + + /** + * + * Opaque bytes payload for INPUT/OUTPUT/ERROR and other frame bodies. + * + * @generated from field: bytes payload = 5; + */ + payload: Uint8Array; + + /** + * + * Terminal size columns used for OPEN/RESIZE signaling. + * + * @generated from field: uint32 cols = 6; + */ + cols: number; + + /** + * + * Terminal size rows used for OPEN/RESIZE signaling. + * + * @generated from field: uint32 rows = 7; + */ + rows: number; + + /** + * + * Bit flags for protocol extensions. + * + * @generated from field: uint32 flags = 8; + */ + flags: number; + + /** + * + * The last sequence number TX'd. + * + * @generated from field: uint32 last_tx_seq = 9; + */ + lastTxSeq: number; + + /** + * + * The last sequence number RX'd. + * + * @generated from field: uint32 last_rx_seq = 10; + */ + lastRxSeq: number; +}; + +/** + * Describes the message meshtastic.RemoteShell. + * Use `create(RemoteShellSchema)` to create a new message. + */ +export const RemoteShellSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 7); + +/** + * + * Frame op code for PTY session control and stream transport. + * + * Values 1-63 are client->server requests. + * Values 64-127 are server->client responses/events. + * + * @generated from enum meshtastic.RemoteShell.OpCode + */ +export enum RemoteShell_OpCode { + /** + * @generated from enum value: OP_UNSET = 0; + */ + OP_UNSET = 0, + + /** + * Client -> server + * + * @generated from enum value: OPEN = 1; + */ + OPEN = 1, + + /** + * @generated from enum value: INPUT = 2; + */ + INPUT = 2, + + /** + * @generated from enum value: RESIZE = 3; + */ + RESIZE = 3, + + /** + * @generated from enum value: CLOSE = 4; + */ + CLOSE = 4, + + /** + * @generated from enum value: PING = 5; + */ + PING = 5, + + /** + * @generated from enum value: ACK = 6; + */ + ACK = 6, + + /** + * Server -> client + * + * @generated from enum value: OPEN_OK = 64; + */ + OPEN_OK = 64, + + /** + * @generated from enum value: OUTPUT = 65; + */ + OUTPUT = 65, + + /** + * @generated from enum value: CLOSED = 66; + */ + CLOSED = 66, + + /** + * @generated from enum value: ERROR = 67; + */ + ERROR = 67, + + /** + * @generated from enum value: PONG = 68; + */ + PONG = 68, +} + +/** + * Describes the enum meshtastic.RemoteShell.OpCode. + */ +export const RemoteShell_OpCodeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 7, 0); + +/** + * + * Waypoint message, used to share arbitrary locations across the mesh + * + * @generated from message meshtastic.Waypoint + */ +export type Waypoint = Message<"meshtastic.Waypoint"> & { + /** + * + * Id of the waypoint + * + * @generated from field: uint32 id = 1; + */ + id: number; + + /** + * + * latitude_i + * + * @generated from field: optional sfixed32 latitude_i = 2; + */ + latitudeI?: number | undefined; + + /** + * + * longitude_i + * + * @generated from field: optional sfixed32 longitude_i = 3; + */ + longitudeI?: number | undefined; + + /** + * + * Time the waypoint is to expire (epoch) + * + * @generated from field: uint32 expire = 4; + */ + expire: number; + + /** + * + * If greater than zero, treat the value as a nodenum only allowing them to update the waypoint. + * If zero, the waypoint is open to be edited by any member of the mesh. + * + * @generated from field: uint32 locked_to = 5; + */ + lockedTo: number; + + /** + * + * Name of the waypoint - max 30 chars + * + * @generated from field: string name = 6; + */ + name: string; + + /** + * + * Description of the waypoint - max 100 chars + * + * @generated from field: string description = 7; + */ + description: string; + + /** + * + * Designator icon for the waypoint in the form of a unicode emoji + * + * @generated from field: fixed32 icon = 8; + */ + icon: number; +}; + +/** + * Describes the message meshtastic.Waypoint. + * Use `create(WaypointSchema)` to create a new message. + */ +export const WaypointSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 8); + +/** + * + * Message for node status + * + * @generated from message meshtastic.StatusMessage + */ +export type StatusMessage = Message<"meshtastic.StatusMessage"> & { + /** + * @generated from field: string status = 1; + */ + status: string; +}; + +/** + * Describes the message meshtastic.StatusMessage. + * Use `create(StatusMessageSchema)` to create a new message. + */ +export const StatusMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 9); + +/** + * + * This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server + * + * @generated from message meshtastic.MqttClientProxyMessage + */ +export type MqttClientProxyMessage = Message<"meshtastic.MqttClientProxyMessage"> & { + /** + * + * The MQTT topic this message will be sent /received on + * + * @generated from field: string topic = 1; + */ + topic: string; + + /** + * + * The actual service envelope payload or text for mqtt pub / sub + * + * @generated from oneof meshtastic.MqttClientProxyMessage.payload_variant + */ + payloadVariant: { + /** + * + * Bytes + * + * @generated from field: bytes data = 2; + */ + value: Uint8Array; + case: "data"; + } | { + /** + * + * Text + * + * @generated from field: string text = 3; + */ + value: string; + case: "text"; + } | { case: undefined; value?: undefined }; + + /** + * + * Whether the message should be retained (or not) + * + * @generated from field: bool retained = 4; + */ + retained: boolean; +}; + +/** + * Describes the message meshtastic.MqttClientProxyMessage. + * Use `create(MqttClientProxyMessageSchema)` to create a new message. + */ +export const MqttClientProxyMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 10); + +/** + * + * A packet envelope sent/received over the mesh + * only payload_variant is sent in the payload portion of the LORA packet. + * The other fields are either not sent at all, or sent in the special 16 byte LORA header. + * + * @generated from message meshtastic.MeshPacket + */ +export type MeshPacket = Message<"meshtastic.MeshPacket"> & { + /** + * + * The sending node number. + * Note: Our crypto implementation uses this field as well. + * See [crypto](/docs/overview/encryption) for details. + * + * @generated from field: fixed32 from = 1; + */ + from: number; + + /** + * + * The (immediate) destination for this packet + * If the value is 4,294,967,295 (maximum value of an unsigned 32bit integer), this indicates that the packet was + * not destined for a specific node, but for a channel as indicated by the value of `channel` below. + * If the value is another, this indicates that the packet was destined for a specific + * node (i.e. a kind of "Direct Message" to this node) and not broadcast on a channel. + * + * @generated from field: fixed32 to = 2; + */ + to: number; + + /** + * + * (Usually) If set, this indicates the index in the secondary_channels table that this packet was sent/received on. + * If unset, packet was on the primary channel. + * A particular node might know only a subset of channels in use on the mesh. + * Therefore channel_index is inherently a local concept and meaningless to send between nodes. + * Very briefly, while sending and receiving deep inside the device Router code, this field instead + * contains the 'channel hash' instead of the index. + * This 'trick' is only used while the payload_variant is an 'encrypted'. + * + * @generated from field: uint32 channel = 3; + */ + channel: number; + + /** + * @generated from oneof meshtastic.MeshPacket.payload_variant + */ + payloadVariant: { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.Data decoded = 4; + */ + value: Data; + case: "decoded"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: bytes encrypted = 5; + */ + value: Uint8Array; + case: "encrypted"; + } | { case: undefined; value?: undefined }; + + /** + * + * A unique ID for this packet. + * Always 0 for no-ack packets or non broadcast packets (and therefore take zero bytes of space). + * Otherwise a unique ID for this packet, useful for flooding algorithms. + * ID only needs to be unique on a _per sender_ basis, and it only + * needs to be unique for a few minutes (long enough to last for the length of + * any ACK or the completion of a mesh broadcast flood). + * Note: Our crypto implementation uses this id as well. + * See [crypto](/docs/overview/encryption) for details. + * + * @generated from field: fixed32 id = 6; + */ + id: number; + + /** + * + * The time this message was received by the esp32 (secs since 1970). + * Note: this field is _never_ sent on the radio link itself (to save space) Times + * are typically not sent over the mesh, but they will be added to any Packet + * (chain of SubPacket) sent to the phone (so the phone can know exact time of reception) + * + * @generated from field: fixed32 rx_time = 7; + */ + rxTime: number; + + /** + * + * *Never* sent over the radio links. + * Set during reception to indicate the SNR of this packet. + * Used to collect statistics on current link quality. + * + * @generated from field: float rx_snr = 8; + */ + rxSnr: number; + + /** + * + * If unset treated as zero (no forwarding, send to direct neighbor nodes only) + * if 1, allow hopping through one node, etc... + * For our usecase real world topologies probably have a max of about 3. + * This field is normally placed into a few of bits in the header. + * + * @generated from field: uint32 hop_limit = 9; + */ + hopLimit: number; + + /** + * + * This packet is being sent as a reliable message, we would prefer it to arrive at the destination. + * We would like to receive a ack packet in response. + * Broadcasts messages treat this flag specially: Since acks for broadcasts would + * rapidly flood the channel, the normal ack behavior is suppressed. + * Instead, the original sender listens to see if at least one node is rebroadcasting this packet (because naive flooding algorithm). + * If it hears that the odds (given typical LoRa topologies) the odds are very high that every node should eventually receive the message. + * So FloodingRouter.cpp generates an implicit ack which is delivered to the original sender. + * If after some time we don't hear anyone rebroadcast our packet, we will timeout and retransmit, using the regular resend logic. + * Note: This flag is normally sent in a flag bit in the header when sent over the wire + * + * @generated from field: bool want_ack = 10; + */ + wantAck: boolean; + + /** + * + * The priority of this message for sending. + * See MeshPacket.Priority description for more details. + * + * @generated from field: meshtastic.MeshPacket.Priority priority = 11; + */ + priority: MeshPacket_Priority; + + /** + * + * rssi of received packet. Only sent to phone for dispay purposes. + * + * @generated from field: int32 rx_rssi = 12; + */ + rxRssi: number; + + /** + * + * Describe if this message is delayed + * + * @generated from field: meshtastic.MeshPacket.Delayed delayed = 13 [deprecated = true]; + * @deprecated + */ + delayed: MeshPacket_Delayed; + + /** + * + * Describes whether this packet passed via MQTT somewhere along the path it currently took. + * + * @generated from field: bool via_mqtt = 14; + */ + viaMqtt: boolean; + + /** + * + * Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header. + * When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled. + * + * @generated from field: uint32 hop_start = 15; + */ + hopStart: number; + + /** + * + * Records the public key the packet was encrypted with, if applicable. + * + * @generated from field: bytes public_key = 16; + */ + publicKey: Uint8Array; + + /** + * + * Indicates whether the packet was en/decrypted using PKI + * + * @generated from field: bool pki_encrypted = 17; + */ + pkiEncrypted: boolean; + + /** + * + * Last byte of the node number of the node that should be used as the next hop in routing. + * Set by the firmware internally, clients are not supposed to set this. + * + * @generated from field: uint32 next_hop = 18; + */ + nextHop: number; + + /** + * + * Last byte of the node number of the node that will relay/relayed this packet. + * Set by the firmware internally, clients are not supposed to set this. + * + * @generated from field: uint32 relay_node = 19; + */ + relayNode: number; + + /** + * + * *Never* sent over the radio links. + * Timestamp after which this packet may be sent. + * Set by the firmware internally, clients are not supposed to set this. + * + * @generated from field: uint32 tx_after = 20; + */ + txAfter: number; + + /** + * + * Indicates which transport mechanism this packet arrived over + * + * @generated from field: meshtastic.MeshPacket.TransportMechanism transport_mechanism = 21; + */ + transportMechanism: MeshPacket_TransportMechanism; + + /** + * + * Indicates whether the packet has a valid signature + * + * @generated from field: bool xeddsa_signed = 22; + */ + xeddsaSigned: boolean; +}; + +/** + * Describes the message meshtastic.MeshPacket. + * Use `create(MeshPacketSchema)` to create a new message. + */ +export const MeshPacketSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 11); + +/** + * + * The priority of this message for sending. + * Higher priorities are sent first (when managing the transmit queue). + * This field is never sent over the air, it is only used internally inside of a local device node. + * API clients (either on the local node or connected directly to the node) + * can set this parameter if necessary. + * (values must be <= 127 to keep protobuf field to one byte in size. + * Detailed background on this field: + * I noticed a funny side effect of lora being so slow: Usually when making + * a protocol there isn’t much need to use message priority to change the order + * of transmission (because interfaces are fairly fast). + * But for lora where packets can take a few seconds each, it is very important + * to make sure that critical packets are sent ASAP. + * In the case of meshtastic that means we want to send protocol acks as soon as possible + * (to prevent unneeded retransmissions), we want routing messages to be sent next, + * then messages marked as reliable and finally 'background' packets like periodic position updates. + * So I bit the bullet and implemented a new (internal - not sent over the air) + * field in MeshPacket called 'priority'. + * And the transmission queue in the router object is now a priority queue. + * + * @generated from enum meshtastic.MeshPacket.Priority + */ +export enum MeshPacket_Priority { + /** + * + * Treated as Priority.DEFAULT + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: MIN = 1; + */ + MIN = 1, + + /** + * + * Background position updates are sent with very low priority - + * if the link is super congested they might not go out at all + * + * @generated from enum value: BACKGROUND = 10; + */ + BACKGROUND = 10, + + /** + * + * This priority is used for most messages that don't have a priority set + * + * @generated from enum value: DEFAULT = 64; + */ + DEFAULT = 64, + + /** + * + * If priority is unset but the message is marked as want_ack, + * assume it is important and use a slightly higher priority + * + * @generated from enum value: RELIABLE = 70; + */ + RELIABLE = 70, + + /** + * + * If priority is unset but the packet is a response to a request, we want it to get there relatively quickly. + * Furthermore, responses stop relaying packets directed to a node early. + * + * @generated from enum value: RESPONSE = 80; + */ + RESPONSE = 80, + + /** + * + * Higher priority for specific message types (portnums) to distinguish between other reliable packets. + * + * @generated from enum value: HIGH = 100; + */ + HIGH = 100, + + /** + * + * Higher priority alert message used for critical alerts which take priority over other reliable packets. + * + * @generated from enum value: ALERT = 110; + */ + ALERT = 110, + + /** + * + * Ack/naks are sent with very high priority to ensure that retransmission + * stops as soon as possible + * + * @generated from enum value: ACK = 120; + */ + ACK = 120, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: MAX = 127; + */ + MAX = 127, +} + +/** + * Describes the enum meshtastic.MeshPacket.Priority. + */ +export const MeshPacket_PrioritySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 11, 0); + +/** + * + * Identify if this is a delayed packet + * + * @generated from enum meshtastic.MeshPacket.Delayed + */ +export enum MeshPacket_Delayed { + /** + * + * If unset, the message is being sent in real time. + * + * @generated from enum value: NO_DELAY = 0; + */ + NO_DELAY = 0, + + /** + * + * The message is delayed and was originally a broadcast + * + * @generated from enum value: DELAYED_BROADCAST = 1; + */ + DELAYED_BROADCAST = 1, + + /** + * + * The message is delayed and was originally a direct message + * + * @generated from enum value: DELAYED_DIRECT = 2; + */ + DELAYED_DIRECT = 2, +} + +/** + * Describes the enum meshtastic.MeshPacket.Delayed. + */ +export const MeshPacket_DelayedSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 11, 1); + +/** + * + * Enum to identify which transport mechanism this packet arrived over + * + * @generated from enum meshtastic.MeshPacket.TransportMechanism + */ +export enum MeshPacket_TransportMechanism { + /** + * + * The default case is that the node generated a packet itself + * + * @generated from enum value: TRANSPORT_INTERNAL = 0; + */ + TRANSPORT_INTERNAL = 0, + + /** + * + * Arrived via the primary LoRa radio + * + * @generated from enum value: TRANSPORT_LORA = 1; + */ + TRANSPORT_LORA = 1, + + /** + * + * Arrived via a secondary LoRa radio + * + * @generated from enum value: TRANSPORT_LORA_ALT1 = 2; + */ + TRANSPORT_LORA_ALT1 = 2, + + /** + * + * Arrived via a tertiary LoRa radio + * + * @generated from enum value: TRANSPORT_LORA_ALT2 = 3; + */ + TRANSPORT_LORA_ALT2 = 3, + + /** + * + * Arrived via a quaternary LoRa radio + * + * @generated from enum value: TRANSPORT_LORA_ALT3 = 4; + */ + TRANSPORT_LORA_ALT3 = 4, + + /** + * + * Arrived via an MQTT connection + * + * @generated from enum value: TRANSPORT_MQTT = 5; + */ + TRANSPORT_MQTT = 5, + + /** + * + * Arrived via Multicast UDP + * + * @generated from enum value: TRANSPORT_MULTICAST_UDP = 6; + */ + TRANSPORT_MULTICAST_UDP = 6, + + /** + * + * Arrived via API connection + * + * @generated from enum value: TRANSPORT_API = 7; + */ + TRANSPORT_API = 7, + + /** + * + * Arrived via Unicast UDP + * + * @generated from enum value: TRANSPORT_UNICAST_UDP = 8; + */ + TRANSPORT_UNICAST_UDP = 8, +} + +/** + * Describes the enum meshtastic.MeshPacket.TransportMechanism. + */ +export const MeshPacket_TransportMechanismSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 11, 2); + +/** + * + * The bluetooth to device link: + * Old BTLE protocol docs from TODO, merge in above and make real docs... + * use protocol buffers, and NanoPB + * messages from device to phone: + * POSITION_UPDATE (..., time) + * TEXT_RECEIVED(from, text, time) + * OPAQUE_RECEIVED(from, payload, time) (for signal messages or other applications) + * messages from phone to device: + * SET_MYID(id, human readable long, human readable short) (send down the unique ID + * string used for this node, a human readable string shown for that id, and a very + * short human readable string suitable for oled screen) SEND_OPAQUE(dest, payload) + * (for signal messages or other applications) SEND_TEXT(dest, text) Get all + * nodes() (returns list of nodes, with full info, last time seen, loc, battery + * level etc) SET_CONFIG (switches device to a new set of radio params and + * preshared key, drops all existing nodes, force our node to rejoin this new group) + * Full information about a node on the mesh + * + * @generated from message meshtastic.NodeInfo + */ +export type NodeInfo = Message<"meshtastic.NodeInfo"> & { + /** + * + * The node number + * + * @generated from field: uint32 num = 1; + */ + num: number; + + /** + * + * The user info for this node + * + * @generated from field: meshtastic.User user = 2; + */ + user?: User | undefined; + + /** + * + * This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true. + * Position.time now indicates the last time we received a POSITION from that node. + * + * @generated from field: meshtastic.Position position = 3; + */ + position?: Position | undefined; + + /** + * + * Returns the Signal-to-noise ratio (SNR) of the last received message, + * as measured by the receiver. Return SNR of the last received message in dB + * + * @generated from field: float snr = 4; + */ + snr: number; + + /** + * + * Set to indicate the last time we received a packet from this node + * + * @generated from field: fixed32 last_heard = 5; + */ + lastHeard: number; + + /** + * + * The latest device metrics for the node. + * + * @generated from field: meshtastic.DeviceMetrics device_metrics = 6; + */ + deviceMetrics?: DeviceMetrics | undefined; + + /** + * + * local channel index we heard that node on. Only populated if its not the default channel. + * + * @generated from field: uint32 channel = 7; + */ + channel: number; + + /** + * + * True if we witnessed the node over MQTT instead of LoRA transport + * + * @generated from field: bool via_mqtt = 8; + */ + viaMqtt: boolean; + + /** + * + * Number of hops away from us this node is (0 if direct neighbor) + * + * @generated from field: optional uint32 hops_away = 9; + */ + hopsAway?: number | undefined; + + /** + * + * True if node is in our favorites list + * Persists between NodeDB internal clean ups + * + * @generated from field: bool is_favorite = 10; + */ + isFavorite: boolean; + + /** + * + * True if node is in our ignored list + * Persists between NodeDB internal clean ups + * + * @generated from field: bool is_ignored = 11; + */ + isIgnored: boolean; + + /** + * + * True if node public key has been verified. + * Persists between NodeDB internal clean ups + * LSB 0 of the bitfield + * + * @generated from field: bool is_key_manually_verified = 12; + */ + isKeyManuallyVerified: boolean; + + /** + * + * True if node has been muted + * Persistes between NodeDB internal clean ups + * + * @generated from field: bool is_muted = 13; + */ + isMuted: boolean; + + /** + * + * True if node is signing its packets via XEdDSA + * Persists between NodeDB internal clean ups + * LSB 1 of the bitfield + * + * @generated from field: bool has_xeddsa_signed = 14; + */ + hasXeddsaSigned: boolean; +}; + +/** + * Describes the message meshtastic.NodeInfo. + * Use `create(NodeInfoSchema)` to create a new message. + */ +export const NodeInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 12); + +/** + * + * Unique local debugging info for this node + * Note: we don't include position or the user info, because that will come in the + * Sent to the phone in response to WantNodes. + * + * @generated from message meshtastic.MyNodeInfo + */ +export type MyNodeInfo = Message<"meshtastic.MyNodeInfo"> & { + /** + * + * Tells the phone what our node number is, default starting value is + * lowbyte of macaddr, but it will be fixed if that is already in use + * + * @generated from field: uint32 my_node_num = 1; + */ + myNodeNum: number; + + /** + * + * The total number of reboots this node has ever encountered + * (well - since the last time we discarded preferences) + * + * @generated from field: uint32 reboot_count = 8; + */ + rebootCount: number; + + /** + * + * The minimum app version that can talk to this device. + * Phone/PC apps should compare this to their build number and if too low tell the user they must update their app + * + * @generated from field: uint32 min_app_version = 11; + */ + minAppVersion: number; + + /** + * + * Unique hardware identifier for this device + * + * @generated from field: bytes device_id = 12; + */ + deviceId: Uint8Array; + + /** + * + * The PlatformIO environment used to build this firmware + * + * @generated from field: string pio_env = 13; + */ + pioEnv: string; + + /** + * + * The indicator for whether this device is running event firmware and which + * + * @generated from field: meshtastic.FirmwareEdition firmware_edition = 14; + */ + firmwareEdition: FirmwareEdition; + + /** + * + * The number of nodes in the nodedb. + * This is used by the phone to know how many NodeInfo packets to expect on want_config + * + * @generated from field: uint32 nodedb_count = 15; + */ + nodedbCount: number; +}; + +/** + * Describes the message meshtastic.MyNodeInfo. + * Use `create(MyNodeInfoSchema)` to create a new message. + */ +export const MyNodeInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 13); + +/** + * + * Debug output from the device. + * To minimize the size of records inside the device code, if a time/source/level is not set + * on the message it is assumed to be a continuation of the previously sent message. + * This allows the device code to use fixed maxlen 64 byte strings for messages, + * and then extend as needed by emitting multiple records. + * + * @generated from message meshtastic.LogRecord + */ +export type LogRecord = Message<"meshtastic.LogRecord"> & { + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from field: string message = 1; + */ + message: string; + + /** + * + * Seconds since 1970 - or 0 for unknown/unset + * + * @generated from field: fixed32 time = 2; + */ + time: number; + + /** + * + * Usually based on thread name - if known + * + * @generated from field: string source = 3; + */ + source: string; + + /** + * + * Not yet set + * + * @generated from field: meshtastic.LogRecord.Level level = 4; + */ + level: LogRecord_Level; +}; + +/** + * Describes the message meshtastic.LogRecord. + * Use `create(LogRecordSchema)` to create a new message. + */ +export const LogRecordSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 14); + +/** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum meshtastic.LogRecord.Level + */ +export enum LogRecord_Level { + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: CRITICAL = 50; + */ + CRITICAL = 50, + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: ERROR = 40; + */ + ERROR = 40, + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: WARNING = 30; + */ + WARNING = 30, + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: INFO = 20; + */ + INFO = 20, + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: DEBUG = 10; + */ + DEBUG = 10, + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from enum value: TRACE = 5; + */ + TRACE = 5, +} + +/** + * Describes the enum meshtastic.LogRecord.Level. + */ +export const LogRecord_LevelSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 14, 0); + +/** + * @generated from message meshtastic.QueueStatus + */ +export type QueueStatus = Message<"meshtastic.QueueStatus"> & { + /** + * Last attempt to queue status, ErrorCode + * + * @generated from field: int32 res = 1; + */ + res: number; + + /** + * Free entries in the outgoing queue + * + * @generated from field: uint32 free = 2; + */ + free: number; + + /** + * Maximum entries in the outgoing queue + * + * @generated from field: uint32 maxlen = 3; + */ + maxlen: number; + + /** + * What was mesh packet id that generated this response? + * + * @generated from field: uint32 mesh_packet_id = 4; + */ + meshPacketId: number; +}; + +/** + * Describes the message meshtastic.QueueStatus. + * Use `create(QueueStatusSchema)` to create a new message. + */ +export const QueueStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 15); + +/** + * + * Packets from the radio to the phone will appear on the fromRadio characteristic. + * It will support READ and NOTIFY. When a new packet arrives the device will BLE notify? + * It will sit in that descriptor until consumed by the phone, + * at which point the next item in the FIFO will be populated. + * + * @generated from message meshtastic.FromRadio + */ +export type FromRadio = Message<"meshtastic.FromRadio"> & { + /** + * + * The packet id, used to allow the phone to request missing read packets from the FIFO, + * see our bluetooth docs + * + * @generated from field: uint32 id = 1; + */ + id: number; + + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from oneof meshtastic.FromRadio.payload_variant + */ + payloadVariant: { + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from field: meshtastic.MeshPacket packet = 2; + */ + value: MeshPacket; + case: "packet"; + } | { + /** + * + * Tells the phone what our node number is, can be -1 if we've not yet joined a mesh. + * NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. + * + * @generated from field: meshtastic.MyNodeInfo my_info = 3; + */ + value: MyNodeInfo; + case: "myInfo"; + } | { + /** + * + * One packet is sent for each node in the on radio DB + * starts over with the first node in our DB + * + * @generated from field: meshtastic.NodeInfo node_info = 4; + */ + value: NodeInfo; + case: "nodeInfo"; + } | { + /** + * + * Include a part of the config (was: RadioConfig radio) + * + * @generated from field: meshtastic.Config config = 5; + */ + value: Config; + case: "config"; + } | { + /** + * + * Set to send debug console output over our protobuf stream + * + * @generated from field: meshtastic.LogRecord log_record = 6; + */ + value: LogRecord; + case: "logRecord"; + } | { + /** + * + * Sent as true once the device has finished sending all of the responses to want_config + * recipient should check if this ID matches our original request nonce, if + * not, it means your config responses haven't started yet. + * NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. + * + * @generated from field: uint32 config_complete_id = 7; + */ + value: number; + case: "configCompleteId"; + } | { + /** + * + * Sent to tell clients the radio has just rebooted. + * Set to true if present. + * Not used on all transports, currently just used for the serial console. + * NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. + * + * @generated from field: bool rebooted = 8; + */ + value: boolean; + case: "rebooted"; + } | { + /** + * + * Include module config + * + * @generated from field: meshtastic.ModuleConfig moduleConfig = 9; + */ + value: ModuleConfig; + case: "moduleConfig"; + } | { + /** + * + * One packet is sent for each channel + * + * @generated from field: meshtastic.Channel channel = 10; + */ + value: Channel; + case: "channel"; + } | { + /** + * + * Queue status info + * + * @generated from field: meshtastic.QueueStatus queueStatus = 11; + */ + value: QueueStatus; + case: "queueStatus"; + } | { + /** + * + * File Transfer Chunk + * + * @generated from field: meshtastic.XModem xmodemPacket = 12; + */ + value: XModem; + case: "xmodemPacket"; + } | { + /** + * + * Device metadata message + * + * @generated from field: meshtastic.DeviceMetadata metadata = 13; + */ + value: DeviceMetadata; + case: "metadata"; + } | { + /** + * + * MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT) + * + * @generated from field: meshtastic.MqttClientProxyMessage mqttClientProxyMessage = 14; + */ + value: MqttClientProxyMessage; + case: "mqttClientProxyMessage"; + } | { + /** + * + * File system manifest messages + * + * @generated from field: meshtastic.FileInfo fileInfo = 15; + */ + value: FileInfo; + case: "fileInfo"; + } | { + /** + * + * Notification message to the client + * + * @generated from field: meshtastic.ClientNotification clientNotification = 16; + */ + value: ClientNotification; + case: "clientNotification"; + } | { + /** + * + * Persistent data for device-ui + * + * @generated from field: meshtastic.DeviceUIConfig deviceuiConfig = 17; + */ + value: DeviceUIConfig; + case: "deviceuiConfig"; + } | { + /** + * + * Lockdown state notification for hardened firmware builds. + * Sent post-config (so unauthorized clients learn they must + * provision/unlock) and after each LockdownAuth admin command + * to report success or failure. Replaces the earlier scheme of + * encoding state as magic-string prefixes inside ClientNotification. + * + * @generated from field: meshtastic.LockdownStatus lockdown_status = 18; + */ + value: LockdownStatus; + case: "lockdownStatus"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.FromRadio. + * Use `create(FromRadioSchema)` to create a new message. + */ +export const FromRadioSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 16); + +/** + * + * Lockdown state report from firmware to client (for hardened builds + * with MESHTASTIC_LOCKDOWN). Sent immediately after config_complete_id + * to inform a freshly-connected unauthorized client what it must do, + * and again in response to each LockdownAuth admin command. + * + * @generated from message meshtastic.LockdownStatus + */ +export type LockdownStatus = Message<"meshtastic.LockdownStatus"> & { + /** + * Current lockdown state being reported. + * + * @generated from field: meshtastic.LockdownStatus.State state = 1; + */ + state: LockdownStatus_State; + + /** + * + * For LOCKED: machine-readable reason. Known values: + * "needs_auth" — storage already unlocked, client must auth + * "token_missing" — no boot token on flash + * "token_expired" — boot token wall-clock TTL elapsed + * "token_boots_zero" — boot token boot-count TTL exhausted + * "token_hmac_fail" — token tampered or wrong device + * "token_dek_fail" — token DEK decrypt failed + * "token_wrong_size" — token file corrupted + * "token_bad_magic" — token file corrupted + * "not_provisioned" — should generally use NEEDS_PROVISION state instead + * Other values may be added; clients should treat unknown values as + * "locked, ask for passphrase". + * + * @generated from field: string lock_reason = 2; + */ + lockReason: string; + + /** + * + * For UNLOCKED: remaining boots on the issued session token. + * Decrements by 1 on each subsequent boot. + * + * @generated from field: uint32 boots_remaining = 3; + */ + bootsRemaining: number; + + /** + * + * For UNLOCKED: wall-clock expiry of the issued session token, + * absolute Unix-epoch seconds. 0 = no time limit. + * + * @generated from field: uint32 valid_until_epoch = 4; + */ + validUntilEpoch: number; + + /** + * + * For UNLOCK_FAILED: seconds the client must wait before another + * passphrase attempt will be accepted. 0 = wrong passphrase, no + * backoff (immediate retry allowed but advisable to prompt user). + * + * @generated from field: uint32 backoff_seconds = 5; + */ + backoffSeconds: number; +}; + +/** + * Describes the message meshtastic.LockdownStatus. + * Use `create(LockdownStatusSchema)` to create a new message. + */ +export const LockdownStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 17); + +/** + * @generated from enum meshtastic.LockdownStatus.State + */ +export enum LockdownStatus_State { + /** + * Default; should not be sent. + * + * @generated from enum value: STATE_UNSPECIFIED = 0; + */ + STATE_UNSPECIFIED = 0, + + /** + * + * No passphrase has ever been provisioned on this device. + * Client should prompt the operator to set one. + * + * @generated from enum value: NEEDS_PROVISION = 1; + */ + NEEDS_PROVISION = 1, + + /** + * + * Storage is locked or this client has not authenticated yet. + * lock_reason carries a machine-readable detail string. + * Client should present (or auto-replay) a passphrase via + * AdminMessage.lockdown_auth. + * + * @generated from enum value: LOCKED = 2; + */ + LOCKED = 2, + + /** + * + * Passphrase accepted; client is now authorized for this connection. + * boots_remaining and valid_until_epoch describe the active session + * token's TTL. + * + * @generated from enum value: UNLOCKED = 3; + */ + UNLOCKED = 3, + + /** + * + * Passphrase rejected. backoff_seconds is non-zero when rate-limited. + * + * @generated from enum value: UNLOCK_FAILED = 4; + */ + UNLOCK_FAILED = 4, + + /** + * + * Lockdown is supported by this firmware but not currently active + * (no passphrase has been provisioned, or it was disabled via + * AdminMessage.lockdown_auth.disable). The device is operating in + * normal, non-encrypted mode. Clients render the lockdown-mode + * toggle as OFF on receiving this. Distinct from NEEDS_PROVISION, + * which is only used during an in-progress enable flow. + * + * @generated from enum value: DISABLED = 5; + */ + DISABLED = 5, +} + +/** + * Describes the enum meshtastic.LockdownStatus.State. + */ +export const LockdownStatus_StateSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 17, 0); + +/** + * + * A notification message from the device to the client + * To be used for important messages that should to be displayed to the user + * in the form of push notifications or validation messages when saving + * invalid configuration. + * + * @generated from message meshtastic.ClientNotification + */ +export type ClientNotification = Message<"meshtastic.ClientNotification"> & { + /** + * + * The id of the packet we're notifying in response to + * + * @generated from field: optional uint32 reply_id = 1; + */ + replyId?: number | undefined; + + /** + * + * Seconds since 1970 - or 0 for unknown/unset + * + * @generated from field: fixed32 time = 2; + */ + time: number; + + /** + * + * The level type of notification + * + * @generated from field: meshtastic.LogRecord.Level level = 3; + */ + level: LogRecord_Level; + + /** + * + * The message body of the notification + * + * @generated from field: string message = 4; + */ + message: string; + + /** + * @generated from oneof meshtastic.ClientNotification.payload_variant + */ + payloadVariant: { + /** + * @generated from field: meshtastic.KeyVerificationNumberInform key_verification_number_inform = 11; + */ + value: KeyVerificationNumberInform; + case: "keyVerificationNumberInform"; + } | { + /** + * @generated from field: meshtastic.KeyVerificationNumberRequest key_verification_number_request = 12; + */ + value: KeyVerificationNumberRequest; + case: "keyVerificationNumberRequest"; + } | { + /** + * @generated from field: meshtastic.KeyVerificationFinal key_verification_final = 13; + */ + value: KeyVerificationFinal; + case: "keyVerificationFinal"; + } | { + /** + * @generated from field: meshtastic.DuplicatedPublicKey duplicated_public_key = 14; + */ + value: DuplicatedPublicKey; + case: "duplicatedPublicKey"; + } | { + /** + * @generated from field: meshtastic.LowEntropyKey low_entropy_key = 15; + */ + value: LowEntropyKey; + case: "lowEntropyKey"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.ClientNotification. + * Use `create(ClientNotificationSchema)` to create a new message. + */ +export const ClientNotificationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 18); + +/** + * @generated from message meshtastic.KeyVerificationNumberInform + */ +export type KeyVerificationNumberInform = Message<"meshtastic.KeyVerificationNumberInform"> & { + /** + * @generated from field: uint64 nonce = 1; + */ + nonce: bigint; + + /** + * @generated from field: string remote_longname = 2; + */ + remoteLongname: string; + + /** + * @generated from field: uint32 security_number = 3; + */ + securityNumber: number; +}; + +/** + * Describes the message meshtastic.KeyVerificationNumberInform. + * Use `create(KeyVerificationNumberInformSchema)` to create a new message. + */ +export const KeyVerificationNumberInformSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 19); + +/** + * @generated from message meshtastic.KeyVerificationNumberRequest + */ +export type KeyVerificationNumberRequest = Message<"meshtastic.KeyVerificationNumberRequest"> & { + /** + * @generated from field: uint64 nonce = 1; + */ + nonce: bigint; + + /** + * @generated from field: string remote_longname = 2; + */ + remoteLongname: string; +}; + +/** + * Describes the message meshtastic.KeyVerificationNumberRequest. + * Use `create(KeyVerificationNumberRequestSchema)` to create a new message. + */ +export const KeyVerificationNumberRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 20); + +/** + * @generated from message meshtastic.KeyVerificationFinal + */ +export type KeyVerificationFinal = Message<"meshtastic.KeyVerificationFinal"> & { + /** + * @generated from field: uint64 nonce = 1; + */ + nonce: bigint; + + /** + * @generated from field: string remote_longname = 2; + */ + remoteLongname: string; + + /** + * @generated from field: bool isSender = 3; + */ + isSender: boolean; + + /** + * @generated from field: string verification_characters = 4; + */ + verificationCharacters: string; +}; + +/** + * Describes the message meshtastic.KeyVerificationFinal. + * Use `create(KeyVerificationFinalSchema)` to create a new message. + */ +export const KeyVerificationFinalSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 21); + +/** + * @generated from message meshtastic.DuplicatedPublicKey + */ +export type DuplicatedPublicKey = Message<"meshtastic.DuplicatedPublicKey"> & { +}; + +/** + * Describes the message meshtastic.DuplicatedPublicKey. + * Use `create(DuplicatedPublicKeySchema)` to create a new message. + */ +export const DuplicatedPublicKeySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 22); + +/** + * @generated from message meshtastic.LowEntropyKey + */ +export type LowEntropyKey = Message<"meshtastic.LowEntropyKey"> & { +}; + +/** + * Describes the message meshtastic.LowEntropyKey. + * Use `create(LowEntropyKeySchema)` to create a new message. + */ +export const LowEntropyKeySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 23); + +/** + * + * Individual File info for the device + * + * @generated from message meshtastic.FileInfo + */ +export type FileInfo = Message<"meshtastic.FileInfo"> & { + /** + * + * The fully qualified path of the file + * + * @generated from field: string file_name = 1; + */ + fileName: string; + + /** + * + * The size of the file in bytes + * + * @generated from field: uint32 size_bytes = 2; + */ + sizeBytes: number; +}; + +/** + * Describes the message meshtastic.FileInfo. + * Use `create(FileInfoSchema)` to create a new message. + */ +export const FileInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 24); + +/** + * + * Packets/commands to the radio will be written (reliably) to the toRadio characteristic. + * Once the write completes the phone can assume it is handled. + * + * @generated from message meshtastic.ToRadio + */ +export type ToRadio = Message<"meshtastic.ToRadio"> & { + /** + * + * Log levels, chosen to match python logging conventions. + * + * @generated from oneof meshtastic.ToRadio.payload_variant + */ + payloadVariant: { + /** + * + * Send this packet on the mesh + * + * @generated from field: meshtastic.MeshPacket packet = 1; + */ + value: MeshPacket; + case: "packet"; + } | { + /** + * + * Phone wants radio to send full node db to the phone, This is + * typically the first packet sent to the radio when the phone gets a + * bluetooth connection. The radio will respond by sending back a + * MyNodeInfo, a owner, a radio config and a series of + * FromRadio.node_infos, and config_complete + * the integer you write into this field will be reported back in the + * config_complete_id response this allows clients to never be confused by + * a stale old partially sent config. + * + * @generated from field: uint32 want_config_id = 3; + */ + value: number; + case: "wantConfigId"; + } | { + /** + * + * Tell API server we are disconnecting now. + * This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link. + * (Sending this message is optional for clients) + * + * @generated from field: bool disconnect = 4; + */ + value: boolean; + case: "disconnect"; + } | { + /** + * @generated from field: meshtastic.XModem xmodemPacket = 5; + */ + value: XModem; + case: "xmodemPacket"; + } | { + /** + * + * MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device) + * + * @generated from field: meshtastic.MqttClientProxyMessage mqttClientProxyMessage = 6; + */ + value: MqttClientProxyMessage; + case: "mqttClientProxyMessage"; + } | { + /** + * + * Heartbeat message (used to keep the device connection awake on serial) + * + * @generated from field: meshtastic.Heartbeat heartbeat = 7; + */ + value: Heartbeat; + case: "heartbeat"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.ToRadio. + * Use `create(ToRadioSchema)` to create a new message. + */ +export const ToRadioSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 25); + +/** + * + * Compressed message payload + * + * @generated from message meshtastic.Compressed + */ +export type Compressed = Message<"meshtastic.Compressed"> & { + /** + * + * PortNum to determine the how to handle the compressed payload. + * + * @generated from field: meshtastic.PortNum portnum = 1; + */ + portnum: PortNum; + + /** + * + * Compressed data. + * + * @generated from field: bytes data = 2; + */ + data: Uint8Array; +}; + +/** + * Describes the message meshtastic.Compressed. + * Use `create(CompressedSchema)` to create a new message. + */ +export const CompressedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 26); + +/** + * + * Full info on edges for a single node + * + * @generated from message meshtastic.NeighborInfo + */ +export type NeighborInfo = Message<"meshtastic.NeighborInfo"> & { + /** + * + * The node ID of the node sending info on its neighbors + * + * @generated from field: uint32 node_id = 1; + */ + nodeId: number; + + /** + * + * Field to pass neighbor info for the next sending cycle + * + * @generated from field: uint32 last_sent_by_id = 2; + */ + lastSentById: number; + + /** + * + * Broadcast interval of the represented node (in seconds) + * + * @generated from field: uint32 node_broadcast_interval_secs = 3; + */ + nodeBroadcastIntervalSecs: number; + + /** + * + * The list of out edges from this node + * + * @generated from field: repeated meshtastic.Neighbor neighbors = 4; + */ + neighbors: Neighbor[]; +}; + +/** + * Describes the message meshtastic.NeighborInfo. + * Use `create(NeighborInfoSchema)` to create a new message. + */ +export const NeighborInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 27); + +/** + * + * A single edge in the mesh + * + * @generated from message meshtastic.Neighbor + */ +export type Neighbor = Message<"meshtastic.Neighbor"> & { + /** + * + * Node ID of neighbor + * + * @generated from field: uint32 node_id = 1; + */ + nodeId: number; + + /** + * + * SNR of last heard message + * + * @generated from field: float snr = 2; + */ + snr: number; + + /** + * + * Reception time (in secs since 1970) of last message that was last sent by this ID. + * Note: this is for local storage only and will not be sent out over the mesh. + * + * @generated from field: fixed32 last_rx_time = 3; + */ + lastRxTime: number; + + /** + * + * Broadcast interval of this neighbor (in seconds). + * Note: this is for local storage only and will not be sent out over the mesh. + * + * @generated from field: uint32 node_broadcast_interval_secs = 4; + */ + nodeBroadcastIntervalSecs: number; +}; + +/** + * Describes the message meshtastic.Neighbor. + * Use `create(NeighborSchema)` to create a new message. + */ +export const NeighborSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 28); + +/** + * + * Device metadata response + * + * @generated from message meshtastic.DeviceMetadata + */ +export type DeviceMetadata = Message<"meshtastic.DeviceMetadata"> & { + /** + * + * Device firmware version string + * + * @generated from field: string firmware_version = 1; + */ + firmwareVersion: string; + + /** + * + * Device state version + * + * @generated from field: uint32 device_state_version = 2; + */ + deviceStateVersion: number; + + /** + * + * Indicates whether the device can shutdown CPU natively or via power management chip + * + * @generated from field: bool canShutdown = 3; + */ + canShutdown: boolean; + + /** + * + * Indicates that the device has native wifi capability + * + * @generated from field: bool hasWifi = 4; + */ + hasWifi: boolean; + + /** + * + * Indicates that the device has native bluetooth capability + * + * @generated from field: bool hasBluetooth = 5; + */ + hasBluetooth: boolean; + + /** + * + * Indicates that the device has an ethernet peripheral + * + * @generated from field: bool hasEthernet = 6; + */ + hasEthernet: boolean; + + /** + * + * Indicates that the device's role in the mesh + * + * @generated from field: meshtastic.Config.DeviceConfig.Role role = 7; + */ + role: Config_DeviceConfig_Role; + + /** + * + * Indicates the device's current enabled position flags + * + * @generated from field: uint32 position_flags = 8; + */ + positionFlags: number; + + /** + * + * Device hardware model + * + * @generated from field: meshtastic.HardwareModel hw_model = 9; + */ + hwModel: HardwareModel; + + /** + * + * Has Remote Hardware enabled + * + * @generated from field: bool hasRemoteHardware = 10; + */ + hasRemoteHardware: boolean; + + /** + * + * Has PKC capabilities + * + * @generated from field: bool hasPKC = 11; + */ + hasPKC: boolean; + + /** + * + * Bit field of boolean for excluded modules + * (bitwise OR of ExcludedModules) + * + * @generated from field: uint32 excluded_modules = 12; + */ + excludedModules: number; +}; + +/** + * Describes the message meshtastic.DeviceMetadata. + * Use `create(DeviceMetadataSchema)` to create a new message. + */ +export const DeviceMetadataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 29); + +/** + * + * A heartbeat message is sent to the node from the client to keep the connection alive. + * This is currently only needed to keep serial connections alive, but can be used by any PhoneAPI. + * + * @generated from message meshtastic.Heartbeat + */ +export type Heartbeat = Message<"meshtastic.Heartbeat"> & { + /** + * + * The nonce of the heartbeat message + * + * @generated from field: uint32 nonce = 1; + */ + nonce: number; +}; + +/** + * Describes the message meshtastic.Heartbeat. + * Use `create(HeartbeatSchema)` to create a new message. + */ +export const HeartbeatSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 30); + +/** + * + * RemoteHardwarePins associated with a node + * + * @generated from message meshtastic.NodeRemoteHardwarePin + */ +export type NodeRemoteHardwarePin = Message<"meshtastic.NodeRemoteHardwarePin"> & { + /** + * + * The node_num exposing the available gpio pin + * + * @generated from field: uint32 node_num = 1; + */ + nodeNum: number; + + /** + * + * The the available gpio pin for usage with RemoteHardware module + * + * @generated from field: meshtastic.RemoteHardwarePin pin = 2; + */ + pin?: RemoteHardwarePin | undefined; +}; + +/** + * Describes the message meshtastic.NodeRemoteHardwarePin. + * Use `create(NodeRemoteHardwarePinSchema)` to create a new message. + */ +export const NodeRemoteHardwarePinSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 31); + +/** + * @generated from message meshtastic.ChunkedPayload + */ +export type ChunkedPayload = Message<"meshtastic.ChunkedPayload"> & { + /** + * + * The ID of the entire payload + * + * @generated from field: uint32 payload_id = 1; + */ + payloadId: number; + + /** + * + * The total number of chunks in the payload + * + * @generated from field: uint32 chunk_count = 2; + */ + chunkCount: number; + + /** + * + * The current chunk index in the total + * + * @generated from field: uint32 chunk_index = 3; + */ + chunkIndex: number; + + /** + * + * The binary data of the current chunk + * + * @generated from field: bytes payload_chunk = 4; + */ + payloadChunk: Uint8Array; +}; + +/** + * Describes the message meshtastic.ChunkedPayload. + * Use `create(ChunkedPayloadSchema)` to create a new message. + */ +export const ChunkedPayloadSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 32); + +/** + * + * Wrapper message for broken repeated oneof support + * + * @generated from message meshtastic.resend_chunks + */ +export type resend_chunks = Message<"meshtastic.resend_chunks"> & { + /** + * @generated from field: repeated uint32 chunks = 1; + */ + chunks: number[]; +}; + +/** + * Describes the message meshtastic.resend_chunks. + * Use `create(resend_chunksSchema)` to create a new message. + */ +export const resend_chunksSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 33); + +/** + * + * Responses to a ChunkedPayload request + * + * @generated from message meshtastic.ChunkedPayloadResponse + */ +export type ChunkedPayloadResponse = Message<"meshtastic.ChunkedPayloadResponse"> & { + /** + * + * The ID of the entire payload + * + * @generated from field: uint32 payload_id = 1; + */ + payloadId: number; + + /** + * @generated from oneof meshtastic.ChunkedPayloadResponse.payload_variant + */ + payloadVariant: { + /** + * + * Request to transfer chunked payload + * + * @generated from field: bool request_transfer = 2; + */ + value: boolean; + case: "requestTransfer"; + } | { + /** + * + * Accept the transfer chunked payload + * + * @generated from field: bool accept_transfer = 3; + */ + value: boolean; + case: "acceptTransfer"; + } | { + /** + * + * Request missing indexes in the chunked payload + * + * @generated from field: meshtastic.resend_chunks resend_chunks = 4; + */ + value: resend_chunks; + case: "resendChunks"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.ChunkedPayloadResponse. + * Use `create(ChunkedPayloadResponseSchema)` to create a new message. + */ +export const ChunkedPayloadResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mesh, 34); + +/** + * + * Note: these enum names must EXACTLY match the string used in the device + * bin/build-all.sh script. + * Because they will be used to find firmware filenames in the android app for OTA updates. + * To match the old style filenames, _ is converted to -, p is converted to . + * + * @generated from enum meshtastic.HardwareModel + */ +export enum HardwareModel { + /** + * + * TODO: REPLACE + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TLORA_V2 = 1; + */ + TLORA_V2 = 1, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TLORA_V1 = 2; + */ + TLORA_V1 = 2, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TLORA_V2_1_1P6 = 3; + */ + TLORA_V2_1_1P6 = 3, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TBEAM = 4; + */ + TBEAM = 4, + + /** + * + * The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13 + * (see HELTEC_V2 for the new version). + * + * @generated from enum value: HELTEC_V2_0 = 5; + */ + HELTEC_V2_0 = 5, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TBEAM_V0P7 = 6; + */ + TBEAM_V0P7 = 6, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: T_ECHO = 7; + */ + T_ECHO = 7, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TLORA_V1_1P3 = 8; + */ + TLORA_V1_1P3 = 8, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: RAK4631 = 9; + */ + RAK4631 = 9, + + /** + * + * The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37. + * Sadly they did not update anything on the silkscreen to identify this board + * + * @generated from enum value: HELTEC_V2_1 = 10; + */ + HELTEC_V2_1 = 10, + + /** + * + * Ancient heltec WiFi_Lora_32 board + * + * @generated from enum value: HELTEC_V1 = 11; + */ + HELTEC_V1 = 11, + + /** + * + * New T-BEAM with ESP32-S3 CPU + * + * @generated from enum value: LILYGO_TBEAM_S3_CORE = 12; + */ + LILYGO_TBEAM_S3_CORE = 12, + + /** + * + * RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/ + * + * @generated from enum value: RAK11200 = 13; + */ + RAK11200 = 13, + + /** + * + * B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano + * + * @generated from enum value: NANO_G1 = 14; + */ + NANO_G1 = 14, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TLORA_V2_1_1P8 = 15; + */ + TLORA_V2_1_1P8 = 15, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: TLORA_T3_S3 = 16; + */ + TLORA_T3_S3 = 16, + + /** + * + * B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer + * + * @generated from enum value: NANO_G1_EXPLORER = 17; + */ + NANO_G1_EXPLORER = 17, + + /** + * + * B&Q Consulting Nano G2 Ultra: https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra + * + * @generated from enum value: NANO_G2_ULTRA = 18; + */ + NANO_G2_ULTRA = 18, + + /** + * + * LoRAType device: https://loratype.org/ + * + * @generated from enum value: LORA_TYPE = 19; + */ + LORA_TYPE = 19, + + /** + * + * wiphone https://www.wiphone.io/ + * + * @generated from enum value: WIPHONE = 20; + */ + WIPHONE = 20, + + /** + * + * WIO Tracker WM1110 family from Seeed Studio. Includes wio-1110-tracker and wio-1110-sdk + * + * @generated from enum value: WIO_WM1110 = 21; + */ + WIO_WM1110 = 21, + + /** + * + * RAK2560 Solar base station based on RAK4630 + * + * @generated from enum value: RAK2560 = 22; + */ + RAK2560 = 22, + + /** + * + * Heltec HRU-3601: https://heltec.org/project/hru-3601/ + * + * @generated from enum value: HELTEC_HRU_3601 = 23; + */ + HELTEC_HRU_3601 = 23, + + /** + * + * Heltec Wireless Bridge + * + * @generated from enum value: HELTEC_WIRELESS_BRIDGE = 24; + */ + HELTEC_WIRELESS_BRIDGE = 24, + + /** + * + * B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station + * + * @generated from enum value: STATION_G1 = 25; + */ + STATION_G1 = 25, + + /** + * + * RAK11310 (RP2040 + SX1262) + * + * @generated from enum value: RAK11310 = 26; + */ + RAK11310 = 26, + + /** + * + * Makerfabs SenseLoRA Receiver (RP2040 + RFM96) + * + * @generated from enum value: SENSELORA_RP2040 = 27; + */ + SENSELORA_RP2040 = 27, + + /** + * + * Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96) + * + * @generated from enum value: SENSELORA_S3 = 28; + */ + SENSELORA_S3 = 28, + + /** + * + * Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone + * + * @generated from enum value: CANARYONE = 29; + */ + CANARYONE = 29, + + /** + * + * Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm + * + * @generated from enum value: RP2040_LORA = 30; + */ + RP2040_LORA = 30, + + /** + * + * B&Q Consulting Station G2: https://wiki.uniteng.com/en/meshtastic/station-g2 + * + * @generated from enum value: STATION_G2 = 31; + */ + STATION_G2 = 31, + + /** + * + * --------------------------------------------------------------------------- + * Less common/prototype boards listed here (needs one more byte over the air) + * --------------------------------------------------------------------------- + * + * @generated from enum value: LORA_RELAY_V1 = 32; + */ + LORA_RELAY_V1 = 32, + + /** + * + * T-Echo Plus device from LilyGo + * + * @generated from enum value: T_ECHO_PLUS = 33; + */ + T_ECHO_PLUS = 33, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: PPR = 34; + */ + PPR = 34, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: GENIEBLOCKS = 35; + */ + GENIEBLOCKS = 35, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: NRF52_UNKNOWN = 36; + */ + NRF52_UNKNOWN = 36, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: PORTDUINO = 37; + */ + PORTDUINO = 37, + + /** + * + * The simulator built into the android app + * + * @generated from enum value: ANDROID_SIM = 38; + */ + ANDROID_SIM = 38, + + /** + * + * Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics + * + * @generated from enum value: DIY_V1 = 39; + */ + DIY_V1 = 39, + + /** + * + * nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/ + * + * @generated from enum value: NRF52840_PCA10059 = 40; + */ + NRF52840_PCA10059 = 40, + + /** + * + * Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3 + * + * @generated from enum value: DR_DEV = 41; + */ + DR_DEV = 41, + + /** + * + * M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ + * + * @generated from enum value: M5STACK = 42; + */ + M5STACK = 42, + + /** + * + * New Heltec LoRA32 with ESP32-S3 CPU + * + * @generated from enum value: HELTEC_V3 = 43; + */ + HELTEC_V3 = 43, + + /** + * + * New Heltec Wireless Stick Lite with ESP32-S3 CPU + * + * @generated from enum value: HELTEC_WSL_V3 = 44; + */ + HELTEC_WSL_V3 = 44, + + /** + * + * New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU + * + * @generated from enum value: BETAFPV_2400_TX = 45; + */ + BETAFPV_2400_TX = 45, + + /** + * + * BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU + * + * @generated from enum value: BETAFPV_900_NANO_TX = 46; + */ + BETAFPV_900_NANO_TX = 46, + + /** + * + * Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module + * + * @generated from enum value: RPI_PICO = 47; + */ + RPI_PICO = 47, + + /** + * + * Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT + * Newer V1.1, version is written on the PCB near the display. + * + * @generated from enum value: HELTEC_WIRELESS_TRACKER = 48; + */ + HELTEC_WIRELESS_TRACKER = 48, + + /** + * + * Heltec Wireless Paper with ESP32-S3 CPU and E-Ink display + * + * @generated from enum value: HELTEC_WIRELESS_PAPER = 49; + */ + HELTEC_WIRELESS_PAPER = 49, + + /** + * + * LilyGo T-Deck with ESP32-S3 CPU, Keyboard and IPS display + * + * @generated from enum value: T_DECK = 50; + */ + T_DECK = 50, + + /** + * + * LilyGo T-Watch S3 with ESP32-S3 CPU and IPS display + * + * @generated from enum value: T_WATCH_S3 = 51; + */ + T_WATCH_S3 = 51, + + /** + * + * Bobricius Picomputer with ESP32-S3 CPU, Keyboard and IPS display + * + * @generated from enum value: PICOMPUTER_S3 = 52; + */ + PICOMPUTER_S3 = 52, + + /** + * + * Heltec HT-CT62 with ESP32-C3 CPU and SX1262 LoRa + * + * @generated from enum value: HELTEC_HT62 = 53; + */ + HELTEC_HT62 = 53, + + /** + * + * EBYTE SPI LoRa module and ESP32-S3 + * + * @generated from enum value: EBYTE_ESP32_S3 = 54; + */ + EBYTE_ESP32_S3 = 54, + + /** + * + * Waveshare ESP32-S3-PICO with PICO LoRa HAT and 2.9inch e-Ink + * + * @generated from enum value: ESP32_S3_PICO = 55; + */ + ESP32_S3_PICO = 55, + + /** + * + * CircuitMess Chatter 2 LLCC68 Lora Module and ESP32 Wroom + * Lora module can be swapped out for a Heltec RA-62 which is "almost" pin compatible + * with one cut and one jumper Meshtastic works + * + * @generated from enum value: CHATTER_2 = 56; + */ + CHATTER_2 = 56, + + /** + * + * Heltec Wireless Paper, With ESP32-S3 CPU and E-Ink display + * Older "V1.0" Variant, has no "version sticker" + * E-Ink model is DEPG0213BNS800 + * Tab on the screen protector is RED + * Flex connector marking is FPC-7528B + * + * @generated from enum value: HELTEC_WIRELESS_PAPER_V1_0 = 57; + */ + HELTEC_WIRELESS_PAPER_V1_0 = 57, + + /** + * + * Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT + * Older "V1.0" Variant + * + * @generated from enum value: HELTEC_WIRELESS_TRACKER_V1_0 = 58; + */ + HELTEC_WIRELESS_TRACKER_V1_0 = 58, + + /** + * + * unPhone with ESP32-S3, TFT touchscreen, LSM6DS3TR-C accelerometer and gyroscope + * + * @generated from enum value: UNPHONE = 59; + */ + UNPHONE = 59, + + /** + * + * Teledatics TD-LORAC NRF52840 based M.2 LoRA module + * Compatible with the TD-WRLS development board + * + * @generated from enum value: TD_LORAC = 60; + */ + TD_LORAC = 60, + + /** + * + * CDEBYTE EoRa-S3 board using their own MM modules, clone of LILYGO T3S3 + * + * @generated from enum value: CDEBYTE_EORA_S3 = 61; + */ + CDEBYTE_EORA_S3 = 61, + + /** + * + * TWC_MESH_V4 + * Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS + * + * @generated from enum value: TWC_MESH_V4 = 62; + */ + TWC_MESH_V4 = 62, + + /** + * + * NRF52_PROMICRO_DIY + * Promicro NRF52840 with SX1262/LLCC68, SSD1306 OLED and NEO6M GPS + * + * @generated from enum value: NRF52_PROMICRO_DIY = 63; + */ + NRF52_PROMICRO_DIY = 63, + + /** + * + * RadioMaster 900 Bandit Nano, https://www.radiomasterrc.com/products/bandit-nano-expresslrs-rf-module + * ESP32-D0WDQ6 With SX1276/SKY66122, SSD1306 OLED and No GPS + * + * @generated from enum value: RADIOMASTER_900_BANDIT_NANO = 64; + */ + RADIOMASTER_900_BANDIT_NANO = 64, + + /** + * + * Heltec Capsule Sensor V3 with ESP32-S3 CPU, Portable LoRa device that can replace GNSS modules or sensors + * + * @generated from enum value: HELTEC_CAPSULE_SENSOR_V3 = 65; + */ + HELTEC_CAPSULE_SENSOR_V3 = 65, + + /** + * + * Heltec Vision Master T190 with ESP32-S3 CPU, and a 1.90 inch TFT display + * + * @generated from enum value: HELTEC_VISION_MASTER_T190 = 66; + */ + HELTEC_VISION_MASTER_T190 = 66, + + /** + * + * Heltec Vision Master E213 with ESP32-S3 CPU, and a 2.13 inch E-Ink display + * + * @generated from enum value: HELTEC_VISION_MASTER_E213 = 67; + */ + HELTEC_VISION_MASTER_E213 = 67, + + /** + * + * Heltec Vision Master E290 with ESP32-S3 CPU, and a 2.9 inch E-Ink display + * + * @generated from enum value: HELTEC_VISION_MASTER_E290 = 68; + */ + HELTEC_VISION_MASTER_E290 = 68, + + /** + * + * Heltec Mesh Node T114 board with nRF52840 CPU, and a 1.14 inch TFT display, Ultimate low-power design, + * specifically adapted for the Meshtatic project + * + * @generated from enum value: HELTEC_MESH_NODE_T114 = 69; + */ + HELTEC_MESH_NODE_T114 = 69, + + /** + * + * Sensecap Indicator from Seeed Studio. ESP32-S3 device with TFT and RP2040 coprocessor + * + * @generated from enum value: SENSECAP_INDICATOR = 70; + */ + SENSECAP_INDICATOR = 70, + + /** + * + * Seeed studio T1000-E tracker card. NRF52840 w/ LR1110 radio, GPS, button, buzzer, and sensors. + * + * @generated from enum value: TRACKER_T1000_E = 71; + */ + TRACKER_T1000_E = 71, + + /** + * + * RAK3172 STM32WLE5 Module (https://store.rakwireless.com/products/wisduo-lpwan-module-rak3172) + * + * @generated from enum value: RAK3172 = 72; + */ + RAK3172 = 72, + + /** + * + * Seeed Studio Wio-E5 (either mini or Dev kit) using STM32WL chip. + * + * @generated from enum value: WIO_E5 = 73; + */ + WIO_E5 = 73, + + /** + * + * RadioMaster 900 Bandit, https://www.radiomasterrc.com/products/bandit-expresslrs-rf-module + * SSD1306 OLED and No GPS + * + * @generated from enum value: RADIOMASTER_900_BANDIT = 74; + */ + RADIOMASTER_900_BANDIT = 74, + + /** + * + * Minewsemi ME25LS01 (ME25LE01_V1.0). NRF52840 w/ LR1110 radio, buttons and leds and pins. + * + * @generated from enum value: ME25LS01_4Y10TD = 75; + */ + ME25LS01_4Y10TD = 75, + + /** + * + * RP2040_FEATHER_RFM95 + * Adafruit Feather RP2040 with RFM95 LoRa Radio RFM95 with SX1272, SSD1306 OLED + * https://www.adafruit.com/product/5714 + * https://www.adafruit.com/product/326 + * https://www.adafruit.com/product/938 + * ^^^ short A0 to switch to I2C address 0x3C + * + * + * @generated from enum value: RP2040_FEATHER_RFM95 = 76; + */ + RP2040_FEATHER_RFM95 = 76, + + /** + * M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ + * + * @generated from enum value: M5STACK_COREBASIC = 77; + */ + M5STACK_COREBASIC = 77, + + /** + * @generated from enum value: M5STACK_CORE2 = 78; + */ + M5STACK_CORE2 = 78, + + /** + * Pico2 with Waveshare Hat, same as Pico + * + * @generated from enum value: RPI_PICO2 = 79; + */ + RPI_PICO2 = 79, + + /** + * M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ + * + * @generated from enum value: M5STACK_CORES3 = 80; + */ + M5STACK_CORES3 = 80, + + /** + * Seeed XIAO S3 DK + * + * @generated from enum value: SEEED_XIAO_S3 = 81; + */ + SEEED_XIAO_S3 = 81, + + /** + * + * Nordic nRF52840+Semtech SX1262 LoRa BLE Combo Module. nRF52840+SX1262 MS24SF1 + * + * @generated from enum value: MS24SF1 = 82; + */ + MS24SF1 = 82, + + /** + * + * Lilygo TLora-C6 with the new ESP32-C6 MCU + * + * @generated from enum value: TLORA_C6 = 83; + */ + TLORA_C6 = 83, + + /** + * + * WisMesh Tap + * RAK-4631 w/ TFT in injection modled case + * + * @generated from enum value: WISMESH_TAP = 84; + */ + WISMESH_TAP = 84, + + /** + * + * Similar to PORTDUINO but used by Routastic devices, this is not any + * particular device and does not run Meshtastic's code but supports + * the same frame format. + * Runs on linux, see https://github.com/Jorropo/routastic + * + * @generated from enum value: ROUTASTIC = 85; + */ + ROUTASTIC = 85, + + /** + * + * Mesh-Tab, esp32 based + * https://github.com/valzzu/Mesh-Tab + * + * @generated from enum value: MESH_TAB = 86; + */ + MESH_TAB = 86, + + /** + * + * MeshLink board developed by LoraItalia. NRF52840, eByte E22900M22S (Will also come with other frequencies), 25w MPPT solar charger (5v,12v,18v selectable), support for gps, buzzer, oled or e-ink display, 10 gpios, hardware watchdog + * https://www.loraitalia.it + * + * @generated from enum value: MESHLINK = 87; + */ + MESHLINK = 87, + + /** + * + * Seeed XIAO nRF52840 + Wio SX1262 kit + * + * @generated from enum value: XIAO_NRF52_KIT = 88; + */ + XIAO_NRF52_KIT = 88, + + /** + * + * Elecrow ThinkNode M1 & M2 + * https://www.elecrow.com/wiki/ThinkNode-M1_Transceiver_Device(Meshtastic)_Power_By_nRF52840.html + * https://www.elecrow.com/wiki/ThinkNode-M2_Transceiver_Device(Meshtastic)_Power_By_NRF52840.html (this actually uses ESP32-S3) + * + * @generated from enum value: THINKNODE_M1 = 89; + */ + THINKNODE_M1 = 89, + + /** + * @generated from enum value: THINKNODE_M2 = 90; + */ + THINKNODE_M2 = 90, + + /** + * + * Lilygo T-ETH-Elite + * + * @generated from enum value: T_ETH_ELITE = 91; + */ + T_ETH_ELITE = 91, + + /** + * + * Heltec HRI-3621 industrial probe + * + * @generated from enum value: HELTEC_SENSOR_HUB = 92; + */ + HELTEC_SENSOR_HUB = 92, + + /** + * + * Muzi Works Muzi-Base device + * + * @generated from enum value: MUZI_BASE = 93; + */ + MUZI_BASE = 93, + + /** + * + * Heltec Magnetic Power Bank with Meshtastic compatible + * + * @generated from enum value: HELTEC_MESH_POCKET = 94; + */ + HELTEC_MESH_POCKET = 94, + + /** + * + * Seeed Solar Node + * + * @generated from enum value: SEEED_SOLAR_NODE = 95; + */ + SEEED_SOLAR_NODE = 95, + + /** + * + * NomadStar Meteor Pro https://nomadstar.ch/ + * + * @generated from enum value: NOMADSTAR_METEOR_PRO = 96; + */ + NOMADSTAR_METEOR_PRO = 96, + + /** + * + * Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin + * + * @generated from enum value: CROWPANEL = 97; + */ + CROWPANEL = 97, + + /** + * + * Lilygo LINK32 board with sensors + * + * @generated from enum value: LINK_32 = 98; + */ + LINK_32 = 98, + + /** + * + * Seeed Tracker L1 + * + * @generated from enum value: SEEED_WIO_TRACKER_L1 = 99; + */ + SEEED_WIO_TRACKER_L1 = 99, + + /** + * + * Seeed Tracker L1 EINK driver + * + * @generated from enum value: SEEED_WIO_TRACKER_L1_EINK = 100; + */ + SEEED_WIO_TRACKER_L1_EINK = 100, + + /** + * + * Muzi Works R1 Neo + * + * @generated from enum value: MUZI_R1_NEO = 101; + */ + MUZI_R1_NEO = 101, + + /** + * + * Lilygo T-Deck Pro + * + * @generated from enum value: T_DECK_PRO = 102; + */ + T_DECK_PRO = 102, + + /** + * + * Lilygo TLora Pager + * + * @generated from enum value: T_LORA_PAGER = 103; + */ + T_LORA_PAGER = 103, + + /** + * + * M5Stack Reserved + * + * 0x68 + * + * @generated from enum value: M5STACK_RESERVED = 104; + */ + M5STACK_RESERVED = 104, + + /** + * + * RAKwireless WisMesh Tag + * + * @generated from enum value: WISMESH_TAG = 105; + */ + WISMESH_TAG = 105, + + /** + * + * RAKwireless WisBlock Core RAK3312 https://docs.rakwireless.com/product-categories/wisduo/rak3112-module/overview/ + * + * @generated from enum value: RAK3312 = 106; + */ + RAK3312 = 106, + + /** + * + * Elecrow ThinkNode M5 https://www.elecrow.com/wiki/ThinkNode_M5_Meshtastic_LoRa_Signal_Transceiver_ESP32-S3.html + * + * @generated from enum value: THINKNODE_M5 = 107; + */ + THINKNODE_M5 = 107, + + /** + * + * MeshSolar is an integrated power management and communication solution designed for outdoor low-power devices. + * https://heltec.org/project/meshsolar/ + * + * @generated from enum value: HELTEC_MESH_SOLAR = 108; + */ + HELTEC_MESH_SOLAR = 108, + + /** + * + * Lilygo T-Echo Lite + * + * @generated from enum value: T_ECHO_LITE = 109; + */ + T_ECHO_LITE = 109, + + /** + * + * New Heltec LoRA32 with ESP32-S3 CPU + * + * @generated from enum value: HELTEC_V4 = 110; + */ + HELTEC_V4 = 110, + + /** + * + * M5Stack C6L + * + * @generated from enum value: M5STACK_C6L = 111; + */ + M5STACK_C6L = 111, + + /** + * + * M5Stack Cardputer Adv + * + * @generated from enum value: M5STACK_CARDPUTER_ADV = 112; + */ + M5STACK_CARDPUTER_ADV = 112, + + /** + * + * ESP32S3 main controller with GPS and TFT screen. + * + * @generated from enum value: HELTEC_WIRELESS_TRACKER_V2 = 113; + */ + HELTEC_WIRELESS_TRACKER_V2 = 113, + + /** + * + * LilyGo T-Watch Ultra + * + * @generated from enum value: T_WATCH_ULTRA = 114; + */ + T_WATCH_ULTRA = 114, + + /** + * + * Elecrow ThinkNode M3 + * + * @generated from enum value: THINKNODE_M3 = 115; + */ + THINKNODE_M3 = 115, + + /** + * + * RAK WISMESH_TAP_V2 with ESP32-S3 CPU + * + * @generated from enum value: WISMESH_TAP_V2 = 116; + */ + WISMESH_TAP_V2 = 116, + + /** + * + * RAK3401 + * + * @generated from enum value: RAK3401 = 117; + */ + RAK3401 = 117, + + /** + * + * RAK6421 Hat+ + * + * @generated from enum value: RAK6421 = 118; + */ + RAK6421 = 118, + + /** + * + * Elecrow ThinkNode M4 + * + * @generated from enum value: THINKNODE_M4 = 119; + */ + THINKNODE_M4 = 119, + + /** + * + * Elecrow ThinkNode M6 + * + * @generated from enum value: THINKNODE_M6 = 120; + */ + THINKNODE_M6 = 120, + + /** + * + * Elecrow Meshstick 1262 + * + * @generated from enum value: MESHSTICK_1262 = 121; + */ + MESHSTICK_1262 = 121, + + /** + * + * LilyGo T-Beam 1W + * + * @generated from enum value: TBEAM_1_WATT = 122; + */ + TBEAM_1_WATT = 122, + + /** + * + * LilyGo T5 S3 ePaper Pro (V1 and V2) + * + * @generated from enum value: T5_S3_EPAPER_PRO = 123; + */ + T5_S3_EPAPER_PRO = 123, + + /** + * + * LilyGo T-Beam BPF (144-148Mhz) + * + * @generated from enum value: TBEAM_BPF = 124; + */ + TBEAM_BPF = 124, + + /** + * + * LilyGo T-Mini E-paper S3 Kit + * + * @generated from enum value: MINI_EPAPER_S3 = 125; + */ + MINI_EPAPER_S3 = 125, + + /** + * + * LilyGo T-Display S3 Pro LR1121 + * + * @generated from enum value: TDISPLAY_S3_PRO = 126; + */ + TDISPLAY_S3_PRO = 126, + + /** + * + * Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen. + * + * @generated from enum value: HELTEC_MESH_NODE_T096 = 127; + */ + HELTEC_MESH_NODE_T096 = 127, + + /** + * + * Seeed studio T1000-E Pro tracker card. NRF52840 w/ LR2021 radio, + * GPS, button, buzzer, and sensors. + * + * @generated from enum value: TRACKER_T1000_E_PRO = 128; + */ + TRACKER_T1000_E_PRO = 128, + + /** + * + * Elecrow ThinkNode M7, M8 and M9 + * + * @generated from enum value: THINKNODE_M7 = 129; + */ + THINKNODE_M7 = 129, + + /** + * @generated from enum value: THINKNODE_M8 = 130; + */ + THINKNODE_M8 = 130, + + /** + * @generated from enum value: THINKNODE_M9 = 131; + */ + THINKNODE_M9 = 131, + + /** + * + * The Heltec-V4-R8 uses an ESP32S3R8 chip, plus an SX1262. + * + * @generated from enum value: HELTEC_V4_R8 = 132; + */ + HELTEC_V4_R8 = 132, + + /** + * + * The HELTEC_MESH_NODE_T1 uses an NRF52840 chip, plus an SX1262. + * + * @generated from enum value: HELTEC_MESH_NODE_T1 = 133; + */ + HELTEC_MESH_NODE_T1 = 133, + + /** + * + * B&Q Consulting Station G3: TBD + * + * @generated from enum value: STATION_G3 = 134; + */ + STATION_G3 = 134, + + /** + * + * Lilygo T-Impulse-Plus + * + * @generated from enum value: T_IMPULSE_PLUS = 135; + */ + T_IMPULSE_PLUS = 135, + + /** + * + * Lilygo T-Echo Card + * + * @generated from enum value: T_ECHO_CARD = 136; + */ + T_ECHO_CARD = 136, + + /** + * + * Seeed Tracker L2 + * + * @generated from enum value: SEEED_WIO_TRACKER_L2 = 137; + */ + SEEED_WIO_TRACKER_L2 = 137, + + /** + * + * Elecrow CrowPanel Advance P4 models, ESP32-P4 and TFT with SX1262 radio plugin + * + * @generated from enum value: CROWPANEL_P4 = 138; + */ + CROWPANEL_P4 = 138, + + /** + * + * Heltec Mesh Tower V2 + * + * @generated from enum value: HELTEC_MESH_TOWER_V2 = 139; + */ + HELTEC_MESH_TOWER_V2 = 139, + + /** + * + * Meshnology W10 + * + * @generated from enum value: MESHNOLOGY_W10 = 140; + */ + MESHNOLOGY_W10 = 140, + + /** + * + * ------------------------------------------------------------------------------------------------------------------------------------------ + * Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. + * ------------------------------------------------------------------------------------------------------------------------------------------ + * + * @generated from enum value: PRIVATE_HW = 255; + */ + PRIVATE_HW = 255, +} + +/** + * Describes the enum meshtastic.HardwareModel. + */ +export const HardwareModelSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 0); + +/** + * + * Shared constants between device and phone + * + * @generated from enum meshtastic.Constants + */ +export enum Constants { + /** + * + * First enum must be zero, and we are just using this enum to + * pass int constants between two very different environments + * + * @generated from enum value: ZERO = 0; + */ + ZERO = 0, + + /** + * + * From mesh.options + * note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is + * outside of this envelope + * + * @generated from enum value: DATA_PAYLOAD_LEN = 233; + */ + DATA_PAYLOAD_LEN = 233, +} + +/** + * Describes the enum meshtastic.Constants. + */ +export const ConstantsSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 1); + +/** + * + * Error codes for critical errors + * The device might report these fault codes on the screen. + * If you encounter a fault code, please post on the meshtastic.discourse.group + * and we'll try to help. + * + * @generated from enum meshtastic.CriticalErrorCode + */ +export enum CriticalErrorCode { + /** + * + * TODO: REPLACE + * + * @generated from enum value: NONE = 0; + */ + NONE = 0, + + /** + * + * A software bug was detected while trying to send lora + * + * @generated from enum value: TX_WATCHDOG = 1; + */ + TX_WATCHDOG = 1, + + /** + * + * A software bug was detected on entry to sleep + * + * @generated from enum value: SLEEP_ENTER_WAIT = 2; + */ + SLEEP_ENTER_WAIT = 2, + + /** + * + * No Lora radio hardware could be found + * + * @generated from enum value: NO_RADIO = 3; + */ + NO_RADIO = 3, + + /** + * + * Not normally used + * + * @generated from enum value: UNSPECIFIED = 4; + */ + UNSPECIFIED = 4, + + /** + * + * We failed while configuring a UBlox GPS + * + * @generated from enum value: UBLOX_UNIT_FAILED = 5; + */ + UBLOX_UNIT_FAILED = 5, + + /** + * + * This board was expected to have a power management chip and it is missing or broken + * + * @generated from enum value: NO_AXP192 = 6; + */ + NO_AXP192 = 6, + + /** + * + * The channel tried to set a radio setting which is not supported by this chipset, + * radio comms settings are now undefined. + * + * @generated from enum value: INVALID_RADIO_SETTING = 7; + */ + INVALID_RADIO_SETTING = 7, + + /** + * + * Radio transmit hardware failure. We sent data to the radio chip, but it didn't + * reply with an interrupt. + * + * @generated from enum value: TRANSMIT_FAILED = 8; + */ + TRANSMIT_FAILED = 8, + + /** + * + * We detected that the main CPU voltage dropped below the minimum acceptable value + * + * @generated from enum value: BROWNOUT = 9; + */ + BROWNOUT = 9, + + /** + * Selftest of SX1262 radio chip failed + * + * @generated from enum value: SX1262_FAILURE = 10; + */ + SX1262_FAILURE = 10, + + /** + * + * A (likely software but possibly hardware) failure was detected while trying to send packets. + * If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug + * + * @generated from enum value: RADIO_SPI_BUG = 11; + */ + RADIO_SPI_BUG = 11, + + /** + * + * Corruption was detected on the flash filesystem but we were able to repair things. + * If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. + * + * @generated from enum value: FLASH_CORRUPTION_RECOVERABLE = 12; + */ + FLASH_CORRUPTION_RECOVERABLE = 12, + + /** + * + * Corruption was detected on the flash filesystem but we were unable to repair things. + * NOTE: Your node will probably need to be reconfigured the next time it reboots (it will lose the region code etc...) + * If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. + * + * @generated from enum value: FLASH_CORRUPTION_UNRECOVERABLE = 13; + */ + FLASH_CORRUPTION_UNRECOVERABLE = 13, +} + +/** + * Describes the enum meshtastic.CriticalErrorCode. + */ +export const CriticalErrorCodeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 2); + +/** + * + * Enum to indicate to clients whether this firmware is a special firmware build, like an event. + * The first 16 values are reserved for non-event special firmwares, like the Smart Citizen use case. + * + * @generated from enum meshtastic.FirmwareEdition + */ +export enum FirmwareEdition { + /** + * + * Vanilla firmware + * + * @generated from enum value: VANILLA = 0; + */ + VANILLA = 0, + + /** + * + * Firmware for use in the Smart Citizen environmental monitoring network + * + * @generated from enum value: SMART_CITIZEN = 1; + */ + SMART_CITIZEN = 1, + + /** + * + * Open Sauce, the maker conference held yearly in CA + * + * @generated from enum value: OPEN_SAUCE = 16; + */ + OPEN_SAUCE = 16, + + /** + * + * DEFCON, the yearly hacker conference + * + * @generated from enum value: DEFCON = 17; + */ + DEFCON = 17, + + /** + * + * Burning Man, the yearly hippie gathering in the desert + * + * @generated from enum value: BURNING_MAN = 18; + */ + BURNING_MAN = 18, + + /** + * + * Hamvention, the Dayton amateur radio convention + * + * @generated from enum value: HAMVENTION = 19; + */ + HAMVENTION = 19, + + /** + * + * Placeholder for DIY and unofficial events + * + * @generated from enum value: DIY_EDITION = 127; + */ + DIY_EDITION = 127, +} + +/** + * Describes the enum meshtastic.FirmwareEdition. + */ +export const FirmwareEditionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 3); + +/** + * + * Enum for modules excluded from a device's configuration. + * Each value represents a ModuleConfigType that can be toggled as excluded + * by setting its corresponding bit in the `excluded_modules` bitmask field. + * + * @generated from enum meshtastic.ExcludedModules + */ +export enum ExcludedModules { + /** + * + * Default value of 0 indicates no modules are excluded. + * + * @generated from enum value: EXCLUDED_NONE = 0; + */ + EXCLUDED_NONE = 0, + + /** + * + * MQTT module + * + * @generated from enum value: MQTT_CONFIG = 1; + */ + MQTT_CONFIG = 1, + + /** + * + * Serial module + * + * @generated from enum value: SERIAL_CONFIG = 2; + */ + SERIAL_CONFIG = 2, + + /** + * + * External Notification module + * + * @generated from enum value: EXTNOTIF_CONFIG = 4; + */ + EXTNOTIF_CONFIG = 4, + + /** + * + * Store and Forward module + * + * @generated from enum value: STOREFORWARD_CONFIG = 8; + */ + STOREFORWARD_CONFIG = 8, + + /** + * + * Range Test module + * + * @generated from enum value: RANGETEST_CONFIG = 16; + */ + RANGETEST_CONFIG = 16, + + /** + * + * Telemetry module + * + * @generated from enum value: TELEMETRY_CONFIG = 32; + */ + TELEMETRY_CONFIG = 32, + + /** + * + * Canned Message module + * + * @generated from enum value: CANNEDMSG_CONFIG = 64; + */ + CANNEDMSG_CONFIG = 64, + + /** + * + * Audio module + * + * @generated from enum value: AUDIO_CONFIG = 128; + */ + AUDIO_CONFIG = 128, + + /** + * + * Remote Hardware module + * + * @generated from enum value: REMOTEHARDWARE_CONFIG = 256; + */ + REMOTEHARDWARE_CONFIG = 256, + + /** + * + * Neighbor Info module + * + * @generated from enum value: NEIGHBORINFO_CONFIG = 512; + */ + NEIGHBORINFO_CONFIG = 512, + + /** + * + * Ambient Lighting module + * + * @generated from enum value: AMBIENTLIGHTING_CONFIG = 1024; + */ + AMBIENTLIGHTING_CONFIG = 1024, + + /** + * + * Detection Sensor module + * + * @generated from enum value: DETECTIONSENSOR_CONFIG = 2048; + */ + DETECTIONSENSOR_CONFIG = 2048, + + /** + * + * Paxcounter module + * + * @generated from enum value: PAXCOUNTER_CONFIG = 4096; + */ + PAXCOUNTER_CONFIG = 4096, + + /** + * + * Bluetooth config (not technically a module, but used to indicate bluetooth capabilities) + * + * @generated from enum value: BLUETOOTH_CONFIG = 8192; + */ + BLUETOOTH_CONFIG = 8192, + + /** + * + * Network config (not technically a module, but used to indicate network capabilities) + * + * @generated from enum value: NETWORK_CONFIG = 16384; + */ + NETWORK_CONFIG = 16384, +} + +/** + * Describes the enum meshtastic.ExcludedModules. + */ +export const ExcludedModulesSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_mesh, 4); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/module_config_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/module_config_pb.ts new file mode 100644 index 00000000..abc15ab4 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/module_config_pb.ts @@ -0,0 +1,1889 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/module_config.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { MemberRole, Team } from "./atak_pb"; +import { file_meshtastic_atak } from "./atak_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/module_config.proto. + */ +export const file_meshtastic_module_config: GenFile = /*@__PURE__*/ + fileDesc("Ch5tZXNodGFzdGljL21vZHVsZV9jb25maWcucHJvdG8SCm1lc2h0YXN0aWMiky0KDE1vZHVsZUNvbmZpZxIzCgRtcXR0GAEgASgLMiMubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuTVFUVENvbmZpZ0gAEjcKBnNlcmlhbBgCIAEoCzIlLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLlNlcmlhbENvbmZpZ0gAElQKFWV4dGVybmFsX25vdGlmaWNhdGlvbhgDIAEoCzIzLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkV4dGVybmFsTm90aWZpY2F0aW9uQ29uZmlnSAASRAoNc3RvcmVfZm9yd2FyZBgEIAEoCzIrLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLlN0b3JlRm9yd2FyZENvbmZpZ0gAEj4KCnJhbmdlX3Rlc3QYBSABKAsyKC5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5SYW5nZVRlc3RDb25maWdIABI9Cgl0ZWxlbWV0cnkYBiABKAsyKC5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5UZWxlbWV0cnlDb25maWdIABJGCg5jYW5uZWRfbWVzc2FnZRgHIAEoCzIsLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkNhbm5lZE1lc3NhZ2VDb25maWdIABI1CgVhdWRpbxgIIAEoCzIkLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkF1ZGlvQ29uZmlnSAASSAoPcmVtb3RlX2hhcmR3YXJlGAkgASgLMi0ubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuUmVtb3RlSGFyZHdhcmVDb25maWdIABJECg1uZWlnaGJvcl9pbmZvGAogASgLMisubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuTmVpZ2hib3JJbmZvQ29uZmlnSAASSgoQYW1iaWVudF9saWdodGluZxgLIAEoCzIuLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkFtYmllbnRMaWdodGluZ0NvbmZpZ0gAEkoKEGRldGVjdGlvbl9zZW5zb3IYDCABKAsyLi5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5EZXRlY3Rpb25TZW5zb3JDb25maWdIABI/CgpwYXhjb3VudGVyGA0gASgLMikubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuUGF4Y291bnRlckNvbmZpZ0gAEkUKDXN0YXR1c21lc3NhZ2UYDiABKAsyLC5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5TdGF0dXNNZXNzYWdlQ29uZmlnSAASTgoSdHJhZmZpY19tYW5hZ2VtZW50GA8gASgLMjAubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuVHJhZmZpY01hbmFnZW1lbnRDb25maWdIABIxCgN0YWsYECABKAsyIi5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5UQUtDb25maWdIABq0AgoKTVFUVENvbmZpZxIPCgdlbmFibGVkGAEgASgIEg8KB2FkZHJlc3MYAiABKAkSEAoIdXNlcm5hbWUYAyABKAkSEAoIcGFzc3dvcmQYBCABKAkSGgoSZW5jcnlwdGlvbl9lbmFibGVkGAUgASgIEhgKDGpzb25fZW5hYmxlZBgGIAEoCEICGAESEwoLdGxzX2VuYWJsZWQYByABKAgSDAoEcm9vdBgIIAEoCRIfChdwcm94eV90b19jbGllbnRfZW5hYmxlZBgJIAEoCBIdChVtYXBfcmVwb3J0aW5nX2VuYWJsZWQYCiABKAgSRwoTbWFwX3JlcG9ydF9zZXR0aW5ncxgLIAEoCzIqLm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLk1hcFJlcG9ydFNldHRpbmdzGm4KEU1hcFJlcG9ydFNldHRpbmdzEh0KFXB1Ymxpc2hfaW50ZXJ2YWxfc2VjcxgBIAEoDRIaChJwb3NpdGlvbl9wcmVjaXNpb24YAiABKA0SHgoWc2hvdWxkX3JlcG9ydF9sb2NhdGlvbhgDIAEoCBqCAQoUUmVtb3RlSGFyZHdhcmVDb25maWcSDwoHZW5hYmxlZBgBIAEoCBIiChphbGxvd191bmRlZmluZWRfcGluX2FjY2VzcxgCIAEoCBI1Cg5hdmFpbGFibGVfcGlucxgDIAMoCzIdLm1lc2h0YXN0aWMuUmVtb3RlSGFyZHdhcmVQaW4aWgoSTmVpZ2hib3JJbmZvQ29uZmlnEg8KB2VuYWJsZWQYASABKAgSFwoPdXBkYXRlX2ludGVydmFsGAIgASgNEhoKEnRyYW5zbWl0X292ZXJfbG9yYRgDIAEoCBqXAwoVRGV0ZWN0aW9uU2Vuc29yQ29uZmlnEg8KB2VuYWJsZWQYASABKAgSHgoWbWluaW11bV9icm9hZGNhc3Rfc2VjcxgCIAEoDRIcChRzdGF0ZV9icm9hZGNhc3Rfc2VjcxgDIAEoDRIRCglzZW5kX2JlbGwYBCABKAgSDAoEbmFtZRgFIAEoCRITCgttb25pdG9yX3BpbhgGIAEoDRJaChZkZXRlY3Rpb25fdHJpZ2dlcl90eXBlGAcgASgOMjoubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuRGV0ZWN0aW9uU2Vuc29yQ29uZmlnLlRyaWdnZXJUeXBlEhIKCnVzZV9wdWxsdXAYCCABKAgiiAEKC1RyaWdnZXJUeXBlEg0KCUxPR0lDX0xPVxAAEg4KCkxPR0lDX0hJR0gQARIQCgxGQUxMSU5HX0VER0UQAhIPCgtSSVNJTkdfRURHRRADEhoKFkVJVEhFUl9FREdFX0FDVElWRV9MT1cQBBIbChdFSVRIRVJfRURHRV9BQ1RJVkVfSElHSBAFGuQCCgtBdWRpb0NvbmZpZxIWCg5jb2RlYzJfZW5hYmxlZBgBIAEoCBIPCgdwdHRfcGluGAIgASgNEkAKB2JpdHJhdGUYAyABKA4yLy5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5BdWRpb0NvbmZpZy5BdWRpb19CYXVkEg4KBmkyc193cxgEIAEoDRIOCgZpMnNfc2QYBSABKA0SDwoHaTJzX2RpbhgGIAEoDRIPCgdpMnNfc2NrGAcgASgNIqcBCgpBdWRpb19CYXVkEhIKDkNPREVDMl9ERUZBVUxUEAASDwoLQ09ERUMyXzMyMDAQARIPCgtDT0RFQzJfMjQwMBACEg8KC0NPREVDMl8xNjAwEAMSDwoLQ09ERUMyXzE0MDAQBBIPCgtDT0RFQzJfMTMwMBAFEg8KC0NPREVDMl8xMjAwEAYSDgoKQ09ERUMyXzcwMBAHEg8KC0NPREVDMl83MDBCEAgadgoQUGF4Y291bnRlckNvbmZpZxIPCgdlbmFibGVkGAEgASgIEiIKGnBheGNvdW50ZXJfdXBkYXRlX2ludGVydmFsGAIgASgNEhYKDndpZmlfdGhyZXNob2xkGAMgASgFEhUKDWJsZV90aHJlc2hvbGQYBCABKAUa0wMKF1RyYWZmaWNNYW5hZ2VtZW50Q29uZmlnEg8KB2VuYWJsZWQYASABKAgSHgoWcG9zaXRpb25fZGVkdXBfZW5hYmxlZBgCIAEoCBIfChdwb3NpdGlvbl9wcmVjaXNpb25fYml0cxgDIAEoDRIiChpwb3NpdGlvbl9taW5faW50ZXJ2YWxfc2VjcxgEIAEoDRIgChhub2RlaW5mb19kaXJlY3RfcmVzcG9uc2UYBSABKAgSKQohbm9kZWluZm9fZGlyZWN0X3Jlc3BvbnNlX21heF9ob3BzGAYgASgNEhoKEnJhdGVfbGltaXRfZW5hYmxlZBgHIAEoCBIeChZyYXRlX2xpbWl0X3dpbmRvd19zZWNzGAggASgNEh4KFnJhdGVfbGltaXRfbWF4X3BhY2tldHMYCSABKA0SHAoUZHJvcF91bmtub3duX2VuYWJsZWQYCiABKAgSIAoYdW5rbm93bl9wYWNrZXRfdGhyZXNob2xkGAsgASgNEh0KFWV4aGF1c3RfaG9wX3RlbGVtZXRyeRgMIAEoCBIcChRleGhhdXN0X2hvcF9wb3NpdGlvbhgNIAEoCBIcChRyb3V0ZXJfcHJlc2VydmVfaG9wcxgOIAEoCBqjBQoMU2VyaWFsQ29uZmlnEg8KB2VuYWJsZWQYASABKAgSDAoEZWNobxgCIAEoCBILCgNyeGQYAyABKA0SCwoDdHhkGAQgASgNEj8KBGJhdWQYBSABKA4yMS5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5TZXJpYWxDb25maWcuU2VyaWFsX0JhdWQSDwoHdGltZW91dBgGIAEoDRI/CgRtb2RlGAcgASgOMjEubWVzaHRhc3RpYy5Nb2R1bGVDb25maWcuU2VyaWFsQ29uZmlnLlNlcmlhbF9Nb2RlEiQKHG92ZXJyaWRlX2NvbnNvbGVfc2VyaWFsX3BvcnQYCCABKAgiigIKC1NlcmlhbF9CYXVkEhAKDEJBVURfREVGQVVMVBAAEgwKCEJBVURfMTEwEAESDAoIQkFVRF8zMDAQAhIMCghCQVVEXzYwMBADEg0KCUJBVURfMTIwMBAEEg0KCUJBVURfMjQwMBAFEg0KCUJBVURfNDgwMBAGEg0KCUJBVURfOTYwMBAHEg4KCkJBVURfMTkyMDAQCBIOCgpCQVVEXzM4NDAwEAkSDgoKQkFVRF81NzYwMBAKEg8KC0JBVURfMTE1MjAwEAsSDwoLQkFVRF8yMzA0MDAQDBIPCgtCQVVEXzQ2MDgwMBANEg8KC0JBVURfNTc2MDAwEA4SDwoLQkFVRF85MjE2MDAQDyKTAQoLU2VyaWFsX01vZGUSCwoHREVGQVVMVBAAEgoKBlNJTVBMRRABEgkKBVBST1RPEAISCwoHVEVYVE1TRxADEggKBE5NRUEQBBILCgdDQUxUT1BPEAUSCAoEV1M4NRAGEg0KCVZFX0RJUkVDVBAHEg0KCU1TX0NPTkZJRxAIEgcKA0xPRxAJEgsKB0xPR1RFWFQQChrpAgoaRXh0ZXJuYWxOb3RpZmljYXRpb25Db25maWcSDwoHZW5hYmxlZBgBIAEoCBIRCglvdXRwdXRfbXMYAiABKA0SDgoGb3V0cHV0GAMgASgNEhQKDG91dHB1dF92aWJyYRgIIAEoDRIVCg1vdXRwdXRfYnV6emVyGAkgASgNEg4KBmFjdGl2ZRgEIAEoCBIVCg1hbGVydF9tZXNzYWdlGAUgASgIEhsKE2FsZXJ0X21lc3NhZ2VfdmlicmEYCiABKAgSHAoUYWxlcnRfbWVzc2FnZV9idXp6ZXIYCyABKAgSEgoKYWxlcnRfYmVsbBgGIAEoCBIYChBhbGVydF9iZWxsX3ZpYnJhGAwgASgIEhkKEWFsZXJ0X2JlbGxfYnV6emVyGA0gASgIEg8KB3VzZV9wd20YByABKAgSEwoLbmFnX3RpbWVvdXQYDiABKA0SGQoRdXNlX2kyc19hc19idXp6ZXIYDyABKAgalwEKElN0b3JlRm9yd2FyZENvbmZpZxIPCgdlbmFibGVkGAEgASgIEhEKCWhlYXJ0YmVhdBgCIAEoCBIPCgdyZWNvcmRzGAMgASgNEhoKEmhpc3RvcnlfcmV0dXJuX21heBgEIAEoDRIdChVoaXN0b3J5X3JldHVybl93aW5kb3cYBSABKA0SEQoJaXNfc2VydmVyGAYgASgIGlkKD1JhbmdlVGVzdENvbmZpZxIPCgdlbmFibGVkGAEgASgIEg4KBnNlbmRlchgCIAEoDRIMCgRzYXZlGAMgASgIEhcKD2NsZWFyX29uX3JlYm9vdBgEIAEoCBqPBAoPVGVsZW1ldHJ5Q29uZmlnEh4KFmRldmljZV91cGRhdGVfaW50ZXJ2YWwYASABKA0SIwobZW52aXJvbm1lbnRfdXBkYXRlX2ludGVydmFsGAIgASgNEicKH2Vudmlyb25tZW50X21lYXN1cmVtZW50X2VuYWJsZWQYAyABKAgSIgoaZW52aXJvbm1lbnRfc2NyZWVuX2VuYWJsZWQYBCABKAgSJgoeZW52aXJvbm1lbnRfZGlzcGxheV9mYWhyZW5oZWl0GAUgASgIEhsKE2Fpcl9xdWFsaXR5X2VuYWJsZWQYBiABKAgSHAoUYWlyX3F1YWxpdHlfaW50ZXJ2YWwYByABKA0SIQoZcG93ZXJfbWVhc3VyZW1lbnRfZW5hYmxlZBgIIAEoCBIdChVwb3dlcl91cGRhdGVfaW50ZXJ2YWwYCSABKA0SHAoUcG93ZXJfc2NyZWVuX2VuYWJsZWQYCiABKAgSIgoaaGVhbHRoX21lYXN1cmVtZW50X2VuYWJsZWQYCyABKAgSHgoWaGVhbHRoX3VwZGF0ZV9pbnRlcnZhbBgMIAEoDRIdChVoZWFsdGhfc2NyZWVuX2VuYWJsZWQYDSABKAgSIAoYZGV2aWNlX3RlbGVtZXRyeV9lbmFibGVkGA4gASgIEiIKGmFpcl9xdWFsaXR5X3NjcmVlbl9lbmFibGVkGA8gASgIGt4EChNDYW5uZWRNZXNzYWdlQ29uZmlnEhcKD3JvdGFyeTFfZW5hYmxlZBgBIAEoCBIZChFpbnB1dGJyb2tlcl9waW5fYRgCIAEoDRIZChFpbnB1dGJyb2tlcl9waW5fYhgDIAEoDRIdChVpbnB1dGJyb2tlcl9waW5fcHJlc3MYBCABKA0SWQoUaW5wdXRicm9rZXJfZXZlbnRfY3cYBSABKA4yOy5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5DYW5uZWRNZXNzYWdlQ29uZmlnLklucHV0RXZlbnRDaGFyEloKFWlucHV0YnJva2VyX2V2ZW50X2NjdxgGIAEoDjI7Lm1lc2h0YXN0aWMuTW9kdWxlQ29uZmlnLkNhbm5lZE1lc3NhZ2VDb25maWcuSW5wdXRFdmVudENoYXISXAoXaW5wdXRicm9rZXJfZXZlbnRfcHJlc3MYByABKA4yOy5tZXNodGFzdGljLk1vZHVsZUNvbmZpZy5DYW5uZWRNZXNzYWdlQ29uZmlnLklucHV0RXZlbnRDaGFyEhcKD3VwZG93bjFfZW5hYmxlZBgIIAEoCBITCgdlbmFibGVkGAkgASgIQgIYARIeChJhbGxvd19pbnB1dF9zb3VyY2UYCiABKAlCAhgBEhEKCXNlbmRfYmVsbBgLIAEoCCJjCg5JbnB1dEV2ZW50Q2hhchIICgROT05FEAASBgoCVVAQERIICgRET1dOEBISCAoETEVGVBATEgkKBVJJR0hUEBQSCgoGU0VMRUNUEAoSCAoEQkFDSxAbEgoKBkNBTkNFTBAYGmUKFUFtYmllbnRMaWdodGluZ0NvbmZpZxIRCglsZWRfc3RhdGUYASABKAgSDwoHY3VycmVudBgCIAEoDRILCgNyZWQYAyABKA0SDQoFZ3JlZW4YBCABKA0SDAoEYmx1ZRgFIAEoDRoqChNTdGF0dXNNZXNzYWdlQ29uZmlnEhMKC25vZGVfc3RhdHVzGAEgASgJGlEKCVRBS0NvbmZpZxIeCgR0ZWFtGAEgASgOMhAubWVzaHRhc3RpYy5UZWFtEiQKBHJvbGUYAiABKA4yFi5tZXNodGFzdGljLk1lbWJlclJvbGVCEQoPcGF5bG9hZF92YXJpYW50ImQKEVJlbW90ZUhhcmR3YXJlUGluEhAKCGdwaW9fcGluGAEgASgNEgwKBG5hbWUYAiABKAkSLwoEdHlwZRgDIAEoDjIhLm1lc2h0YXN0aWMuUmVtb3RlSGFyZHdhcmVQaW5UeXBlKkkKFVJlbW90ZUhhcmR3YXJlUGluVHlwZRILCgdVTktOT1dOEAASEAoMRElHSVRBTF9SRUFEEAESEQoNRElHSVRBTF9XUklURRACQmgKFG9yZy5tZXNodGFzdGljLnByb3RvQhJNb2R1bGVDb25maWdQcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z", [file_meshtastic_atak]); + +/** + * + * Module Config + * + * @generated from message meshtastic.ModuleConfig + */ +export type ModuleConfig = Message<"meshtastic.ModuleConfig"> & { + /** + * + * TODO: REPLACE + * + * @generated from oneof meshtastic.ModuleConfig.payload_variant + */ + payloadVariant: { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.MQTTConfig mqtt = 1; + */ + value: ModuleConfig_MQTTConfig; + case: "mqtt"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.SerialConfig serial = 2; + */ + value: ModuleConfig_SerialConfig; + case: "serial"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.ExternalNotificationConfig external_notification = 3; + */ + value: ModuleConfig_ExternalNotificationConfig; + case: "externalNotification"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.StoreForwardConfig store_forward = 4; + */ + value: ModuleConfig_StoreForwardConfig; + case: "storeForward"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.RangeTestConfig range_test = 5; + */ + value: ModuleConfig_RangeTestConfig; + case: "rangeTest"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.TelemetryConfig telemetry = 6; + */ + value: ModuleConfig_TelemetryConfig; + case: "telemetry"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.CannedMessageConfig canned_message = 7; + */ + value: ModuleConfig_CannedMessageConfig; + case: "cannedMessage"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.AudioConfig audio = 8; + */ + value: ModuleConfig_AudioConfig; + case: "audio"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.RemoteHardwareConfig remote_hardware = 9; + */ + value: ModuleConfig_RemoteHardwareConfig; + case: "remoteHardware"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.NeighborInfoConfig neighbor_info = 10; + */ + value: ModuleConfig_NeighborInfoConfig; + case: "neighborInfo"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.AmbientLightingConfig ambient_lighting = 11; + */ + value: ModuleConfig_AmbientLightingConfig; + case: "ambientLighting"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.DetectionSensorConfig detection_sensor = 12; + */ + value: ModuleConfig_DetectionSensorConfig; + case: "detectionSensor"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.PaxcounterConfig paxcounter = 13; + */ + value: ModuleConfig_PaxcounterConfig; + case: "paxcounter"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.ModuleConfig.StatusMessageConfig statusmessage = 14; + */ + value: ModuleConfig_StatusMessageConfig; + case: "statusmessage"; + } | { + /** + * + * Traffic management module config for mesh network optimization + * + * @generated from field: meshtastic.ModuleConfig.TrafficManagementConfig traffic_management = 15; + */ + value: ModuleConfig_TrafficManagementConfig; + case: "trafficManagement"; + } | { + /** + * + * TAK team/role configuration for TAK_TRACKER + * + * @generated from field: meshtastic.ModuleConfig.TAKConfig tak = 16; + */ + value: ModuleConfig_TAKConfig; + case: "tak"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.ModuleConfig. + * Use `create(ModuleConfigSchema)` to create a new message. + */ +export const ModuleConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0); + +/** + * + * MQTT Client Config + * + * @generated from message meshtastic.ModuleConfig.MQTTConfig + */ +export type ModuleConfig_MQTTConfig = Message<"meshtastic.ModuleConfig.MQTTConfig"> & { + /** + * + * If a meshtastic node is able to reach the internet it will normally attempt to gateway any channels that are marked as + * is_uplink_enabled or is_downlink_enabled. + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * The server to use for our MQTT global message gateway feature. + * If not set, the default server will be used + * + * @generated from field: string address = 2; + */ + address: string; + + /** + * + * MQTT username to use (most useful for a custom MQTT server). + * If using a custom server, this will be honoured even if empty. + * If using the default server, this will only be honoured if set, otherwise the device will use the default username + * + * @generated from field: string username = 3; + */ + username: string; + + /** + * + * MQTT password to use (most useful for a custom MQTT server). + * If using a custom server, this will be honoured even if empty. + * If using the default server, this will only be honoured if set, otherwise the device will use the default password + * + * @generated from field: string password = 4; + */ + password: string; + + /** + * + * Whether to send encrypted or decrypted packets to MQTT. + * This parameter is only honoured if you also set server + * (the default official mqtt.meshtastic.org server can handle encrypted packets) + * Decrypted packets may be useful for external systems that want to consume meshtastic packets + * + * @generated from field: bool encryption_enabled = 5; + */ + encryptionEnabled: boolean; + + /** + * + * Deprecated: JSON packet support on MQTT was removed, and this field is ignored. + * + * @generated from field: bool json_enabled = 6 [deprecated = true]; + * @deprecated + */ + jsonEnabled: boolean; + + /** + * + * If true, we attempt to establish a secure connection using TLS + * + * @generated from field: bool tls_enabled = 7; + */ + tlsEnabled: boolean; + + /** + * + * The root topic to use for MQTT messages. Default is "msh". + * This is useful if you want to use a single MQTT server for multiple meshtastic networks and separate them via ACLs + * + * @generated from field: string root = 8; + */ + root: string; + + /** + * + * If true, we can use the connected phone / client to proxy messages to MQTT instead of a direct connection + * + * @generated from field: bool proxy_to_client_enabled = 9; + */ + proxyToClientEnabled: boolean; + + /** + * + * If true, we will periodically report unencrypted information about our node to a map via MQTT + * + * @generated from field: bool map_reporting_enabled = 10; + */ + mapReportingEnabled: boolean; + + /** + * + * Settings for reporting information about our node to a map via MQTT + * + * @generated from field: meshtastic.ModuleConfig.MapReportSettings map_report_settings = 11; + */ + mapReportSettings?: ModuleConfig_MapReportSettings | undefined; +}; + +/** + * Describes the message meshtastic.ModuleConfig.MQTTConfig. + * Use `create(ModuleConfig_MQTTConfigSchema)` to create a new message. + */ +export const ModuleConfig_MQTTConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 0); + +/** + * + * Settings for reporting unencrypted information about our node to a map via MQTT + * + * @generated from message meshtastic.ModuleConfig.MapReportSettings + */ +export type ModuleConfig_MapReportSettings = Message<"meshtastic.ModuleConfig.MapReportSettings"> & { + /** + * + * How often we should report our info to the map (in seconds) + * + * @generated from field: uint32 publish_interval_secs = 1; + */ + publishIntervalSecs: number; + + /** + * + * Bits of precision for the location sent (default of 32 is full precision). + * + * @generated from field: uint32 position_precision = 2; + */ + positionPrecision: number; + + /** + * + * Whether we have opted-in to report our location to the map + * + * @generated from field: bool should_report_location = 3; + */ + shouldReportLocation: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.MapReportSettings. + * Use `create(ModuleConfig_MapReportSettingsSchema)` to create a new message. + */ +export const ModuleConfig_MapReportSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 1); + +/** + * + * RemoteHardwareModule Config + * + * @generated from message meshtastic.ModuleConfig.RemoteHardwareConfig + */ +export type ModuleConfig_RemoteHardwareConfig = Message<"meshtastic.ModuleConfig.RemoteHardwareConfig"> & { + /** + * + * Whether the Module is enabled + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * Whether the Module allows consumers to read / write to pins not defined in available_pins + * + * @generated from field: bool allow_undefined_pin_access = 2; + */ + allowUndefinedPinAccess: boolean; + + /** + * + * Exposes the available pins to the mesh for reading and writing + * + * @generated from field: repeated meshtastic.RemoteHardwarePin available_pins = 3; + */ + availablePins: RemoteHardwarePin[]; +}; + +/** + * Describes the message meshtastic.ModuleConfig.RemoteHardwareConfig. + * Use `create(ModuleConfig_RemoteHardwareConfigSchema)` to create a new message. + */ +export const ModuleConfig_RemoteHardwareConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 2); + +/** + * + * NeighborInfoModule Config + * + * @generated from message meshtastic.ModuleConfig.NeighborInfoConfig + */ +export type ModuleConfig_NeighborInfoConfig = Message<"meshtastic.ModuleConfig.NeighborInfoConfig"> & { + /** + * + * Whether the Module is enabled + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * Interval in seconds of how often we should try to send our + * Neighbor Info (minimum is 14400, i.e., 4 hours) + * + * @generated from field: uint32 update_interval = 2; + */ + updateInterval: number; + + /** + * + * Whether in addition to sending it to MQTT and the PhoneAPI, our NeighborInfo should be transmitted over LoRa. + * Note that this is not available on a channel with default key and name. + * + * @generated from field: bool transmit_over_lora = 3; + */ + transmitOverLora: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.NeighborInfoConfig. + * Use `create(ModuleConfig_NeighborInfoConfigSchema)` to create a new message. + */ +export const ModuleConfig_NeighborInfoConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 3); + +/** + * + * Detection Sensor Module Config + * + * @generated from message meshtastic.ModuleConfig.DetectionSensorConfig + */ +export type ModuleConfig_DetectionSensorConfig = Message<"meshtastic.ModuleConfig.DetectionSensorConfig"> & { + /** + * + * Whether the Module is enabled + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * Interval in seconds of how often we can send a message to the mesh when a + * trigger event is detected + * + * @generated from field: uint32 minimum_broadcast_secs = 2; + */ + minimumBroadcastSecs: number; + + /** + * + * Interval in seconds of how often we should send a message to the mesh + * with the current state regardless of trigger events When set to 0, only + * trigger events will be broadcasted Works as a sort of status heartbeat + * for peace of mind + * + * @generated from field: uint32 state_broadcast_secs = 3; + */ + stateBroadcastSecs: number; + + /** + * + * Send ASCII bell with alert message + * Useful for triggering ext. notification on bell + * + * @generated from field: bool send_bell = 4; + */ + sendBell: boolean; + + /** + * + * Friendly name used to format message sent to mesh + * Example: A name "Motion" would result in a message "Motion detected" + * Maximum length of 20 characters + * + * @generated from field: string name = 5; + */ + name: string; + + /** + * + * GPIO pin to monitor for state changes + * + * @generated from field: uint32 monitor_pin = 6; + */ + monitorPin: number; + + /** + * + * The type of trigger event to be used + * + * @generated from field: meshtastic.ModuleConfig.DetectionSensorConfig.TriggerType detection_trigger_type = 7; + */ + detectionTriggerType: ModuleConfig_DetectionSensorConfig_TriggerType; + + /** + * + * Whether or not use INPUT_PULLUP mode for GPIO pin + * Only applicable if the board uses pull-up resistors on the pin + * + * @generated from field: bool use_pullup = 8; + */ + usePullup: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.DetectionSensorConfig. + * Use `create(ModuleConfig_DetectionSensorConfigSchema)` to create a new message. + */ +export const ModuleConfig_DetectionSensorConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 4); + +/** + * @generated from enum meshtastic.ModuleConfig.DetectionSensorConfig.TriggerType + */ +export enum ModuleConfig_DetectionSensorConfig_TriggerType { + /** + * Event is triggered if pin is low + * + * @generated from enum value: LOGIC_LOW = 0; + */ + LOGIC_LOW = 0, + + /** + * Event is triggered if pin is high + * + * @generated from enum value: LOGIC_HIGH = 1; + */ + LOGIC_HIGH = 1, + + /** + * Event is triggered when pin goes high to low + * + * @generated from enum value: FALLING_EDGE = 2; + */ + FALLING_EDGE = 2, + + /** + * Event is triggered when pin goes low to high + * + * @generated from enum value: RISING_EDGE = 3; + */ + RISING_EDGE = 3, + + /** + * Event is triggered on every pin state change, low is considered to be + * "active" + * + * @generated from enum value: EITHER_EDGE_ACTIVE_LOW = 4; + */ + EITHER_EDGE_ACTIVE_LOW = 4, + + /** + * Event is triggered on every pin state change, high is considered to be + * "active" + * + * @generated from enum value: EITHER_EDGE_ACTIVE_HIGH = 5; + */ + EITHER_EDGE_ACTIVE_HIGH = 5, +} + +/** + * Describes the enum meshtastic.ModuleConfig.DetectionSensorConfig.TriggerType. + */ +export const ModuleConfig_DetectionSensorConfig_TriggerTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_module_config, 0, 4, 0); + +/** + * + * Audio Config for codec2 voice + * + * @generated from message meshtastic.ModuleConfig.AudioConfig + */ +export type ModuleConfig_AudioConfig = Message<"meshtastic.ModuleConfig.AudioConfig"> & { + /** + * + * Whether Audio is enabled + * + * @generated from field: bool codec2_enabled = 1; + */ + codec2Enabled: boolean; + + /** + * + * PTT Pin + * + * @generated from field: uint32 ptt_pin = 2; + */ + pttPin: number; + + /** + * + * The audio sample rate to use for codec2 + * + * @generated from field: meshtastic.ModuleConfig.AudioConfig.Audio_Baud bitrate = 3; + */ + bitrate: ModuleConfig_AudioConfig_Audio_Baud; + + /** + * + * I2S Word Select + * + * @generated from field: uint32 i2s_ws = 4; + */ + i2sWs: number; + + /** + * + * I2S Data IN + * + * @generated from field: uint32 i2s_sd = 5; + */ + i2sSd: number; + + /** + * + * I2S Data OUT + * + * @generated from field: uint32 i2s_din = 6; + */ + i2sDin: number; + + /** + * + * I2S Clock + * + * @generated from field: uint32 i2s_sck = 7; + */ + i2sSck: number; +}; + +/** + * Describes the message meshtastic.ModuleConfig.AudioConfig. + * Use `create(ModuleConfig_AudioConfigSchema)` to create a new message. + */ +export const ModuleConfig_AudioConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 5); + +/** + * + * Baudrate for codec2 voice + * + * @generated from enum meshtastic.ModuleConfig.AudioConfig.Audio_Baud + */ +export enum ModuleConfig_AudioConfig_Audio_Baud { + /** + * @generated from enum value: CODEC2_DEFAULT = 0; + */ + CODEC2_DEFAULT = 0, + + /** + * @generated from enum value: CODEC2_3200 = 1; + */ + CODEC2_3200 = 1, + + /** + * @generated from enum value: CODEC2_2400 = 2; + */ + CODEC2_2400 = 2, + + /** + * @generated from enum value: CODEC2_1600 = 3; + */ + CODEC2_1600 = 3, + + /** + * @generated from enum value: CODEC2_1400 = 4; + */ + CODEC2_1400 = 4, + + /** + * @generated from enum value: CODEC2_1300 = 5; + */ + CODEC2_1300 = 5, + + /** + * @generated from enum value: CODEC2_1200 = 6; + */ + CODEC2_1200 = 6, + + /** + * @generated from enum value: CODEC2_700 = 7; + */ + CODEC2_700 = 7, + + /** + * @generated from enum value: CODEC2_700B = 8; + */ + CODEC2_700B = 8, +} + +/** + * Describes the enum meshtastic.ModuleConfig.AudioConfig.Audio_Baud. + */ +export const ModuleConfig_AudioConfig_Audio_BaudSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_module_config, 0, 5, 0); + +/** + * + * Config for the Paxcounter Module + * + * @generated from message meshtastic.ModuleConfig.PaxcounterConfig + */ +export type ModuleConfig_PaxcounterConfig = Message<"meshtastic.ModuleConfig.PaxcounterConfig"> & { + /** + * + * Enable the Paxcounter Module + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * @generated from field: uint32 paxcounter_update_interval = 2; + */ + paxcounterUpdateInterval: number; + + /** + * + * WiFi RSSI threshold. Defaults to -80 + * + * @generated from field: int32 wifi_threshold = 3; + */ + wifiThreshold: number; + + /** + * + * BLE RSSI threshold. Defaults to -80 + * + * @generated from field: int32 ble_threshold = 4; + */ + bleThreshold: number; +}; + +/** + * Describes the message meshtastic.ModuleConfig.PaxcounterConfig. + * Use `create(ModuleConfig_PaxcounterConfigSchema)` to create a new message. + */ +export const ModuleConfig_PaxcounterConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 6); + +/** + * + * Config for the Traffic Management module. + * Provides packet inspection and traffic shaping to help reduce channel utilization + * + * @generated from message meshtastic.ModuleConfig.TrafficManagementConfig + */ +export type ModuleConfig_TrafficManagementConfig = Message<"meshtastic.ModuleConfig.TrafficManagementConfig"> & { + /** + * + * Master enable for traffic management module + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * Enable position deduplication to drop redundant position broadcasts + * + * @generated from field: bool position_dedup_enabled = 2; + */ + positionDedupEnabled: boolean; + + /** + * + * Number of bits of precision for position deduplication (0-32) + * + * @generated from field: uint32 position_precision_bits = 3; + */ + positionPrecisionBits: number; + + /** + * + * Minimum interval in seconds between position updates from the same node + * + * @generated from field: uint32 position_min_interval_secs = 4; + */ + positionMinIntervalSecs: number; + + /** + * + * Enable direct response to NodeInfo requests from local cache + * + * @generated from field: bool nodeinfo_direct_response = 5; + */ + nodeinfoDirectResponse: boolean; + + /** + * + * Minimum hop distance from requestor before responding to NodeInfo requests + * + * @generated from field: uint32 nodeinfo_direct_response_max_hops = 6; + */ + nodeinfoDirectResponseMaxHops: number; + + /** + * + * Enable per-node rate limiting to throttle chatty nodes + * + * @generated from field: bool rate_limit_enabled = 7; + */ + rateLimitEnabled: boolean; + + /** + * + * Time window in seconds for rate limiting calculations + * + * @generated from field: uint32 rate_limit_window_secs = 8; + */ + rateLimitWindowSecs: number; + + /** + * + * Maximum packets allowed per node within the rate limit window + * + * @generated from field: uint32 rate_limit_max_packets = 9; + */ + rateLimitMaxPackets: number; + + /** + * + * Enable dropping of unknown/undecryptable packets per rate_limit_window_secs + * + * @generated from field: bool drop_unknown_enabled = 10; + */ + dropUnknownEnabled: boolean; + + /** + * + * Number of unknown packets before dropping from a node + * + * @generated from field: uint32 unknown_packet_threshold = 11; + */ + unknownPacketThreshold: number; + + /** + * + * Set hop_limit to 0 for relayed telemetry broadcasts (own packets unaffected) + * + * @generated from field: bool exhaust_hop_telemetry = 12; + */ + exhaustHopTelemetry: boolean; + + /** + * + * Set hop_limit to 0 for relayed position broadcasts (own packets unaffected) + * + * @generated from field: bool exhaust_hop_position = 13; + */ + exhaustHopPosition: boolean; + + /** + * + * Preserve hop_limit for router-to-router traffic + * + * @generated from field: bool router_preserve_hops = 14; + */ + routerPreserveHops: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.TrafficManagementConfig. + * Use `create(ModuleConfig_TrafficManagementConfigSchema)` to create a new message. + */ +export const ModuleConfig_TrafficManagementConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 7); + +/** + * + * Serial Config + * + * @generated from message meshtastic.ModuleConfig.SerialConfig + */ +export type ModuleConfig_SerialConfig = Message<"meshtastic.ModuleConfig.SerialConfig"> & { + /** + * + * Preferences for the SerialModule + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * TODO: REPLACE + * + * @generated from field: bool echo = 2; + */ + echo: boolean; + + /** + * + * RX pin (should match Arduino gpio pin number) + * + * @generated from field: uint32 rxd = 3; + */ + rxd: number; + + /** + * + * TX pin (should match Arduino gpio pin number) + * + * @generated from field: uint32 txd = 4; + */ + txd: number; + + /** + * + * Serial baud rate + * + * @generated from field: meshtastic.ModuleConfig.SerialConfig.Serial_Baud baud = 5; + */ + baud: ModuleConfig_SerialConfig_Serial_Baud; + + /** + * + * TODO: REPLACE + * + * @generated from field: uint32 timeout = 6; + */ + timeout: number; + + /** + * + * Mode for serial module operation + * + * @generated from field: meshtastic.ModuleConfig.SerialConfig.Serial_Mode mode = 7; + */ + mode: ModuleConfig_SerialConfig_Serial_Mode; + + /** + * + * Overrides the platform's defacto Serial port instance to use with Serial module config settings + * This is currently only usable in output modes like NMEA / CalTopo and may behave strangely or not work at all in other modes + * Existing logging over the Serial Console will still be present + * + * @generated from field: bool override_console_serial_port = 8; + */ + overrideConsoleSerialPort: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.SerialConfig. + * Use `create(ModuleConfig_SerialConfigSchema)` to create a new message. + */ +export const ModuleConfig_SerialConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 8); + +/** + * + * TODO: REPLACE + * + * @generated from enum meshtastic.ModuleConfig.SerialConfig.Serial_Baud + */ +export enum ModuleConfig_SerialConfig_Serial_Baud { + /** + * @generated from enum value: BAUD_DEFAULT = 0; + */ + BAUD_DEFAULT = 0, + + /** + * @generated from enum value: BAUD_110 = 1; + */ + BAUD_110 = 1, + + /** + * @generated from enum value: BAUD_300 = 2; + */ + BAUD_300 = 2, + + /** + * @generated from enum value: BAUD_600 = 3; + */ + BAUD_600 = 3, + + /** + * @generated from enum value: BAUD_1200 = 4; + */ + BAUD_1200 = 4, + + /** + * @generated from enum value: BAUD_2400 = 5; + */ + BAUD_2400 = 5, + + /** + * @generated from enum value: BAUD_4800 = 6; + */ + BAUD_4800 = 6, + + /** + * @generated from enum value: BAUD_9600 = 7; + */ + BAUD_9600 = 7, + + /** + * @generated from enum value: BAUD_19200 = 8; + */ + BAUD_19200 = 8, + + /** + * @generated from enum value: BAUD_38400 = 9; + */ + BAUD_38400 = 9, + + /** + * @generated from enum value: BAUD_57600 = 10; + */ + BAUD_57600 = 10, + + /** + * @generated from enum value: BAUD_115200 = 11; + */ + BAUD_115200 = 11, + + /** + * @generated from enum value: BAUD_230400 = 12; + */ + BAUD_230400 = 12, + + /** + * @generated from enum value: BAUD_460800 = 13; + */ + BAUD_460800 = 13, + + /** + * @generated from enum value: BAUD_576000 = 14; + */ + BAUD_576000 = 14, + + /** + * @generated from enum value: BAUD_921600 = 15; + */ + BAUD_921600 = 15, +} + +/** + * Describes the enum meshtastic.ModuleConfig.SerialConfig.Serial_Baud. + */ +export const ModuleConfig_SerialConfig_Serial_BaudSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_module_config, 0, 8, 0); + +/** + * + * TODO: REPLACE + * + * @generated from enum meshtastic.ModuleConfig.SerialConfig.Serial_Mode + */ +export enum ModuleConfig_SerialConfig_Serial_Mode { + /** + * @generated from enum value: DEFAULT = 0; + */ + DEFAULT = 0, + + /** + * @generated from enum value: SIMPLE = 1; + */ + SIMPLE = 1, + + /** + * @generated from enum value: PROTO = 2; + */ + PROTO = 2, + + /** + * @generated from enum value: TEXTMSG = 3; + */ + TEXTMSG = 3, + + /** + * @generated from enum value: NMEA = 4; + */ + NMEA = 4, + + /** + * NMEA messages specifically tailored for CalTopo + * + * @generated from enum value: CALTOPO = 5; + */ + CALTOPO = 5, + + /** + * Ecowitt WS85 weather station + * + * @generated from enum value: WS85 = 6; + */ + WS85 = 6, + + /** + * VE.Direct is a serial protocol used by Victron Energy products + * https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable + * + * @generated from enum value: VE_DIRECT = 7; + */ + VE_DIRECT = 7, + + /** + * Used to configure and view some parameters of MeshSolar. + * https://heltec.org/project/meshsolar/ + * + * @generated from enum value: MS_CONFIG = 8; + */ + MS_CONFIG = 8, + + /** + * Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. + * + * includes other packets + * + * @generated from enum value: LOG = 9; + */ + LOG = 9, + + /** + * only text (channel & DM) + * + * @generated from enum value: LOGTEXT = 10; + */ + LOGTEXT = 10, +} + +/** + * Describes the enum meshtastic.ModuleConfig.SerialConfig.Serial_Mode. + */ +export const ModuleConfig_SerialConfig_Serial_ModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_module_config, 0, 8, 1); + +/** + * + * External Notifications Config + * + * @generated from message meshtastic.ModuleConfig.ExternalNotificationConfig + */ +export type ModuleConfig_ExternalNotificationConfig = Message<"meshtastic.ModuleConfig.ExternalNotificationConfig"> & { + /** + * + * Enable the ExternalNotificationModule + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * When using in On/Off mode, keep the output on for this many + * milliseconds. Default 1000ms (1 second). + * + * @generated from field: uint32 output_ms = 2; + */ + outputMs: number; + + /** + * + * Define the output pin GPIO setting Defaults to + * EXT_NOTIFY_OUT if set for the board. + * In standalone devices this pin should drive the LED to match the UI. + * + * @generated from field: uint32 output = 3; + */ + output: number; + + /** + * + * Optional: Define a secondary output pin for a vibra motor + * This is used in standalone devices to match the UI. + * + * @generated from field: uint32 output_vibra = 8; + */ + outputVibra: number; + + /** + * + * Optional: Define a tertiary output pin for an active buzzer + * This is used in standalone devices to to match the UI. + * + * @generated from field: uint32 output_buzzer = 9; + */ + outputBuzzer: number; + + /** + * + * IF this is true, the 'output' Pin will be pulled active high, false + * means active low. + * + * @generated from field: bool active = 4; + */ + active: boolean; + + /** + * + * True: Alert when a text message arrives (output) + * + * @generated from field: bool alert_message = 5; + */ + alertMessage: boolean; + + /** + * + * True: Alert when a text message arrives (output_vibra) + * + * @generated from field: bool alert_message_vibra = 10; + */ + alertMessageVibra: boolean; + + /** + * + * True: Alert when a text message arrives (output_buzzer) + * + * @generated from field: bool alert_message_buzzer = 11; + */ + alertMessageBuzzer: boolean; + + /** + * + * True: Alert when the bell character is received (output) + * + * @generated from field: bool alert_bell = 6; + */ + alertBell: boolean; + + /** + * + * True: Alert when the bell character is received (output_vibra) + * + * @generated from field: bool alert_bell_vibra = 12; + */ + alertBellVibra: boolean; + + /** + * + * True: Alert when the bell character is received (output_buzzer) + * + * @generated from field: bool alert_bell_buzzer = 13; + */ + alertBellBuzzer: boolean; + + /** + * + * use a PWM output instead of a simple on/off output. This will ignore + * the 'output', 'output_ms' and 'active' settings and use the + * device.buzzer_gpio instead. + * + * @generated from field: bool use_pwm = 7; + */ + usePwm: boolean; + + /** + * + * The notification will toggle with 'output_ms' for this time of seconds. + * Default is 0 which means don't repeat at all. 60 would mean blink + * and/or beep for 60 seconds + * + * @generated from field: uint32 nag_timeout = 14; + */ + nagTimeout: number; + + /** + * + * When true, enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer + * T-Watch S3 and T-Deck for example have this capability + * + * @generated from field: bool use_i2s_as_buzzer = 15; + */ + useI2sAsBuzzer: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.ExternalNotificationConfig. + * Use `create(ModuleConfig_ExternalNotificationConfigSchema)` to create a new message. + */ +export const ModuleConfig_ExternalNotificationConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 9); + +/** + * + * Store and Forward Module Config + * + * @generated from message meshtastic.ModuleConfig.StoreForwardConfig + */ +export type ModuleConfig_StoreForwardConfig = Message<"meshtastic.ModuleConfig.StoreForwardConfig"> & { + /** + * + * Enable the Store and Forward Module + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * TODO: REPLACE + * + * @generated from field: bool heartbeat = 2; + */ + heartbeat: boolean; + + /** + * + * TODO: REPLACE + * + * @generated from field: uint32 records = 3; + */ + records: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: uint32 history_return_max = 4; + */ + historyReturnMax: number; + + /** + * + * TODO: REPLACE + * + * @generated from field: uint32 history_return_window = 5; + */ + historyReturnWindow: number; + + /** + * + * Set to true to let this node act as a server that stores received messages and resends them upon request. + * + * @generated from field: bool is_server = 6; + */ + isServer: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.StoreForwardConfig. + * Use `create(ModuleConfig_StoreForwardConfigSchema)` to create a new message. + */ +export const ModuleConfig_StoreForwardConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 10); + +/** + * + * Preferences for the RangeTestModule + * + * @generated from message meshtastic.ModuleConfig.RangeTestConfig + */ +export type ModuleConfig_RangeTestConfig = Message<"meshtastic.ModuleConfig.RangeTestConfig"> & { + /** + * + * Enable the Range Test Module + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * + * Send out range test messages from this node + * + * @generated from field: uint32 sender = 2; + */ + sender: number; + + /** + * + * Bool value indicating that this node should save a RangeTest.csv file. + * ESP32 Only + * + * @generated from field: bool save = 3; + */ + save: boolean; + + /** + * + * Bool indicating that the node should cleanup / destroy it's RangeTest.csv file. + * ESP32 Only + * + * @generated from field: bool clear_on_reboot = 4; + */ + clearOnReboot: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.RangeTestConfig. + * Use `create(ModuleConfig_RangeTestConfigSchema)` to create a new message. + */ +export const ModuleConfig_RangeTestConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 11); + +/** + * + * Configuration for both device and environment metrics + * + * @generated from message meshtastic.ModuleConfig.TelemetryConfig + */ +export type ModuleConfig_TelemetryConfig = Message<"meshtastic.ModuleConfig.TelemetryConfig"> & { + /** + * + * Interval in seconds of how often we should try to send our + * device metrics to the mesh + * + * @generated from field: uint32 device_update_interval = 1; + */ + deviceUpdateInterval: number; + + /** + * @generated from field: uint32 environment_update_interval = 2; + */ + environmentUpdateInterval: number; + + /** + * + * Preferences for the Telemetry Module (Environment) + * Enable/Disable the telemetry measurement module measurement collection + * + * @generated from field: bool environment_measurement_enabled = 3; + */ + environmentMeasurementEnabled: boolean; + + /** + * + * Enable/Disable the telemetry measurement module on-device display + * + * @generated from field: bool environment_screen_enabled = 4; + */ + environmentScreenEnabled: boolean; + + /** + * + * We'll always read the sensor in Celsius, but sometimes we might want to + * display the results in Fahrenheit as a "user preference". + * + * @generated from field: bool environment_display_fahrenheit = 5; + */ + environmentDisplayFahrenheit: boolean; + + /** + * + * Enable/Disable the air quality metrics + * + * @generated from field: bool air_quality_enabled = 6; + */ + airQualityEnabled: boolean; + + /** + * + * Interval in seconds of how often we should try to send our + * air quality metrics to the mesh + * + * @generated from field: uint32 air_quality_interval = 7; + */ + airQualityInterval: number; + + /** + * + * Enable/disable Power metrics + * + * @generated from field: bool power_measurement_enabled = 8; + */ + powerMeasurementEnabled: boolean; + + /** + * + * Interval in seconds of how often we should try to send our + * power metrics to the mesh + * + * @generated from field: uint32 power_update_interval = 9; + */ + powerUpdateInterval: number; + + /** + * + * Enable/Disable the power measurement module on-device display + * + * @generated from field: bool power_screen_enabled = 10; + */ + powerScreenEnabled: boolean; + + /** + * + * Preferences for the (Health) Telemetry Module + * Enable/Disable the telemetry measurement module measurement collection + * + * @generated from field: bool health_measurement_enabled = 11; + */ + healthMeasurementEnabled: boolean; + + /** + * + * Interval in seconds of how often we should try to send our + * health metrics to the mesh + * + * @generated from field: uint32 health_update_interval = 12; + */ + healthUpdateInterval: number; + + /** + * + * Enable/Disable the health telemetry module on-device display + * + * @generated from field: bool health_screen_enabled = 13; + */ + healthScreenEnabled: boolean; + + /** + * + * Enable/Disable the device telemetry module to send metrics to the mesh + * Note: We will still send telemtry to the connected phone / client every minute over the API + * + * @generated from field: bool device_telemetry_enabled = 14; + */ + deviceTelemetryEnabled: boolean; + + /** + * + * Enable/Disable the air quality telemetry measurement module on-device display + * + * @generated from field: bool air_quality_screen_enabled = 15; + */ + airQualityScreenEnabled: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.TelemetryConfig. + * Use `create(ModuleConfig_TelemetryConfigSchema)` to create a new message. + */ +export const ModuleConfig_TelemetryConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 12); + +/** + * + * Canned Messages Module Config + * + * @generated from message meshtastic.ModuleConfig.CannedMessageConfig + */ +export type ModuleConfig_CannedMessageConfig = Message<"meshtastic.ModuleConfig.CannedMessageConfig"> & { + /** + * + * Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating. + * + * @generated from field: bool rotary1_enabled = 1; + */ + rotary1Enabled: boolean; + + /** + * + * GPIO pin for rotary encoder A port. + * + * @generated from field: uint32 inputbroker_pin_a = 2; + */ + inputbrokerPinA: number; + + /** + * + * GPIO pin for rotary encoder B port. + * + * @generated from field: uint32 inputbroker_pin_b = 3; + */ + inputbrokerPinB: number; + + /** + * + * GPIO pin for rotary encoder Press port. + * + * @generated from field: uint32 inputbroker_pin_press = 4; + */ + inputbrokerPinPress: number; + + /** + * + * Generate input event on CW of this kind. + * + * @generated from field: meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar inputbroker_event_cw = 5; + */ + inputbrokerEventCw: ModuleConfig_CannedMessageConfig_InputEventChar; + + /** + * + * Generate input event on CCW of this kind. + * + * @generated from field: meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar inputbroker_event_ccw = 6; + */ + inputbrokerEventCcw: ModuleConfig_CannedMessageConfig_InputEventChar; + + /** + * + * Generate input event on Press of this kind. + * + * @generated from field: meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar inputbroker_event_press = 7; + */ + inputbrokerEventPress: ModuleConfig_CannedMessageConfig_InputEventChar; + + /** + * + * Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker. + * + * @generated from field: bool updown1_enabled = 8; + */ + updown1Enabled: boolean; + + /** + * + * Enable/disable CannedMessageModule. + * + * @generated from field: bool enabled = 9 [deprecated = true]; + * @deprecated + */ + enabled: boolean; + + /** + * + * Input event origin accepted by the canned message module. + * Can be e.g. "rotEnc1", "upDownEnc1", "scanAndSelect", "cardkb", "serialkb", or keyword "_any" + * + * @generated from field: string allow_input_source = 10 [deprecated = true]; + * @deprecated + */ + allowInputSource: string; + + /** + * + * CannedMessageModule also sends a bell character with the messages. + * ExternalNotificationModule can benefit from this feature. + * + * @generated from field: bool send_bell = 11; + */ + sendBell: boolean; +}; + +/** + * Describes the message meshtastic.ModuleConfig.CannedMessageConfig. + * Use `create(ModuleConfig_CannedMessageConfigSchema)` to create a new message. + */ +export const ModuleConfig_CannedMessageConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 13); + +/** + * + * TODO: REPLACE + * + * @generated from enum meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar + */ +export enum ModuleConfig_CannedMessageConfig_InputEventChar { + /** + * + * TODO: REPLACE + * + * @generated from enum value: NONE = 0; + */ + NONE = 0, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: UP = 17; + */ + UP = 17, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: DOWN = 18; + */ + DOWN = 18, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: LEFT = 19; + */ + LEFT = 19, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: RIGHT = 20; + */ + RIGHT = 20, + + /** + * + * '\n' + * + * @generated from enum value: SELECT = 10; + */ + SELECT = 10, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: BACK = 27; + */ + BACK = 27, + + /** + * + * TODO: REPLACE + * + * @generated from enum value: CANCEL = 24; + */ + CANCEL = 24, +} + +/** + * Describes the enum meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar. + */ +export const ModuleConfig_CannedMessageConfig_InputEventCharSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_module_config, 0, 13, 0); + +/** + * + * Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels. + * Initially created for the RAK14001 RGB LED module. + * + * @generated from message meshtastic.ModuleConfig.AmbientLightingConfig + */ +export type ModuleConfig_AmbientLightingConfig = Message<"meshtastic.ModuleConfig.AmbientLightingConfig"> & { + /** + * + * Sets LED to on or off. + * + * @generated from field: bool led_state = 1; + */ + ledState: boolean; + + /** + * + * Sets the current for the LED output. Default is 10. + * + * @generated from field: uint32 current = 2; + */ + current: number; + + /** + * + * Sets the red LED level. Values are 0-255. + * + * @generated from field: uint32 red = 3; + */ + red: number; + + /** + * + * Sets the green LED level. Values are 0-255. + * + * @generated from field: uint32 green = 4; + */ + green: number; + + /** + * + * Sets the blue LED level. Values are 0-255. + * + * @generated from field: uint32 blue = 5; + */ + blue: number; +}; + +/** + * Describes the message meshtastic.ModuleConfig.AmbientLightingConfig. + * Use `create(ModuleConfig_AmbientLightingConfigSchema)` to create a new message. + */ +export const ModuleConfig_AmbientLightingConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 14); + +/** + * + * StatusMessage config - Allows setting a status message for a node to periodically rebroadcast + * + * @generated from message meshtastic.ModuleConfig.StatusMessageConfig + */ +export type ModuleConfig_StatusMessageConfig = Message<"meshtastic.ModuleConfig.StatusMessageConfig"> & { + /** + * + * The actual status string + * + * @generated from field: string node_status = 1; + */ + nodeStatus: string; +}; + +/** + * Describes the message meshtastic.ModuleConfig.StatusMessageConfig. + * Use `create(ModuleConfig_StatusMessageConfigSchema)` to create a new message. + */ +export const ModuleConfig_StatusMessageConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 15); + +/** + * + * TAK team/role configuration + * + * @generated from message meshtastic.ModuleConfig.TAKConfig + */ +export type ModuleConfig_TAKConfig = Message<"meshtastic.ModuleConfig.TAKConfig"> & { + /** + * + * Team color. + * Default Unspecifed_Color -> firmware uses Cyan + * + * @generated from field: meshtastic.Team team = 1; + */ + team: Team; + + /** + * + * Member role. + * Default Unspecifed -> firmware uses TeamMember + * + * @generated from field: meshtastic.MemberRole role = 2; + */ + role: MemberRole; +}; + +/** + * Describes the message meshtastic.ModuleConfig.TAKConfig. + * Use `create(ModuleConfig_TAKConfigSchema)` to create a new message. + */ +export const ModuleConfig_TAKConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 0, 16); + +/** + * + * A GPIO pin definition for remote hardware module + * + * @generated from message meshtastic.RemoteHardwarePin + */ +export type RemoteHardwarePin = Message<"meshtastic.RemoteHardwarePin"> & { + /** + * + * GPIO Pin number (must match Arduino) + * + * @generated from field: uint32 gpio_pin = 1; + */ + gpioPin: number; + + /** + * + * Name for the GPIO pin (i.e. Front gate, mailbox, etc) + * + * @generated from field: string name = 2; + */ + name: string; + + /** + * + * Type of GPIO access available to consumers on the mesh + * + * @generated from field: meshtastic.RemoteHardwarePinType type = 3; + */ + type: RemoteHardwarePinType; +}; + +/** + * Describes the message meshtastic.RemoteHardwarePin. + * Use `create(RemoteHardwarePinSchema)` to create a new message. + */ +export const RemoteHardwarePinSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_module_config, 1); + +/** + * @generated from enum meshtastic.RemoteHardwarePinType + */ +export enum RemoteHardwarePinType { + /** + * + * Unset/unused + * + * @generated from enum value: UNKNOWN = 0; + */ + UNKNOWN = 0, + + /** + * + * GPIO pin can be read (if it is high / low) + * + * @generated from enum value: DIGITAL_READ = 1; + */ + DIGITAL_READ = 1, + + /** + * + * GPIO pin can be written to (high / low) + * + * @generated from enum value: DIGITAL_WRITE = 2; + */ + DIGITAL_WRITE = 2, +} + +/** + * Describes the enum meshtastic.RemoteHardwarePinType. + */ +export const RemoteHardwarePinTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_module_config, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/mqtt_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/mqtt_pb.ts new file mode 100644 index 00000000..36170b68 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/mqtt_pb.ts @@ -0,0 +1,189 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/mqtt.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Config_DeviceConfig_Role, Config_LoRaConfig_ModemPreset, Config_LoRaConfig_RegionCode } from "./config_pb"; +import { file_meshtastic_config } from "./config_pb"; +import type { HardwareModel, MeshPacket } from "./mesh_pb"; +import { file_meshtastic_mesh } from "./mesh_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/mqtt.proto. + */ +export const file_meshtastic_mqtt: GenFile = /*@__PURE__*/ + fileDesc("ChVtZXNodGFzdGljL21xdHQucHJvdG8SCm1lc2h0YXN0aWMiYQoPU2VydmljZUVudmVsb3BlEiYKBnBhY2tldBgBIAEoCzIWLm1lc2h0YXN0aWMuTWVzaFBhY2tldBISCgpjaGFubmVsX2lkGAIgASgJEhIKCmdhdGV3YXlfaWQYAyABKAki3wMKCU1hcFJlcG9ydBIRCglsb25nX25hbWUYASABKAkSEgoKc2hvcnRfbmFtZRgCIAEoCRIyCgRyb2xlGAMgASgOMiQubWVzaHRhc3RpYy5Db25maWcuRGV2aWNlQ29uZmlnLlJvbGUSKwoIaHdfbW9kZWwYBCABKA4yGS5tZXNodGFzdGljLkhhcmR3YXJlTW9kZWwSGAoQZmlybXdhcmVfdmVyc2lvbhgFIAEoCRI4CgZyZWdpb24YBiABKA4yKC5tZXNodGFzdGljLkNvbmZpZy5Mb1JhQ29uZmlnLlJlZ2lvbkNvZGUSPwoMbW9kZW1fcHJlc2V0GAcgASgOMikubWVzaHRhc3RpYy5Db25maWcuTG9SYUNvbmZpZy5Nb2RlbVByZXNldBIbChNoYXNfZGVmYXVsdF9jaGFubmVsGAggASgIEhIKCmxhdGl0dWRlX2kYCSABKA8SEwoLbG9uZ2l0dWRlX2kYCiABKA8SEAoIYWx0aXR1ZGUYCyABKAUSGgoScG9zaXRpb25fcHJlY2lzaW9uGAwgASgNEh4KFm51bV9vbmxpbmVfbG9jYWxfbm9kZXMYDSABKA0SIQoZaGFzX29wdGVkX3JlcG9ydF9sb2NhdGlvbhgOIAEoCEJgChRvcmcubWVzaHRhc3RpYy5wcm90b0IKTVFUVFByb3Rvc1oiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZKoCFE1lc2h0YXN0aWMuUHJvdG9idWZzugIAYgZwcm90bzM", [file_meshtastic_config, file_meshtastic_mesh]); + +/** + * + * This message wraps a MeshPacket with extra metadata about the sender and how it arrived. + * + * @generated from message meshtastic.ServiceEnvelope + */ +export type ServiceEnvelope = Message<"meshtastic.ServiceEnvelope"> & { + /** + * + * The (probably encrypted) packet + * + * @generated from field: meshtastic.MeshPacket packet = 1; + */ + packet?: MeshPacket | undefined; + + /** + * + * The global channel ID it was sent on + * + * @generated from field: string channel_id = 2; + */ + channelId: string; + + /** + * + * The sending gateway node ID. Can we use this to authenticate/prevent fake + * nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as + * the globally trusted nodenum + * + * @generated from field: string gateway_id = 3; + */ + gatewayId: string; +}; + +/** + * Describes the message meshtastic.ServiceEnvelope. + * Use `create(ServiceEnvelopeSchema)` to create a new message. + */ +export const ServiceEnvelopeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mqtt, 0); + +/** + * + * Information about a node intended to be reported unencrypted to a map using MQTT. + * + * @generated from message meshtastic.MapReport + */ +export type MapReport = Message<"meshtastic.MapReport"> & { + /** + * + * A full name for this user, i.e. "Kevin Hester" + * + * @generated from field: string long_name = 1; + */ + longName: string; + + /** + * + * A VERY short name, ideally two characters. + * Suitable for a tiny OLED screen + * + * @generated from field: string short_name = 2; + */ + shortName: string; + + /** + * + * Role of the node that applies specific settings for a particular use-case + * + * @generated from field: meshtastic.Config.DeviceConfig.Role role = 3; + */ + role: Config_DeviceConfig_Role; + + /** + * + * Hardware model of the node, i.e. T-Beam, Heltec V3, etc... + * + * @generated from field: meshtastic.HardwareModel hw_model = 4; + */ + hwModel: HardwareModel; + + /** + * + * Device firmware version string + * + * @generated from field: string firmware_version = 5; + */ + firmwareVersion: string; + + /** + * + * The region code for the radio (US, CN, EU433, etc...) + * + * @generated from field: meshtastic.Config.LoRaConfig.RegionCode region = 6; + */ + region: Config_LoRaConfig_RegionCode; + + /** + * + * Modem preset used by the radio (LongFast, MediumSlow, etc...) + * + * @generated from field: meshtastic.Config.LoRaConfig.ModemPreset modem_preset = 7; + */ + modemPreset: Config_LoRaConfig_ModemPreset; + + /** + * + * Whether the node has a channel with default PSK and name (LongFast, MediumSlow, etc...) + * and it uses the default frequency slot given the region and modem preset. + * + * @generated from field: bool has_default_channel = 8; + */ + hasDefaultChannel: boolean; + + /** + * + * Latitude: multiply by 1e-7 to get degrees in floating point + * + * @generated from field: sfixed32 latitude_i = 9; + */ + latitudeI: number; + + /** + * + * Longitude: multiply by 1e-7 to get degrees in floating point + * + * @generated from field: sfixed32 longitude_i = 10; + */ + longitudeI: number; + + /** + * + * Altitude in meters above MSL + * + * @generated from field: int32 altitude = 11; + */ + altitude: number; + + /** + * + * Indicates the bits of precision for latitude and longitude set by the sending node + * + * @generated from field: uint32 position_precision = 12; + */ + positionPrecision: number; + + /** + * + * Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT) + * + * @generated from field: uint32 num_online_local_nodes = 13; + */ + numOnlineLocalNodes: number; + + /** + * + * User has opted in to share their location (map report) with the mqtt server + * Controlled by map_report.should_report_location + * + * @generated from field: bool has_opted_report_location = 14; + */ + hasOptedReportLocation: boolean; +}; + +/** + * Describes the message meshtastic.MapReport. + * Use `create(MapReportSchema)` to create a new message. + */ +export const MapReportSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_mqtt, 1); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/paxcount_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/paxcount_pb.ts new file mode 100644 index 00000000..f0ecbade --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/paxcount_pb.ts @@ -0,0 +1,53 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/paxcount.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/paxcount.proto. + */ +export const file_meshtastic_paxcount: GenFile = /*@__PURE__*/ + fileDesc("ChltZXNodGFzdGljL3BheGNvdW50LnByb3RvEgptZXNodGFzdGljIjUKCFBheGNvdW50EgwKBHdpZmkYASABKA0SCwoDYmxlGAIgASgNEg4KBnVwdGltZRgDIAEoDUJkChRvcmcubWVzaHRhc3RpYy5wcm90b0IOUGF4Y291bnRQcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * + * TODO: REPLACE + * + * @generated from message meshtastic.Paxcount + */ +export type Paxcount = Message<"meshtastic.Paxcount"> & { + /** + * + * seen Wifi devices + * + * @generated from field: uint32 wifi = 1; + */ + wifi: number; + + /** + * + * Seen BLE devices + * + * @generated from field: uint32 ble = 2; + */ + ble: number; + + /** + * + * Uptime in seconds + * + * @generated from field: uint32 uptime = 3; + */ + uptime: number; +}; + +/** + * Describes the message meshtastic.Paxcount. + * Use `create(PaxcountSchema)` to create a new message. + */ +export const PaxcountSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_paxcount, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/portnums_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/portnums_pb.ts new file mode 100644 index 00000000..b3be2ba7 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/portnums_pb.ts @@ -0,0 +1,412 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/portnums.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc } from "@bufbuild/protobuf/codegenv2"; + +/** + * Describes the file meshtastic/portnums.proto. + */ +export const file_meshtastic_portnums: GenFile = /*@__PURE__*/ + fileDesc("ChltZXNodGFzdGljL3BvcnRudW1zLnByb3RvEgptZXNodGFzdGljKv0FCgdQb3J0TnVtEg8KC1VOS05PV05fQVBQEAASFAoQVEVYVF9NRVNTQUdFX0FQUBABEhcKE1JFTU9URV9IQVJEV0FSRV9BUFAQAhIQCgxQT1NJVElPTl9BUFAQAxIQCgxOT0RFSU5GT19BUFAQBBIPCgtST1VUSU5HX0FQUBAFEg0KCUFETUlOX0FQUBAGEh8KG1RFWFRfTUVTU0FHRV9DT01QUkVTU0VEX0FQUBAHEhAKDFdBWVBPSU5UX0FQUBAIEg0KCUFVRElPX0FQUBAJEhgKFERFVEVDVElPTl9TRU5TT1JfQVBQEAoSDQoJQUxFUlRfQVBQEAsSGAoUS0VZX1ZFUklGSUNBVElPTl9BUFAQDBIUChBSRU1PVEVfU0hFTExfQVBQEA0SDQoJUkVQTFlfQVBQECASEQoNSVBfVFVOTkVMX0FQUBAhEhIKDlBBWENPVU5URVJfQVBQECISHgoaU1RPUkVfRk9SV0FSRF9QTFVTUExVU19BUFAQIxITCg9OT0RFX1NUQVRVU19BUFAQJBIOCgpTRVJJQUxfQVBQEEASFQoRU1RPUkVfRk9SV0FSRF9BUFAQQRISCg5SQU5HRV9URVNUX0FQUBBCEhEKDVRFTEVNRVRSWV9BUFAQQxILCgdaUFNfQVBQEEQSEQoNU0lNVUxBVE9SX0FQUBBFEhIKDlRSQUNFUk9VVEVfQVBQEEYSFAoQTkVJR0hCT1JJTkZPX0FQUBBHEg8KC0FUQUtfUExVR0lOEEgSEgoOTUFQX1JFUE9SVF9BUFAQSRITCg9QT1dFUlNUUkVTU19BUFAQShISCg5MT1JBV0FOX0JSSURHRRBLEhgKFFJFVElDVUxVTV9UVU5ORUxfQVBQEEwSDwoLQ0FZRU5ORV9BUFAQTRISCg5BVEFLX1BMVUdJTl9WMhBOEhIKDkdST1VQQUxBUk1fQVBQEHASEAoLUFJJVkFURV9BUFAQgAISEwoOQVRBS19GT1JXQVJERVIQgQISCAoDTUFYEP8DQl4KFG9yZy5tZXNodGFzdGljLnByb3RvQghQb3J0bnVtc1oiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZKoCFE1lc2h0YXN0aWMuUHJvdG9idWZzugIAYgZwcm90bzM"); + +/** + * + * For any new 'apps' that run on the device or via sister apps on phones/PCs they should pick and use a + * unique 'portnum' for their application. + * If you are making a new app using meshtastic, please send in a pull request to add your 'portnum' to this + * master table. + * PortNums should be assigned in the following range: + * 0-63 Core Meshtastic use, do not use for third party apps + * 64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application + * 256-511 Use one of these portnums for your private applications that you don't want to register publically + * All other values are reserved. + * Note: This was formerly a Type enum named 'typ' with the same id # + * We have change to this 'portnum' based scheme for specifying app handlers for particular payloads. + * This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically. + * + * @generated from enum meshtastic.PortNum + */ +export enum PortNum { + /** + * + * Deprecated: do not use in new code (formerly called OPAQUE) + * A message sent from a device outside of the mesh, in a form the mesh does not understand + * NOTE: This must be 0, because it is documented in IMeshService.aidl to be so + * ENCODING: binary undefined + * + * @generated from enum value: UNKNOWN_APP = 0; + */ + UNKNOWN_APP = 0, + + /** + * + * A simple UTF-8 text message, which even the little micros in the mesh + * can understand and show on their screen eventually in some circumstances + * even signal might send messages in this form (see below) + * ENCODING: UTF-8 Plaintext (?) + * + * @generated from enum value: TEXT_MESSAGE_APP = 1; + */ + TEXT_MESSAGE_APP = 1, + + /** + * + * Reserved for built-in GPIO/example app. + * See remote_hardware.proto/HardwareMessage for details on the message sent/received to this port number + * ENCODING: Protobuf + * + * @generated from enum value: REMOTE_HARDWARE_APP = 2; + */ + REMOTE_HARDWARE_APP = 2, + + /** + * + * The built-in position messaging app. + * Payload is a Position message. + * ENCODING: Protobuf + * + * @generated from enum value: POSITION_APP = 3; + */ + POSITION_APP = 3, + + /** + * + * The built-in user info app. + * Payload is a User message. + * ENCODING: Protobuf + * + * @generated from enum value: NODEINFO_APP = 4; + */ + NODEINFO_APP = 4, + + /** + * + * Protocol control packets for mesh protocol use. + * Payload is a Routing message. + * ENCODING: Protobuf + * + * @generated from enum value: ROUTING_APP = 5; + */ + ROUTING_APP = 5, + + /** + * + * Admin control packets. + * Payload is a AdminMessage message. + * ENCODING: Protobuf + * + * @generated from enum value: ADMIN_APP = 6; + */ + ADMIN_APP = 6, + + /** + * + * Compressed TEXT_MESSAGE payloads. + * ENCODING: UTF-8 Plaintext (?) with Unishox2 Compression + * NOTE: The Device Firmware converts a TEXT_MESSAGE_APP to TEXT_MESSAGE_COMPRESSED_APP if the compressed + * payload is shorter. There's no need for app developers to do this themselves. Also the firmware will decompress + * any incoming TEXT_MESSAGE_COMPRESSED_APP payload and convert to TEXT_MESSAGE_APP. + * + * @generated from enum value: TEXT_MESSAGE_COMPRESSED_APP = 7; + */ + TEXT_MESSAGE_COMPRESSED_APP = 7, + + /** + * + * Waypoint payloads. + * Payload is a Waypoint message. + * ENCODING: Protobuf + * + * @generated from enum value: WAYPOINT_APP = 8; + */ + WAYPOINT_APP = 8, + + /** + * + * Audio Payloads. + * Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now + * ENCODING: codec2 audio frames + * NOTE: audio frames contain a 3 byte header (0xc0 0xde 0xc2) and a one byte marker for the decompressed bitrate. + * This marker comes from the 'moduleConfig.audio.bitrate' enum minus one. + * + * @generated from enum value: AUDIO_APP = 9; + */ + AUDIO_APP = 9, + + /** + * + * Same as Text Message but originating from Detection Sensor Module. + * NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 + * + * @generated from enum value: DETECTION_SENSOR_APP = 10; + */ + DETECTION_SENSOR_APP = 10, + + /** + * + * Same as Text Message but used for critical alerts. + * + * @generated from enum value: ALERT_APP = 11; + */ + ALERT_APP = 11, + + /** + * + * Module/port for handling key verification requests. + * + * @generated from enum value: KEY_VERIFICATION_APP = 12; + */ + KEY_VERIFICATION_APP = 12, + + /** + * + * Module/port for handling primitive remote shell access. + * + * @generated from enum value: REMOTE_SHELL_APP = 13; + */ + REMOTE_SHELL_APP = 13, + + /** + * + * Provides a 'ping' service that replies to any packet it receives. + * Also serves as a small example module. + * ENCODING: ASCII Plaintext + * + * @generated from enum value: REPLY_APP = 32; + */ + REPLY_APP = 32, + + /** + * + * Used for the python IP tunnel feature + * ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on. + * + * @generated from enum value: IP_TUNNEL_APP = 33; + */ + IP_TUNNEL_APP = 33, + + /** + * + * Paxcounter lib included in the firmware + * ENCODING: protobuf + * + * @generated from enum value: PAXCOUNTER_APP = 34; + */ + PAXCOUNTER_APP = 34, + + /** + * + * Store and Forward++ module included in the firmware + * ENCODING: protobuf + * This module is specifically for Native Linux nodes, and provides a Git-style + * chain of messages. + * + * @generated from enum value: STORE_FORWARD_PLUSPLUS_APP = 35; + */ + STORE_FORWARD_PLUSPLUS_APP = 35, + + /** + * + * Node Status module + * ENCODING: protobuf + * This module allows setting an extra string of status for a node. + * Broadcasts on change and on a timer, possibly once a day. + * + * @generated from enum value: NODE_STATUS_APP = 36; + */ + NODE_STATUS_APP = 36, + + /** + * + * Provides a hardware serial interface to send and receive from the Meshtastic network. + * Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic + * network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network. + * Maximum packet size of 240 bytes. + * Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp. + * ENCODING: binary undefined + * + * @generated from enum value: SERIAL_APP = 64; + */ + SERIAL_APP = 64, + + /** + * + * STORE_FORWARD_APP (Work in Progress) + * Maintained by Jm Casler (MC Hamster) : jm@casler.org + * ENCODING: Protobuf + * + * @generated from enum value: STORE_FORWARD_APP = 65; + */ + STORE_FORWARD_APP = 65, + + /** + * + * Optional port for messages for the range test module. + * ENCODING: ASCII Plaintext + * NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 + * + * @generated from enum value: RANGE_TEST_APP = 66; + */ + RANGE_TEST_APP = 66, + + /** + * + * Provides a format to send and receive telemetry data from the Meshtastic network. + * Maintained by Charles Crossan (crossan007) : crossan007@gmail.com + * ENCODING: Protobuf + * + * @generated from enum value: TELEMETRY_APP = 67; + */ + TELEMETRY_APP = 67, + + /** + * + * Experimental tools for estimating node position without a GPS + * Maintained by Github user a-f-G-U-C (a Meshtastic contributor) + * Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS + * ENCODING: arrays of int64 fields + * + * @generated from enum value: ZPS_APP = 68; + */ + ZPS_APP = 68, + + /** + * + * Used to let multiple instances of Linux native applications communicate + * as if they did using their LoRa chip. + * Maintained by GitHub user GUVWAF. + * Project files at https://github.com/GUVWAF/Meshtasticator + * ENCODING: Protobuf (?) + * + * @generated from enum value: SIMULATOR_APP = 69; + */ + SIMULATOR_APP = 69, + + /** + * + * Provides a traceroute functionality to show the route a packet towards + * a certain destination would take on the mesh. Contains a RouteDiscovery message as payload. + * ENCODING: Protobuf + * + * @generated from enum value: TRACEROUTE_APP = 70; + */ + TRACEROUTE_APP = 70, + + /** + * + * Aggregates edge info for the network by sending out a list of each node's neighbors + * ENCODING: Protobuf + * + * @generated from enum value: NEIGHBORINFO_APP = 71; + */ + NEIGHBORINFO_APP = 71, + + /** + * + * ATAK Plugin + * Portnum for payloads from the official Meshtastic ATAK plugin + * + * @generated from enum value: ATAK_PLUGIN = 72; + */ + ATAK_PLUGIN = 72, + + /** + * + * Provides unencrypted information about a node for consumption by a map via MQTT + * + * @generated from enum value: MAP_REPORT_APP = 73; + */ + MAP_REPORT_APP = 73, + + /** + * + * PowerStress based monitoring support (for automated power consumption testing) + * + * @generated from enum value: POWERSTRESS_APP = 74; + */ + POWERSTRESS_APP = 74, + + /** + * + * LoraWAN Payload Transport + * ENCODING: compact binary LoRaWAN uplink (10-byte RF metadata + PHY payload) - see LoRaWANBridgeModule + * + * @generated from enum value: LORAWAN_BRIDGE = 75; + */ + LORAWAN_BRIDGE = 75, + + /** + * + * Reticulum Network Stack Tunnel App + * ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface + * + * @generated from enum value: RETICULUM_TUNNEL_APP = 76; + */ + RETICULUM_TUNNEL_APP = 76, + + /** + * + * App for transporting Cayenne Low Power Payload, popular for LoRaWAN sensor nodes. Offers ability to send + * arbitrary telemetry over meshtastic that is not covered by telemetry.proto + * ENCODING: CayenneLLP + * + * @generated from enum value: CAYENNE_APP = 77; + */ + CAYENNE_APP = 77, + + /** + * + * ATAK Plugin V2 + * Portnum for payloads from the official Meshtastic ATAK plugin using + * TAKPacketV2 with zstd dictionary compression. + * + * @generated from enum value: ATAK_PLUGIN_V2 = 78; + */ + ATAK_PLUGIN_V2 = 78, + + /** + * + * GroupAlarm integration + * Used for transporting GroupAlarm-related messages between Meshtastic nodes + * and companion applications/services. + * + * @generated from enum value: GROUPALARM_APP = 112; + */ + GROUPALARM_APP = 112, + + /** + * + * Private applications should use portnums >= 256. + * To simplify initial development and testing you can use "PRIVATE_APP" + * in your code without needing to rebuild protobuf files (via [regen-protos.sh](https://github.com/meshtastic/firmware/blob/master/bin/regen-protos.sh)) + * + * @generated from enum value: PRIVATE_APP = 256; + */ + PRIVATE_APP = 256, + + /** + * + * ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder + * ENCODING: libcotshrink + * + * @generated from enum value: ATAK_FORWARDER = 257; + */ + ATAK_FORWARDER = 257, + + /** + * + * Currently we limit port nums to no higher than this value + * + * @generated from enum value: MAX = 511; + */ + MAX = 511, +} + +/** + * Describes the enum meshtastic.PortNum. + */ +export const PortNumSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_portnums, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/powermon_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/powermon_pb.ts new file mode 100644 index 00000000..5a22ce62 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/powermon_pb.ts @@ -0,0 +1,308 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/powermon.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/powermon.proto. + */ +export const file_meshtastic_powermon: GenFile = /*@__PURE__*/ + fileDesc("ChltZXNodGFzdGljL3Bvd2VybW9uLnByb3RvEgptZXNodGFzdGljIuABCghQb3dlck1vbiLTAQoFU3RhdGUSCAoETm9uZRAAEhEKDUNQVV9EZWVwU2xlZXAQARISCg5DUFVfTGlnaHRTbGVlcBACEgwKCFZleHQxX09uEAQSDQoJTG9yYV9SWE9uEAgSDQoJTG9yYV9UWE9uEBASEQoNTG9yYV9SWEFjdGl2ZRAgEgkKBUJUX09uEEASCwoGTEVEX09uEIABEg4KCVNjcmVlbl9PbhCAAhITCg5TY3JlZW5fRHJhd2luZxCABBIMCgdXaWZpX09uEIAIEg8KCkdQU19BY3RpdmUQgBAi/wIKElBvd2VyU3RyZXNzTWVzc2FnZRIyCgNjbWQYASABKA4yJS5tZXNodGFzdGljLlBvd2VyU3RyZXNzTWVzc2FnZS5PcGNvZGUSEwoLbnVtX3NlY29uZHMYAiABKAIinwIKBk9wY29kZRIJCgVVTlNFVBAAEg4KClBSSU5UX0lORk8QARIPCgtGT1JDRV9RVUlFVBACEg0KCUVORF9RVUlFVBADEg0KCVNDUkVFTl9PThAQEg4KClNDUkVFTl9PRkYQERIMCghDUFVfSURMRRAgEhEKDUNQVV9ERUVQU0xFRVAQIRIOCgpDUFVfRlVMTE9OECISCgoGTEVEX09OEDASCwoHTEVEX09GRhAxEgwKCExPUkFfT0ZGEEASCwoHTE9SQV9UWBBBEgsKB0xPUkFfUlgQQhIKCgZCVF9PRkYQUBIJCgVCVF9PThBREgwKCFdJRklfT0ZGEGASCwoHV0lGSV9PThBhEgsKB0dQU19PRkYQcBIKCgZHUFNfT04QcUJkChRvcmcubWVzaHRhc3RpYy5wcm90b0IOUG93ZXJNb25Qcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs). + * But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) + * + * @generated from message meshtastic.PowerMon + */ +export type PowerMon = Message<"meshtastic.PowerMon"> & { +}; + +/** + * Describes the message meshtastic.PowerMon. + * Use `create(PowerMonSchema)` to create a new message. + */ +export const PowerMonSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_powermon, 0); + +/** + * Any significant power changing event in meshtastic should be tagged with a powermon state transition. + * If you are making new meshtastic features feel free to add new entries at the end of this definition. + * + * @generated from enum meshtastic.PowerMon.State + */ +export enum PowerMon_State { + /** + * @generated from enum value: None = 0; + */ + None = 0, + + /** + * @generated from enum value: CPU_DeepSleep = 1; + */ + CPU_DeepSleep = 1, + + /** + * @generated from enum value: CPU_LightSleep = 2; + */ + CPU_LightSleep = 2, + + /** + * + * The external Vext1 power is on. Many boards have auxillary power rails that the CPU turns on only + * occasionally. In cases where that rail has multiple devices on it we usually want to have logging on + * the state of that rail as an independent record. + * For instance on the Heltec Tracker 1.1 board, this rail is the power source for the GPS and screen. + * + * The log messages will be short and complete (see PowerMon.Event in the protobufs for details). + * something like "S:PM:C,0x00001234,REASON" where the hex number is the bitmask of all current states. + * (We use a bitmask for states so that if a log message gets lost it won't be fatal) + * + * @generated from enum value: Vext1_On = 4; + */ + Vext1_On = 4, + + /** + * @generated from enum value: Lora_RXOn = 8; + */ + Lora_RXOn = 8, + + /** + * @generated from enum value: Lora_TXOn = 16; + */ + Lora_TXOn = 16, + + /** + * @generated from enum value: Lora_RXActive = 32; + */ + Lora_RXActive = 32, + + /** + * @generated from enum value: BT_On = 64; + */ + BT_On = 64, + + /** + * @generated from enum value: LED_On = 128; + */ + LED_On = 128, + + /** + * @generated from enum value: Screen_On = 256; + */ + Screen_On = 256, + + /** + * @generated from enum value: Screen_Drawing = 512; + */ + Screen_Drawing = 512, + + /** + * @generated from enum value: Wifi_On = 1024; + */ + Wifi_On = 1024, + + /** + * + * GPS is actively trying to find our location + * See GPSPowerState for more details + * + * @generated from enum value: GPS_Active = 2048; + */ + GPS_Active = 2048, +} + +/** + * Describes the enum meshtastic.PowerMon.State. + */ +export const PowerMon_StateSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_powermon, 0, 0); + +/** + * + * PowerStress testing support via the C++ PowerStress module + * + * @generated from message meshtastic.PowerStressMessage + */ +export type PowerStressMessage = Message<"meshtastic.PowerStressMessage"> & { + /** + * + * What type of HardwareMessage is this? + * + * @generated from field: meshtastic.PowerStressMessage.Opcode cmd = 1; + */ + cmd: PowerStressMessage_Opcode; + + /** + * @generated from field: float num_seconds = 2; + */ + numSeconds: number; +}; + +/** + * Describes the message meshtastic.PowerStressMessage. + * Use `create(PowerStressMessageSchema)` to create a new message. + */ +export const PowerStressMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_powermon, 1); + +/** + * + * What operation would we like the UUT to perform. + * note: senders should probably set want_response in their request packets, so that they can know when the state + * machine has started processing their request + * + * @generated from enum meshtastic.PowerStressMessage.Opcode + */ +export enum PowerStressMessage_Opcode { + /** + * + * Unset/unused + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * Print board version slog and send an ack that we are alive and ready to process commands + * + * @generated from enum value: PRINT_INFO = 1; + */ + PRINT_INFO = 1, + + /** + * Try to turn off all automatic processing of packets, screen, sleeping, etc (to make it easier to measure in isolation) + * + * @generated from enum value: FORCE_QUIET = 2; + */ + FORCE_QUIET = 2, + + /** + * Stop powerstress processing - probably by just rebooting the board + * + * @generated from enum value: END_QUIET = 3; + */ + END_QUIET = 3, + + /** + * Turn the screen on + * + * @generated from enum value: SCREEN_ON = 16; + */ + SCREEN_ON = 16, + + /** + * Turn the screen off + * + * @generated from enum value: SCREEN_OFF = 17; + */ + SCREEN_OFF = 17, + + /** + * Let the CPU run but we assume mostly idling for num_seconds + * + * @generated from enum value: CPU_IDLE = 32; + */ + CPU_IDLE = 32, + + /** + * Force deep sleep for FIXME seconds + * + * @generated from enum value: CPU_DEEPSLEEP = 33; + */ + CPU_DEEPSLEEP = 33, + + /** + * Spin the CPU as fast as possible for num_seconds + * + * @generated from enum value: CPU_FULLON = 34; + */ + CPU_FULLON = 34, + + /** + * Turn the LED on for num_seconds (and leave it on - for baseline power measurement purposes) + * + * @generated from enum value: LED_ON = 48; + */ + LED_ON = 48, + + /** + * Force the LED off for num_seconds + * + * @generated from enum value: LED_OFF = 49; + */ + LED_OFF = 49, + + /** + * Completely turn off the LORA radio for num_seconds + * + * @generated from enum value: LORA_OFF = 64; + */ + LORA_OFF = 64, + + /** + * Send Lora packets for num_seconds + * + * @generated from enum value: LORA_TX = 65; + */ + LORA_TX = 65, + + /** + * Receive Lora packets for num_seconds (node will be mostly just listening, unless an external agent is helping stress this by sending packets on the current channel) + * + * @generated from enum value: LORA_RX = 66; + */ + LORA_RX = 66, + + /** + * Turn off the BT radio for num_seconds + * + * @generated from enum value: BT_OFF = 80; + */ + BT_OFF = 80, + + /** + * Turn on the BT radio for num_seconds + * + * @generated from enum value: BT_ON = 81; + */ + BT_ON = 81, + + /** + * Turn off the WIFI radio for num_seconds + * + * @generated from enum value: WIFI_OFF = 96; + */ + WIFI_OFF = 96, + + /** + * Turn on the WIFI radio for num_seconds + * + * @generated from enum value: WIFI_ON = 97; + */ + WIFI_ON = 97, + + /** + * Turn off the GPS radio for num_seconds + * + * @generated from enum value: GPS_OFF = 112; + */ + GPS_OFF = 112, + + /** + * Turn on the GPS radio for num_seconds + * + * @generated from enum value: GPS_ON = 113; + */ + GPS_ON = 113, +} + +/** + * Describes the enum meshtastic.PowerStressMessage.Opcode. + */ +export const PowerStressMessage_OpcodeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_powermon, 1, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/remote_hardware_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/remote_hardware_pb.ts new file mode 100644 index 00000000..f7639e8d --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/remote_hardware_pb.ts @@ -0,0 +1,126 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/remote_hardware.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/remote_hardware.proto. + */ +export const file_meshtastic_remote_hardware: GenFile = /*@__PURE__*/ + fileDesc("CiBtZXNodGFzdGljL3JlbW90ZV9oYXJkd2FyZS5wcm90bxIKbWVzaHRhc3RpYyLWAQoPSGFyZHdhcmVNZXNzYWdlEi4KBHR5cGUYASABKA4yIC5tZXNodGFzdGljLkhhcmR3YXJlTWVzc2FnZS5UeXBlEhEKCWdwaW9fbWFzaxgCIAEoBBISCgpncGlvX3ZhbHVlGAMgASgEImwKBFR5cGUSCQoFVU5TRVQQABIPCgtXUklURV9HUElPUxABEg8KC1dBVENIX0dQSU9TEAISEQoNR1BJT1NfQ0hBTkdFRBADEg4KClJFQURfR1BJT1MQBBIUChBSRUFEX0dQSU9TX1JFUExZEAVCZAoUb3JnLm1lc2h0YXN0aWMucHJvdG9CDlJlbW90ZUhhcmR3YXJlWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw"); + +/** + * + * An example app to show off the module system. This message is used for + * REMOTE_HARDWARE_APP PortNums. + * Also provides easy remote access to any GPIO. + * In the future other remote hardware operations can be added based on user interest + * (i.e. serial output, spi/i2c input/output). + * FIXME - currently this feature is turned on by default which is dangerous + * because no security yet (beyond the channel mechanism). + * It should be off by default and then protected based on some TBD mechanism + * (a special channel once multichannel support is included?) + * + * @generated from message meshtastic.HardwareMessage + */ +export type HardwareMessage = Message<"meshtastic.HardwareMessage"> & { + /** + * + * What type of HardwareMessage is this? + * + * @generated from field: meshtastic.HardwareMessage.Type type = 1; + */ + type: HardwareMessage_Type; + + /** + * + * What gpios are we changing. Not used for all MessageTypes, see MessageType for details + * + * @generated from field: uint64 gpio_mask = 2; + */ + gpioMask: bigint; + + /** + * + * For gpios that were listed in gpio_mask as valid, what are the signal levels for those gpios. + * Not used for all MessageTypes, see MessageType for details + * + * @generated from field: uint64 gpio_value = 3; + */ + gpioValue: bigint; +}; + +/** + * Describes the message meshtastic.HardwareMessage. + * Use `create(HardwareMessageSchema)` to create a new message. + */ +export const HardwareMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_remote_hardware, 0); + +/** + * + * TODO: REPLACE + * + * @generated from enum meshtastic.HardwareMessage.Type + */ +export enum HardwareMessage_Type { + /** + * + * Unset/unused + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * Set gpio gpios based on gpio_mask/gpio_value + * + * @generated from enum value: WRITE_GPIOS = 1; + */ + WRITE_GPIOS = 1, + + /** + * + * We are now interested in watching the gpio_mask gpios. + * If the selected gpios change, please broadcast GPIOS_CHANGED. + * Will implicitly change the gpios requested to be INPUT gpios. + * + * @generated from enum value: WATCH_GPIOS = 2; + */ + WATCH_GPIOS = 2, + + /** + * + * The gpios listed in gpio_mask have changed, the new values are listed in gpio_value + * + * @generated from enum value: GPIOS_CHANGED = 3; + */ + GPIOS_CHANGED = 3, + + /** + * + * Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated + * + * @generated from enum value: READ_GPIOS = 4; + */ + READ_GPIOS = 4, + + /** + * + * A reply to READ_GPIOS. gpio_mask and gpio_value will be populated + * + * @generated from enum value: READ_GPIOS_REPLY = 5; + */ + READ_GPIOS_REPLY = 5, +} + +/** + * Describes the enum meshtastic.HardwareMessage.Type. + */ +export const HardwareMessage_TypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_remote_hardware, 0, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/rtttl_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/rtttl_pb.ts new file mode 100644 index 00000000..b67a39e0 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/rtttl_pb.ts @@ -0,0 +1,37 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/rtttl.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/rtttl.proto. + */ +export const file_meshtastic_rtttl: GenFile = /*@__PURE__*/ + fileDesc("ChZtZXNodGFzdGljL3J0dHRsLnByb3RvEgptZXNodGFzdGljIh8KC1JUVFRMQ29uZmlnEhAKCHJpbmd0b25lGAEgASgJQmcKFG9yZy5tZXNodGFzdGljLnByb3RvQhFSVFRUTENvbmZpZ1Byb3Rvc1oiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZKoCFE1lc2h0YXN0aWMuUHJvdG9idWZzugIAYgZwcm90bzM"); + +/** + * + * Canned message module configuration. + * + * @generated from message meshtastic.RTTTLConfig + */ +export type RTTTLConfig = Message<"meshtastic.RTTTLConfig"> & { + /** + * + * Ringtone for PWM Buzzer in RTTTL Format. + * + * @generated from field: string ringtone = 1; + */ + ringtone: string; +}; + +/** + * Describes the message meshtastic.RTTTLConfig. + * Use `create(RTTTLConfigSchema)` to create a new message. + */ +export const RTTTLConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_rtttl, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/serial_hal_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/serial_hal_pb.ts new file mode 100644 index 00000000..ba489f19 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/serial_hal_pb.ts @@ -0,0 +1,188 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/serial_hal.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/serial_hal.proto. + */ +export const file_meshtastic_serial_hal: GenFile = /*@__PURE__*/ + fileDesc("ChttZXNodGFzdGljL3NlcmlhbF9oYWwucHJvdG8SCm1lc2h0YXN0aWMiogIKEFNlcmlhbEhhbENvbW1hbmQSFgoOdHJhbnNhY3Rpb25faWQYASABKA0SLwoEdHlwZRgCIAEoDjIhLm1lc2h0YXN0aWMuU2VyaWFsSGFsQ29tbWFuZC5UeXBlEgsKA3BpbhgDIAEoDRINCgV2YWx1ZRgEIAEoDRIMCgRtb2RlGAUgASgNEgwKBGRhdGEYBiABKAwijAEKBFR5cGUSCQoFVU5TRVQQABIMCghQSU5fTU9ERRABEhEKDURJR0lUQUxfV1JJVEUQAhIQCgxESUdJVEFMX1JFQUQQAxIUChBBVFRBQ0hfSU5URVJSVVBUEAQSFAoQREVUQUNIX0lOVEVSUlVQVBAFEhAKDFNQSV9UUkFOU0ZFUhAGEggKBE5PT1AQByLMAQoRU2VyaWFsSGFsUmVzcG9uc2USFgoOdHJhbnNhY3Rpb25faWQYASABKA0SNAoGcmVzdWx0GAIgASgOMiQubWVzaHRhc3RpYy5TZXJpYWxIYWxSZXNwb25zZS5SZXN1bHQSDQoFdmFsdWUYAyABKA0SDAoEZGF0YRgEIAEoDBINCgVlcnJvchgFIAEoCSI9CgZSZXN1bHQSBgoCT0sQABIJCgVFUlJPUhABEg8KC0JBRF9SRVFVRVNUEAISDwoLVU5TVVBQT1JURUQQA0JfChRvcmcubWVzaHRhc3RpYy5wcm90b0IJU2VyaWFsSGFsWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw"); + +/** + * @generated from message meshtastic.SerialHalCommand + */ +export type SerialHalCommand = Message<"meshtastic.SerialHalCommand"> & { + /** + * Host-assigned request id. Replies echo this id back in + * SerialHalResponse.transaction_id. + * + * @generated from field: uint32 transaction_id = 1; + */ + transactionId: number; + + /** + * @generated from field: meshtastic.SerialHalCommand.Type type = 2; + */ + type: SerialHalCommand_Type; + + /** + * @generated from field: uint32 pin = 3; + */ + pin: number; + + /** + * @generated from field: uint32 value = 4; + */ + value: number; + + /** + * @generated from field: uint32 mode = 5; + */ + mode: number; + + /** + * @generated from field: bytes data = 6; + */ + data: Uint8Array; +}; + +/** + * Describes the message meshtastic.SerialHalCommand. + * Use `create(SerialHalCommandSchema)` to create a new message. + */ +export const SerialHalCommandSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_serial_hal, 0); + +/** + * @generated from enum meshtastic.SerialHalCommand.Type + */ +export enum SerialHalCommand_Type { + /** + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * @generated from enum value: PIN_MODE = 1; + */ + PIN_MODE = 1, + + /** + * @generated from enum value: DIGITAL_WRITE = 2; + */ + DIGITAL_WRITE = 2, + + /** + * @generated from enum value: DIGITAL_READ = 3; + */ + DIGITAL_READ = 3, + + /** + * @generated from enum value: ATTACH_INTERRUPT = 4; + */ + ATTACH_INTERRUPT = 4, + + /** + * @generated from enum value: DETACH_INTERRUPT = 5; + */ + DETACH_INTERRUPT = 5, + + /** + * @generated from enum value: SPI_TRANSFER = 6; + */ + SPI_TRANSFER = 6, + + /** + * @generated from enum value: NOOP = 7; + */ + NOOP = 7, +} + +/** + * Describes the enum meshtastic.SerialHalCommand.Type. + */ +export const SerialHalCommand_TypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_serial_hal, 0, 0); + +/** + * @generated from message meshtastic.SerialHalResponse + */ +export type SerialHalResponse = Message<"meshtastic.SerialHalResponse"> & { + /** + * Matches the originating SerialHalCommand.transaction_id for normal + * request/response traffic. + * + * A value of 0 indicates an unsolicited interrupt notification generated by + * the device. In that case, the host should interpret value as the GPIO pin + * that triggered. + * + * @generated from field: uint32 transaction_id = 1; + */ + transactionId: number; + + /** + * @generated from field: meshtastic.SerialHalResponse.Result result = 2; + */ + result: SerialHalResponse_Result; + + /** + * Used by DIGITAL_READ replies and interrupt notifications. For interrupt + * notifications (transaction_id == 0), this carries the pin number. + * + * @generated from field: uint32 value = 3; + */ + value: number; + + /** + * @generated from field: bytes data = 4; + */ + data: Uint8Array; + + /** + * @generated from field: string error = 5; + */ + error: string; +}; + +/** + * Describes the message meshtastic.SerialHalResponse. + * Use `create(SerialHalResponseSchema)` to create a new message. + */ +export const SerialHalResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_serial_hal, 1); + +/** + * @generated from enum meshtastic.SerialHalResponse.Result + */ +export enum SerialHalResponse_Result { + /** + * @generated from enum value: OK = 0; + */ + OK = 0, + + /** + * @generated from enum value: ERROR = 1; + */ + ERROR = 1, + + /** + * @generated from enum value: BAD_REQUEST = 2; + */ + BAD_REQUEST = 2, + + /** + * @generated from enum value: UNSUPPORTED = 3; + */ + UNSUPPORTED = 3, +} + +/** + * Describes the enum meshtastic.SerialHalResponse.Result. + */ +export const SerialHalResponse_ResultSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_serial_hal, 1, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/storeforward_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/storeforward_pb.ts new file mode 100644 index 00000000..71040b28 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/storeforward_pb.ts @@ -0,0 +1,384 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/storeforward.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/storeforward.proto. + */ +export const file_meshtastic_storeforward: GenFile = /*@__PURE__*/ + fileDesc("Ch1tZXNodGFzdGljL3N0b3JlZm9yd2FyZC5wcm90bxIKbWVzaHRhc3RpYyKcBwoPU3RvcmVBbmRGb3J3YXJkEjcKAnJyGAEgASgOMisubWVzaHRhc3RpYy5TdG9yZUFuZEZvcndhcmQuUmVxdWVzdFJlc3BvbnNlEjcKBXN0YXRzGAIgASgLMiYubWVzaHRhc3RpYy5TdG9yZUFuZEZvcndhcmQuU3RhdGlzdGljc0gAEjYKB2hpc3RvcnkYAyABKAsyIy5tZXNodGFzdGljLlN0b3JlQW5kRm9yd2FyZC5IaXN0b3J5SAASOgoJaGVhcnRiZWF0GAQgASgLMiUubWVzaHRhc3RpYy5TdG9yZUFuZEZvcndhcmQuSGVhcnRiZWF0SAASDgoEdGV4dBgFIAEoDEgAGs0BCgpTdGF0aXN0aWNzEhYKDm1lc3NhZ2VzX3RvdGFsGAEgASgNEhYKDm1lc3NhZ2VzX3NhdmVkGAIgASgNEhQKDG1lc3NhZ2VzX21heBgDIAEoDRIPCgd1cF90aW1lGAQgASgNEhAKCHJlcXVlc3RzGAUgASgNEhgKEHJlcXVlc3RzX2hpc3RvcnkYBiABKA0SEQoJaGVhcnRiZWF0GAcgASgIEhIKCnJldHVybl9tYXgYCCABKA0SFQoNcmV0dXJuX3dpbmRvdxgJIAEoDRpJCgdIaXN0b3J5EhgKEGhpc3RvcnlfbWVzc2FnZXMYASABKA0SDgoGd2luZG93GAIgASgNEhQKDGxhc3RfcmVxdWVzdBgDIAEoDRouCglIZWFydGJlYXQSDgoGcGVyaW9kGAEgASgNEhEKCXNlY29uZGFyeRgCIAEoDSK8AgoPUmVxdWVzdFJlc3BvbnNlEgkKBVVOU0VUEAASEAoMUk9VVEVSX0VSUk9SEAESFAoQUk9VVEVSX0hFQVJUQkVBVBACEg8KC1JPVVRFUl9QSU5HEAMSDwoLUk9VVEVSX1BPTkcQBBIPCgtST1VURVJfQlVTWRAFEhIKDlJPVVRFUl9ISVNUT1JZEAYSEAoMUk9VVEVSX1NUQVRTEAcSFgoSUk9VVEVSX1RFWFRfRElSRUNUEAgSGQoVUk9VVEVSX1RFWFRfQlJPQURDQVNUEAkSEAoMQ0xJRU5UX0VSUk9SEEASEgoOQ0xJRU5UX0hJU1RPUlkQQRIQCgxDTElFTlRfU1RBVFMQQhIPCgtDTElFTlRfUElORxBDEg8KC0NMSUVOVF9QT05HEEQSEAoMQ0xJRU5UX0FCT1JUEGpCCQoHdmFyaWFudEJrChRvcmcubWVzaHRhc3RpYy5wcm90b0IVU3RvcmVBbmRGb3J3YXJkUHJvdG9zWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw"); + +/** + * + * TODO: REPLACE + * + * @generated from message meshtastic.StoreAndForward + */ +export type StoreAndForward = Message<"meshtastic.StoreAndForward"> & { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.StoreAndForward.RequestResponse rr = 1; + */ + rr: StoreAndForward_RequestResponse; + + /** + * + * TODO: REPLACE + * + * @generated from oneof meshtastic.StoreAndForward.variant + */ + variant: { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.StoreAndForward.Statistics stats = 2; + */ + value: StoreAndForward_Statistics; + case: "stats"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.StoreAndForward.History history = 3; + */ + value: StoreAndForward_History; + case: "history"; + } | { + /** + * + * TODO: REPLACE + * + * @generated from field: meshtastic.StoreAndForward.Heartbeat heartbeat = 4; + */ + value: StoreAndForward_Heartbeat; + case: "heartbeat"; + } | { + /** + * + * Text from history message. + * + * @generated from field: bytes text = 5; + */ + value: Uint8Array; + case: "text"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.StoreAndForward. + * Use `create(StoreAndForwardSchema)` to create a new message. + */ +export const StoreAndForwardSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_storeforward, 0); + +/** + * + * TODO: REPLACE + * + * @generated from message meshtastic.StoreAndForward.Statistics + */ +export type StoreAndForward_Statistics = Message<"meshtastic.StoreAndForward.Statistics"> & { + /** + * + * Number of messages we have ever seen + * + * @generated from field: uint32 messages_total = 1; + */ + messagesTotal: number; + + /** + * + * Number of messages we have currently saved our history. + * + * @generated from field: uint32 messages_saved = 2; + */ + messagesSaved: number; + + /** + * + * Maximum number of messages we will save + * + * @generated from field: uint32 messages_max = 3; + */ + messagesMax: number; + + /** + * + * Router uptime in seconds + * + * @generated from field: uint32 up_time = 4; + */ + upTime: number; + + /** + * + * Number of times any client sent a request to the S&F. + * + * @generated from field: uint32 requests = 5; + */ + requests: number; + + /** + * + * Number of times the history was requested. + * + * @generated from field: uint32 requests_history = 6; + */ + requestsHistory: number; + + /** + * + * Is the heartbeat enabled on the server? + * + * @generated from field: bool heartbeat = 7; + */ + heartbeat: boolean; + + /** + * + * Maximum number of messages the server will return. + * + * @generated from field: uint32 return_max = 8; + */ + returnMax: number; + + /** + * + * Maximum history window in minutes the server will return messages from. + * + * @generated from field: uint32 return_window = 9; + */ + returnWindow: number; +}; + +/** + * Describes the message meshtastic.StoreAndForward.Statistics. + * Use `create(StoreAndForward_StatisticsSchema)` to create a new message. + */ +export const StoreAndForward_StatisticsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_storeforward, 0, 0); + +/** + * + * TODO: REPLACE + * + * @generated from message meshtastic.StoreAndForward.History + */ +export type StoreAndForward_History = Message<"meshtastic.StoreAndForward.History"> & { + /** + * + * Number of that will be sent to the client + * + * @generated from field: uint32 history_messages = 1; + */ + historyMessages: number; + + /** + * + * The window of messages that was used to filter the history client requested + * + * @generated from field: uint32 window = 2; + */ + window: number; + + /** + * + * Index in the packet history of the last message sent in a previous request to the server. + * Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server already sent to the client. + * + * @generated from field: uint32 last_request = 3; + */ + lastRequest: number; +}; + +/** + * Describes the message meshtastic.StoreAndForward.History. + * Use `create(StoreAndForward_HistorySchema)` to create a new message. + */ +export const StoreAndForward_HistorySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_storeforward, 0, 1); + +/** + * + * TODO: REPLACE + * + * @generated from message meshtastic.StoreAndForward.Heartbeat + */ +export type StoreAndForward_Heartbeat = Message<"meshtastic.StoreAndForward.Heartbeat"> & { + /** + * + * Period in seconds that the heartbeat is sent out that will be sent to the client + * + * @generated from field: uint32 period = 1; + */ + period: number; + + /** + * + * If set, this is not the primary Store & Forward router on the mesh + * + * @generated from field: uint32 secondary = 2; + */ + secondary: number; +}; + +/** + * Describes the message meshtastic.StoreAndForward.Heartbeat. + * Use `create(StoreAndForward_HeartbeatSchema)` to create a new message. + */ +export const StoreAndForward_HeartbeatSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_storeforward, 0, 2); + +/** + * + * 001 - 063 = From Router + * 064 - 127 = From Client + * + * @generated from enum meshtastic.StoreAndForward.RequestResponse + */ +export enum StoreAndForward_RequestResponse { + /** + * + * Unset/unused + * + * @generated from enum value: UNSET = 0; + */ + UNSET = 0, + + /** + * + * Router is an in error state. + * + * @generated from enum value: ROUTER_ERROR = 1; + */ + ROUTER_ERROR = 1, + + /** + * + * Router heartbeat + * + * @generated from enum value: ROUTER_HEARTBEAT = 2; + */ + ROUTER_HEARTBEAT = 2, + + /** + * + * Router has requested the client respond. This can work as a + * "are you there" message. + * + * @generated from enum value: ROUTER_PING = 3; + */ + ROUTER_PING = 3, + + /** + * + * The response to a "Ping" + * + * @generated from enum value: ROUTER_PONG = 4; + */ + ROUTER_PONG = 4, + + /** + * + * Router is currently busy. Please try again later. + * + * @generated from enum value: ROUTER_BUSY = 5; + */ + ROUTER_BUSY = 5, + + /** + * + * Router is responding to a request for history. + * + * @generated from enum value: ROUTER_HISTORY = 6; + */ + ROUTER_HISTORY = 6, + + /** + * + * Router is responding to a request for stats. + * + * @generated from enum value: ROUTER_STATS = 7; + */ + ROUTER_STATS = 7, + + /** + * + * Router sends a text message from its history that was a direct message. + * + * @generated from enum value: ROUTER_TEXT_DIRECT = 8; + */ + ROUTER_TEXT_DIRECT = 8, + + /** + * + * Router sends a text message from its history that was a broadcast. + * + * @generated from enum value: ROUTER_TEXT_BROADCAST = 9; + */ + ROUTER_TEXT_BROADCAST = 9, + + /** + * + * Client is an in error state. + * + * @generated from enum value: CLIENT_ERROR = 64; + */ + CLIENT_ERROR = 64, + + /** + * + * Client has requested a replay from the router. + * + * @generated from enum value: CLIENT_HISTORY = 65; + */ + CLIENT_HISTORY = 65, + + /** + * + * Client has requested stats from the router. + * + * @generated from enum value: CLIENT_STATS = 66; + */ + CLIENT_STATS = 66, + + /** + * + * Client has requested the router respond. This can work as a + * "are you there" message. + * + * @generated from enum value: CLIENT_PING = 67; + */ + CLIENT_PING = 67, + + /** + * + * The response to a "Ping" + * + * @generated from enum value: CLIENT_PONG = 68; + */ + CLIENT_PONG = 68, + + /** + * + * Client has requested that the router abort processing the client's request + * + * @generated from enum value: CLIENT_ABORT = 106; + */ + CLIENT_ABORT = 106, +} + +/** + * Describes the enum meshtastic.StoreAndForward.RequestResponse. + */ +export const StoreAndForward_RequestResponseSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_storeforward, 0, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/telemetry_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/telemetry_pb.ts new file mode 100644 index 00000000..0a3048f3 --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/telemetry_pb.ts @@ -0,0 +1,1603 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/telemetry.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/telemetry.proto. + */ +export const file_meshtastic_telemetry: GenFile = /*@__PURE__*/ + fileDesc("ChptZXNodGFzdGljL3RlbGVtZXRyeS5wcm90bxIKbWVzaHRhc3RpYyLzAQoNRGV2aWNlTWV0cmljcxIaCg1iYXR0ZXJ5X2xldmVsGAEgASgNSACIAQESFAoHdm9sdGFnZRgCIAEoAkgBiAEBEiAKE2NoYW5uZWxfdXRpbGl6YXRpb24YAyABKAJIAogBARIYCgthaXJfdXRpbF90eBgEIAEoAkgDiAEBEhsKDnVwdGltZV9zZWNvbmRzGAUgASgNSASIAQFCEAoOX2JhdHRlcnlfbGV2ZWxCCgoIX3ZvbHRhZ2VCFgoUX2NoYW5uZWxfdXRpbGl6YXRpb25CDgoMX2Fpcl91dGlsX3R4QhEKD191cHRpbWVfc2Vjb25kcyKgBwoSRW52aXJvbm1lbnRNZXRyaWNzEhgKC3RlbXBlcmF0dXJlGAEgASgCSACIAQESHgoRcmVsYXRpdmVfaHVtaWRpdHkYAiABKAJIAYgBARIgChNiYXJvbWV0cmljX3ByZXNzdXJlGAMgASgCSAKIAQESGwoOZ2FzX3Jlc2lzdGFuY2UYBCABKAJIA4gBARIUCgd2b2x0YWdlGAUgASgCSASIAQESFAoHY3VycmVudBgGIAEoAkgFiAEBEhAKA2lhcRgHIAEoDUgGiAEBEhUKCGRpc3RhbmNlGAggASgCSAeIAQESEAoDbHV4GAkgASgCSAiIAQESFgoJd2hpdGVfbHV4GAogASgCSAmIAQESEwoGaXJfbHV4GAsgASgCSAqIAQESEwoGdXZfbHV4GAwgASgCSAuIAQESGwoOd2luZF9kaXJlY3Rpb24YDSABKA1IDIgBARIXCgp3aW5kX3NwZWVkGA4gASgCSA2IAQESEwoGd2VpZ2h0GA8gASgCSA6IAQESFgoJd2luZF9ndXN0GBAgASgCSA+IAQESFgoJd2luZF9sdWxsGBEgASgCSBCIAQESFgoJcmFkaWF0aW9uGBIgASgCSBGIAQESGAoLcmFpbmZhbGxfMWgYEyABKAJIEogBARIZCgxyYWluZmFsbF8yNGgYFCABKAJIE4gBARIaCg1zb2lsX21vaXN0dXJlGBUgASgNSBSIAQESHQoQc29pbF90ZW1wZXJhdHVyZRgWIAEoAkgViAEBEhwKFG9uZV93aXJlX3RlbXBlcmF0dXJlGBcgAygCQg4KDF90ZW1wZXJhdHVyZUIUChJfcmVsYXRpdmVfaHVtaWRpdHlCFgoUX2Jhcm9tZXRyaWNfcHJlc3N1cmVCEQoPX2dhc19yZXNpc3RhbmNlQgoKCF92b2x0YWdlQgoKCF9jdXJyZW50QgYKBF9pYXFCCwoJX2Rpc3RhbmNlQgYKBF9sdXhCDAoKX3doaXRlX2x1eEIJCgdfaXJfbHV4QgkKB191dl9sdXhCEQoPX3dpbmRfZGlyZWN0aW9uQg0KC193aW5kX3NwZWVkQgkKB193ZWlnaHRCDAoKX3dpbmRfZ3VzdEIMCgpfd2luZF9sdWxsQgwKCl9yYWRpYXRpb25CDgoMX3JhaW5mYWxsXzFoQg8KDV9yYWluZmFsbF8yNGhCEAoOX3NvaWxfbW9pc3R1cmVCEwoRX3NvaWxfdGVtcGVyYXR1cmUirgUKDFBvd2VyTWV0cmljcxIYCgtjaDFfdm9sdGFnZRgBIAEoAkgAiAEBEhgKC2NoMV9jdXJyZW50GAIgASgCSAGIAQESGAoLY2gyX3ZvbHRhZ2UYAyABKAJIAogBARIYCgtjaDJfY3VycmVudBgEIAEoAkgDiAEBEhgKC2NoM192b2x0YWdlGAUgASgCSASIAQESGAoLY2gzX2N1cnJlbnQYBiABKAJIBYgBARIYCgtjaDRfdm9sdGFnZRgHIAEoAkgGiAEBEhgKC2NoNF9jdXJyZW50GAggASgCSAeIAQESGAoLY2g1X3ZvbHRhZ2UYCSABKAJICIgBARIYCgtjaDVfY3VycmVudBgKIAEoAkgJiAEBEhgKC2NoNl92b2x0YWdlGAsgASgCSAqIAQESGAoLY2g2X2N1cnJlbnQYDCABKAJIC4gBARIYCgtjaDdfdm9sdGFnZRgNIAEoAkgMiAEBEhgKC2NoN19jdXJyZW50GA4gASgCSA2IAQESGAoLY2g4X3ZvbHRhZ2UYDyABKAJIDogBARIYCgtjaDhfY3VycmVudBgQIAEoAkgPiAEBQg4KDF9jaDFfdm9sdGFnZUIOCgxfY2gxX2N1cnJlbnRCDgoMX2NoMl92b2x0YWdlQg4KDF9jaDJfY3VycmVudEIOCgxfY2gzX3ZvbHRhZ2VCDgoMX2NoM19jdXJyZW50Qg4KDF9jaDRfdm9sdGFnZUIOCgxfY2g0X2N1cnJlbnRCDgoMX2NoNV92b2x0YWdlQg4KDF9jaDVfY3VycmVudEIOCgxfY2g2X3ZvbHRhZ2VCDgoMX2NoNl9jdXJyZW50Qg4KDF9jaDdfdm9sdGFnZUIOCgxfY2g3X2N1cnJlbnRCDgoMX2NoOF92b2x0YWdlQg4KDF9jaDhfY3VycmVudCKxCQoRQWlyUXVhbGl0eU1ldHJpY3MSGgoNcG0xMF9zdGFuZGFyZBgBIAEoDUgAiAEBEhoKDXBtMjVfc3RhbmRhcmQYAiABKA1IAYgBARIbCg5wbTEwMF9zdGFuZGFyZBgDIAEoDUgCiAEBEh8KEnBtMTBfZW52aXJvbm1lbnRhbBgEIAEoDUgDiAEBEh8KEnBtMjVfZW52aXJvbm1lbnRhbBgFIAEoDUgEiAEBEiAKE3BtMTAwX2Vudmlyb25tZW50YWwYBiABKA1IBYgBARIbCg5wYXJ0aWNsZXNfMDN1bRgHIAEoDUgGiAEBEhsKDnBhcnRpY2xlc18wNXVtGAggASgNSAeIAQESGwoOcGFydGljbGVzXzEwdW0YCSABKA1ICIgBARIbCg5wYXJ0aWNsZXNfMjV1bRgKIAEoDUgJiAEBEhsKDnBhcnRpY2xlc181MHVtGAsgASgNSAqIAQESHAoPcGFydGljbGVzXzEwMHVtGAwgASgNSAuIAQESEAoDY28yGA0gASgNSAyIAQESHAoPY28yX3RlbXBlcmF0dXJlGA4gASgCSA2IAQESGQoMY28yX2h1bWlkaXR5GA8gASgCSA6IAQESHgoRZm9ybV9mb3JtYWxkZWh5ZGUYECABKAJID4gBARIaCg1mb3JtX2h1bWlkaXR5GBEgASgCSBCIAQESHQoQZm9ybV90ZW1wZXJhdHVyZRgSIAEoAkgRiAEBEhoKDXBtNDBfc3RhbmRhcmQYEyABKA1IEogBARIbCg5wYXJ0aWNsZXNfNDB1bRgUIAEoDUgTiAEBEhsKDnBtX3RlbXBlcmF0dXJlGBUgASgCSBSIAQESGAoLcG1faHVtaWRpdHkYFiABKAJIFYgBARIXCgpwbV92b2NfaWR4GBcgASgCSBaIAQESFwoKcG1fbm94X2lkeBgYIAEoAkgXiAEBEhoKDXBhcnRpY2xlc190cHMYGSABKAJIGIgBAUIQCg5fcG0xMF9zdGFuZGFyZEIQCg5fcG0yNV9zdGFuZGFyZEIRCg9fcG0xMDBfc3RhbmRhcmRCFQoTX3BtMTBfZW52aXJvbm1lbnRhbEIVChNfcG0yNV9lbnZpcm9ubWVudGFsQhYKFF9wbTEwMF9lbnZpcm9ubWVudGFsQhEKD19wYXJ0aWNsZXNfMDN1bUIRCg9fcGFydGljbGVzXzA1dW1CEQoPX3BhcnRpY2xlc18xMHVtQhEKD19wYXJ0aWNsZXNfMjV1bUIRCg9fcGFydGljbGVzXzUwdW1CEgoQX3BhcnRpY2xlc18xMDB1bUIGCgRfY28yQhIKEF9jbzJfdGVtcGVyYXR1cmVCDwoNX2NvMl9odW1pZGl0eUIUChJfZm9ybV9mb3JtYWxkZWh5ZGVCEAoOX2Zvcm1faHVtaWRpdHlCEwoRX2Zvcm1fdGVtcGVyYXR1cmVCEAoOX3BtNDBfc3RhbmRhcmRCEQoPX3BhcnRpY2xlc180MHVtQhEKD19wbV90ZW1wZXJhdHVyZUIOCgxfcG1faHVtaWRpdHlCDQoLX3BtX3ZvY19pZHhCDQoLX3BtX25veF9pZHhCEAoOX3BhcnRpY2xlc190cHMi/wIKCkxvY2FsU3RhdHMSFgoOdXB0aW1lX3NlY29uZHMYASABKA0SGwoTY2hhbm5lbF91dGlsaXphdGlvbhgCIAEoAhITCgthaXJfdXRpbF90eBgDIAEoAhIWCg5udW1fcGFja2V0c190eBgEIAEoDRIWCg5udW1fcGFja2V0c19yeBgFIAEoDRIaChJudW1fcGFja2V0c19yeF9iYWQYBiABKA0SGAoQbnVtX29ubGluZV9ub2RlcxgHIAEoDRIXCg9udW1fdG90YWxfbm9kZXMYCCABKA0SEwoLbnVtX3J4X2R1cGUYCSABKA0SFAoMbnVtX3R4X3JlbGF5GAogASgNEh0KFW51bV90eF9yZWxheV9jYW5jZWxlZBgLIAEoDRIYChBoZWFwX3RvdGFsX2J5dGVzGAwgASgNEhcKD2hlYXBfZnJlZV9ieXRlcxgNIAEoDRIWCg5udW1fdHhfZHJvcHBlZBgOIAEoDRITCgtub2lzZV9mbG9vchgPIAEoBSLkAQoWVHJhZmZpY01hbmFnZW1lbnRTdGF0cxIZChFwYWNrZXRzX2luc3BlY3RlZBgBIAEoDRIcChRwb3NpdGlvbl9kZWR1cF9kcm9wcxgCIAEoDRIbChNub2RlaW5mb19jYWNoZV9oaXRzGAMgASgNEhgKEHJhdGVfbGltaXRfZHJvcHMYBCABKA0SHAoUdW5rbm93bl9wYWNrZXRfZHJvcHMYBSABKA0SHQoVaG9wX2V4aGF1c3RlZF9wYWNrZXRzGAYgASgNEh0KFXJvdXRlcl9ob3BzX3ByZXNlcnZlZBgHIAEoDSJ7Cg1IZWFsdGhNZXRyaWNzEhYKCWhlYXJ0X2JwbRgBIAEoDUgAiAEBEhEKBHNwTzIYAiABKA1IAYgBARIYCgt0ZW1wZXJhdHVyZRgDIAEoAkgCiAEBQgwKCl9oZWFydF9icG1CBwoFX3NwTzJCDgoMX3RlbXBlcmF0dXJlIpECCgtIb3N0TWV0cmljcxIWCg51cHRpbWVfc2Vjb25kcxgBIAEoDRIVCg1mcmVlbWVtX2J5dGVzGAIgASgEEhcKD2Rpc2tmcmVlMV9ieXRlcxgDIAEoBBIcCg9kaXNrZnJlZTJfYnl0ZXMYBCABKARIAIgBARIcCg9kaXNrZnJlZTNfYnl0ZXMYBSABKARIAYgBARINCgVsb2FkMRgGIAEoDRINCgVsb2FkNRgHIAEoDRIOCgZsb2FkMTUYCCABKA0SGAoLdXNlcl9zdHJpbmcYCSABKAlIAogBAUISChBfZGlza2ZyZWUyX2J5dGVzQhIKEF9kaXNrZnJlZTNfYnl0ZXNCDgoMX3VzZXJfc3RyaW5nIuYDCglUZWxlbWV0cnkSDAoEdGltZRgBIAEoBxIzCg5kZXZpY2VfbWV0cmljcxgCIAEoCzIZLm1lc2h0YXN0aWMuRGV2aWNlTWV0cmljc0gAEj0KE2Vudmlyb25tZW50X21ldHJpY3MYAyABKAsyHi5tZXNodGFzdGljLkVudmlyb25tZW50TWV0cmljc0gAEjwKE2Fpcl9xdWFsaXR5X21ldHJpY3MYBCABKAsyHS5tZXNodGFzdGljLkFpclF1YWxpdHlNZXRyaWNzSAASMQoNcG93ZXJfbWV0cmljcxgFIAEoCzIYLm1lc2h0YXN0aWMuUG93ZXJNZXRyaWNzSAASLQoLbG9jYWxfc3RhdHMYBiABKAsyFi5tZXNodGFzdGljLkxvY2FsU3RhdHNIABIzCg5oZWFsdGhfbWV0cmljcxgHIAEoCzIZLm1lc2h0YXN0aWMuSGVhbHRoTWV0cmljc0gAEi8KDGhvc3RfbWV0cmljcxgIIAEoCzIXLm1lc2h0YXN0aWMuSG9zdE1ldHJpY3NIABJGChh0cmFmZmljX21hbmFnZW1lbnRfc3RhdHMYCSABKAsyIi5tZXNodGFzdGljLlRyYWZmaWNNYW5hZ2VtZW50U3RhdHNIAEIJCgd2YXJpYW50Ij4KDU5hdTc4MDJDb25maWcSEgoKemVyb09mZnNldBgBIAEoBRIZChFjYWxpYnJhdGlvbkZhY3RvchgCIAEoAiLwAQoKU0VONVhTdGF0ZRIaChJsYXN0X2NsZWFuaW5nX3RpbWUYASABKA0SGwoTbGFzdF9jbGVhbmluZ192YWxpZBgCIAEoCBIVCg1vbmVfc2hvdF9tb2RlGAMgASgIEhsKDnZvY19zdGF0ZV90aW1lGAQgASgNSACIAQESHAoPdm9jX3N0YXRlX3ZhbGlkGAUgASgISAGIAQESHAoPdm9jX3N0YXRlX2FycmF5GAYgASgGSAKIAQFCEQoPX3ZvY19zdGF0ZV90aW1lQhIKEF92b2Nfc3RhdGVfdmFsaWRCEgoQX3ZvY19zdGF0ZV9hcnJheSrcBQoTVGVsZW1ldHJ5U2Vuc29yVHlwZRIQCgxTRU5TT1JfVU5TRVQQABIKCgZCTUUyODAQARIKCgZCTUU2ODAQAhILCgdNQ1A5ODA4EAMSCgoGSU5BMjYwEAQSCgoGSU5BMjE5EAUSCgoGQk1QMjgwEAYSCQoFU0hUQzMQBxIJCgVMUFMyMhAIEgsKB1FNQzYzMTAQCRILCgdRTUk4NjU4EAoSDAoIUU1DNTg4M0wQCxIJCgVTSFQzMRAMEgwKCFBNU0EwMDNJEA0SCwoHSU5BMzIyMRAOEgoKBkJNUDA4NRAPEgwKCFJDV0w5NjIwEBASCQoFU0hUNFgQERIMCghWRU1MNzcwMBASEgwKCE1MWDkwNjMyEBMSCwoHT1BUMzAwMRAUEgwKCExUUjM5MFVWEBUSDgoKVFNMMjU5MTFGThAWEgkKBUFIVDEwEBcSEAoMREZST0JPVF9MQVJLEBgSCwoHTkFVNzgwMhAZEgoKBkJNUDNYWBAaEgwKCElDTTIwOTQ4EBsSDAoITUFYMTcwNDgQHBIRCg1DVVNUT01fU0VOU09SEB0SDAoITUFYMzAxMDIQHhIMCghNTFg5MDYxNBAfEgkKBVNDRDRYECASCwoHUkFEU0VOUxAhEgoKBklOQTIyNhAiEhAKDERGUk9CT1RfUkFJThAjEgoKBkRQUzMxMBAkEgwKCFJBSzEyMDM1ECUSDAoITUFYMTcyNjEQJhILCgdQQ1QyMDc1ECcSCwoHQURTMVgxNRAoEg8KC0FEUzFYMTVfQUxUECkSCQoFU0ZBMzAQKhIJCgVTRU41WBArEgsKB1RTTDI1NjEQLBIKCgZCSDE3NTAQLRILCgdIREMxMDgwEC4SCQoFU0hUMjEQLxIJCgVTVEMzMRAwEgkKBVNDRDMwEDESCQoFU0hUWFgQMhIKCgZEUzI0OFgQMxINCglNTUM1OTgzTUEQNBINCglJQ000MjYwN1AQNUJlChRvcmcubWVzaHRhc3RpYy5wcm90b0IPVGVsZW1ldHJ5UHJvdG9zWiJnaXRodWIuY29tL21lc2h0YXN0aWMvZ28vZ2VuZXJhdGVkqgIUTWVzaHRhc3RpYy5Qcm90b2J1ZnO6AgBiBnByb3RvMw"); + +/** + * + * Key native device metrics such as battery level + * + * @generated from message meshtastic.DeviceMetrics + */ +export type DeviceMetrics = Message<"meshtastic.DeviceMetrics"> & { + /** + * + * 0-100 (>100 means powered) + * + * @generated from field: optional uint32 battery_level = 1; + */ + batteryLevel?: number | undefined; + + /** + * + * Voltage measured + * + * @generated from field: optional float voltage = 2; + */ + voltage?: number | undefined; + + /** + * + * Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). + * + * @generated from field: optional float channel_utilization = 3; + */ + channelUtilization?: number | undefined; + + /** + * + * Percent of airtime for transmission used within the last hour. + * + * @generated from field: optional float air_util_tx = 4; + */ + airUtilTx?: number | undefined; + + /** + * + * How long the device has been running since the last reboot (in seconds) + * + * @generated from field: optional uint32 uptime_seconds = 5; + */ + uptimeSeconds?: number | undefined; +}; + +/** + * Describes the message meshtastic.DeviceMetrics. + * Use `create(DeviceMetricsSchema)` to create a new message. + */ +export const DeviceMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 0); + +/** + * + * Weather station or other environmental metrics + * + * @generated from message meshtastic.EnvironmentMetrics + */ +export type EnvironmentMetrics = Message<"meshtastic.EnvironmentMetrics"> & { + /** + * + * Temperature measured + * + * @generated from field: optional float temperature = 1; + */ + temperature?: number | undefined; + + /** + * + * Relative humidity percent measured + * + * @generated from field: optional float relative_humidity = 2; + */ + relativeHumidity?: number | undefined; + + /** + * + * Barometric pressure in hPA measured + * + * @generated from field: optional float barometric_pressure = 3; + */ + barometricPressure?: number | undefined; + + /** + * + * Gas resistance in MOhm measured + * + * @generated from field: optional float gas_resistance = 4; + */ + gasResistance?: number | undefined; + + /** + * + * Voltage measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x) + * + * @generated from field: optional float voltage = 5; + */ + voltage?: number | undefined; + + /** + * + * Current measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x) + * + * @generated from field: optional float current = 6; + */ + current?: number | undefined; + + /** + * + * relative scale IAQ value as measured by Bosch BME680 . value 0-500. + * Belongs to Air Quality but is not particle but VOC measurement. Other VOC values can also be put in here. + * + * @generated from field: optional uint32 iaq = 7; + */ + iaq?: number | undefined; + + /** + * + * RCWL9620 Doppler Radar Distance Sensor, used for water level detection. Float value in mm. + * + * @generated from field: optional float distance = 8; + */ + distance?: number | undefined; + + /** + * + * VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. + * + * @generated from field: optional float lux = 9; + */ + lux?: number | undefined; + + /** + * + * VEML7700 high accuracy white light(irradiance) not calibrated digital 16-bit resolution sensor. + * + * @generated from field: optional float white_lux = 10; + */ + whiteLux?: number | undefined; + + /** + * + * Infrared lux + * + * @generated from field: optional float ir_lux = 11; + */ + irLux?: number | undefined; + + /** + * + * Ultraviolet lux + * + * @generated from field: optional float uv_lux = 12; + */ + uvLux?: number | undefined; + + /** + * + * Wind direction in degrees + * 0 degrees = North, 90 = East, etc... + * + * @generated from field: optional uint32 wind_direction = 13; + */ + windDirection?: number | undefined; + + /** + * + * Wind speed in m/s + * + * @generated from field: optional float wind_speed = 14; + */ + windSpeed?: number | undefined; + + /** + * + * Weight in KG + * + * @generated from field: optional float weight = 15; + */ + weight?: number | undefined; + + /** + * + * Wind gust in m/s + * + * @generated from field: optional float wind_gust = 16; + */ + windGust?: number | undefined; + + /** + * + * Wind lull in m/s + * + * @generated from field: optional float wind_lull = 17; + */ + windLull?: number | undefined; + + /** + * + * Radiation in µR/h + * + * @generated from field: optional float radiation = 18; + */ + radiation?: number | undefined; + + /** + * + * Rainfall in the last hour in mm + * + * @generated from field: optional float rainfall_1h = 19; + */ + rainfall1h?: number | undefined; + + /** + * + * Rainfall in the last 24 hours in mm + * + * @generated from field: optional float rainfall_24h = 20; + */ + rainfall24h?: number | undefined; + + /** + * + * Soil moisture measured (% 1-100) + * + * @generated from field: optional uint32 soil_moisture = 21; + */ + soilMoisture?: number | undefined; + + /** + * + * Soil temperature measured (*C) + * + * @generated from field: optional float soil_temperature = 22; + */ + soilTemperature?: number | undefined; + + /** + * + * One-wire temperature (*C) + * + * @generated from field: repeated float one_wire_temperature = 23; + */ + oneWireTemperature: number[]; +}; + +/** + * Describes the message meshtastic.EnvironmentMetrics. + * Use `create(EnvironmentMetricsSchema)` to create a new message. + */ +export const EnvironmentMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 1); + +/** + * + * Power Metrics (voltage / current / etc) + * + * @generated from message meshtastic.PowerMetrics + */ +export type PowerMetrics = Message<"meshtastic.PowerMetrics"> & { + /** + * + * Voltage (Ch1) + * + * @generated from field: optional float ch1_voltage = 1; + */ + ch1Voltage?: number | undefined; + + /** + * + * Current (Ch1) + * + * @generated from field: optional float ch1_current = 2; + */ + ch1Current?: number | undefined; + + /** + * + * Voltage (Ch2) + * + * @generated from field: optional float ch2_voltage = 3; + */ + ch2Voltage?: number | undefined; + + /** + * + * Current (Ch2) + * + * @generated from field: optional float ch2_current = 4; + */ + ch2Current?: number | undefined; + + /** + * + * Voltage (Ch3) + * + * @generated from field: optional float ch3_voltage = 5; + */ + ch3Voltage?: number | undefined; + + /** + * + * Current (Ch3) + * + * @generated from field: optional float ch3_current = 6; + */ + ch3Current?: number | undefined; + + /** + * + * Voltage (Ch4) + * + * @generated from field: optional float ch4_voltage = 7; + */ + ch4Voltage?: number | undefined; + + /** + * + * Current (Ch4) + * + * @generated from field: optional float ch4_current = 8; + */ + ch4Current?: number | undefined; + + /** + * + * Voltage (Ch5) + * + * @generated from field: optional float ch5_voltage = 9; + */ + ch5Voltage?: number | undefined; + + /** + * + * Current (Ch5) + * + * @generated from field: optional float ch5_current = 10; + */ + ch5Current?: number | undefined; + + /** + * + * Voltage (Ch6) + * + * @generated from field: optional float ch6_voltage = 11; + */ + ch6Voltage?: number | undefined; + + /** + * + * Current (Ch6) + * + * @generated from field: optional float ch6_current = 12; + */ + ch6Current?: number | undefined; + + /** + * + * Voltage (Ch7) + * + * @generated from field: optional float ch7_voltage = 13; + */ + ch7Voltage?: number | undefined; + + /** + * + * Current (Ch7) + * + * @generated from field: optional float ch7_current = 14; + */ + ch7Current?: number | undefined; + + /** + * + * Voltage (Ch8) + * + * @generated from field: optional float ch8_voltage = 15; + */ + ch8Voltage?: number | undefined; + + /** + * + * Current (Ch8) + * + * @generated from field: optional float ch8_current = 16; + */ + ch8Current?: number | undefined; +}; + +/** + * Describes the message meshtastic.PowerMetrics. + * Use `create(PowerMetricsSchema)` to create a new message. + */ +export const PowerMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 2); + +/** + * + * Air quality metrics + * + * @generated from message meshtastic.AirQualityMetrics + */ +export type AirQualityMetrics = Message<"meshtastic.AirQualityMetrics"> & { + /** + * + * Concentration Units Standard PM1.0 in ug/m3 + * + * @generated from field: optional uint32 pm10_standard = 1; + */ + pm10Standard?: number | undefined; + + /** + * + * Concentration Units Standard PM2.5 in ug/m3 + * + * @generated from field: optional uint32 pm25_standard = 2; + */ + pm25Standard?: number | undefined; + + /** + * + * Concentration Units Standard PM10.0 in ug/m3 + * + * @generated from field: optional uint32 pm100_standard = 3; + */ + pm100Standard?: number | undefined; + + /** + * + * Concentration Units Environmental PM1.0 in ug/m3 + * + * @generated from field: optional uint32 pm10_environmental = 4; + */ + pm10Environmental?: number | undefined; + + /** + * + * Concentration Units Environmental PM2.5 in ug/m3 + * + * @generated from field: optional uint32 pm25_environmental = 5; + */ + pm25Environmental?: number | undefined; + + /** + * + * Concentration Units Environmental PM10.0 in ug/m3 + * + * @generated from field: optional uint32 pm100_environmental = 6; + */ + pm100Environmental?: number | undefined; + + /** + * + * 0.3um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_03um = 7; + */ + particles03um?: number | undefined; + + /** + * + * 0.5um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_05um = 8; + */ + particles05um?: number | undefined; + + /** + * + * 1.0um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_10um = 9; + */ + particles10um?: number | undefined; + + /** + * + * 2.5um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_25um = 10; + */ + particles25um?: number | undefined; + + /** + * + * 5.0um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_50um = 11; + */ + particles50um?: number | undefined; + + /** + * + * 10.0um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_100um = 12; + */ + particles100um?: number | undefined; + + /** + * + * CO2 concentration in ppm + * + * @generated from field: optional uint32 co2 = 13; + */ + co2?: number | undefined; + + /** + * + * CO2 sensor temperature in degC + * + * @generated from field: optional float co2_temperature = 14; + */ + co2Temperature?: number | undefined; + + /** + * + * CO2 sensor relative humidity in % + * + * @generated from field: optional float co2_humidity = 15; + */ + co2Humidity?: number | undefined; + + /** + * + * Formaldehyde sensor formaldehyde concentration in ppb + * + * @generated from field: optional float form_formaldehyde = 16; + */ + formFormaldehyde?: number | undefined; + + /** + * + * Formaldehyde sensor relative humidity in %RH + * + * @generated from field: optional float form_humidity = 17; + */ + formHumidity?: number | undefined; + + /** + * + * Formaldehyde sensor temperature in degrees Celsius + * + * @generated from field: optional float form_temperature = 18; + */ + formTemperature?: number | undefined; + + /** + * + * Concentration Units Standard PM4.0 in ug/m3 + * + * @generated from field: optional uint32 pm40_standard = 19; + */ + pm40Standard?: number | undefined; + + /** + * + * 4.0um Particle Count in #/0.1l + * + * @generated from field: optional uint32 particles_40um = 20; + */ + particles40um?: number | undefined; + + /** + * + * PM Sensor Temperature + * + * @generated from field: optional float pm_temperature = 21; + */ + pmTemperature?: number | undefined; + + /** + * + * PM Sensor humidity + * + * @generated from field: optional float pm_humidity = 22; + */ + pmHumidity?: number | undefined; + + /** + * + * PM Sensor VOC Index + * + * @generated from field: optional float pm_voc_idx = 23; + */ + pmVocIdx?: number | undefined; + + /** + * + * PM Sensor NOx Index + * + * @generated from field: optional float pm_nox_idx = 24; + */ + pmNoxIdx?: number | undefined; + + /** + * + * Typical Particle Size in um + * + * @generated from field: optional float particles_tps = 25; + */ + particlesTps?: number | undefined; +}; + +/** + * Describes the message meshtastic.AirQualityMetrics. + * Use `create(AirQualityMetricsSchema)` to create a new message. + */ +export const AirQualityMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 3); + +/** + * + * Local device mesh statistics + * + * @generated from message meshtastic.LocalStats + */ +export type LocalStats = Message<"meshtastic.LocalStats"> & { + /** + * + * How long the device has been running since the last reboot (in seconds) + * + * @generated from field: uint32 uptime_seconds = 1; + */ + uptimeSeconds: number; + + /** + * + * Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). + * + * @generated from field: float channel_utilization = 2; + */ + channelUtilization: number; + + /** + * + * Percent of airtime for transmission used within the last hour. + * + * @generated from field: float air_util_tx = 3; + */ + airUtilTx: number; + + /** + * + * Number of packets sent + * + * @generated from field: uint32 num_packets_tx = 4; + */ + numPacketsTx: number; + + /** + * + * Number of packets received (both good and bad) + * + * @generated from field: uint32 num_packets_rx = 5; + */ + numPacketsRx: number; + + /** + * + * Number of packets received that are malformed or violate the protocol + * + * @generated from field: uint32 num_packets_rx_bad = 6; + */ + numPacketsRxBad: number; + + /** + * + * Number of nodes online (in the past 2 hours) + * + * @generated from field: uint32 num_online_nodes = 7; + */ + numOnlineNodes: number; + + /** + * + * Number of nodes total + * + * @generated from field: uint32 num_total_nodes = 8; + */ + numTotalNodes: number; + + /** + * + * Number of received packets that were duplicates (due to multiple nodes relaying). + * If this number is high, there are nodes in the mesh relaying packets when it's unnecessary, for example due to the ROUTER/REPEATER role. + * + * @generated from field: uint32 num_rx_dupe = 9; + */ + numRxDupe: number; + + /** + * + * Number of packets we transmitted that were a relay for others (not originating from ourselves). + * + * @generated from field: uint32 num_tx_relay = 10; + */ + numTxRelay: number; + + /** + * + * Number of times we canceled a packet to be relayed, because someone else did it before us. + * This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you. + * + * @generated from field: uint32 num_tx_relay_canceled = 11; + */ + numTxRelayCanceled: number; + + /** + * + * Number of bytes used in the heap + * + * @generated from field: uint32 heap_total_bytes = 12; + */ + heapTotalBytes: number; + + /** + * + * Number of bytes free in the heap + * + * @generated from field: uint32 heap_free_bytes = 13; + */ + heapFreeBytes: number; + + /** + * + * Number of packets that were dropped because the transmit queue was full. + * + * @generated from field: uint32 num_tx_dropped = 14; + */ + numTxDropped: number; + + /** + * + * Noise floor value measured in dBm + * + * @generated from field: int32 noise_floor = 15; + */ + noiseFloor: number; +}; + +/** + * Describes the message meshtastic.LocalStats. + * Use `create(LocalStatsSchema)` to create a new message. + */ +export const LocalStatsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 4); + +/** + * + * Traffic management statistics for mesh network optimization + * + * @generated from message meshtastic.TrafficManagementStats + */ +export type TrafficManagementStats = Message<"meshtastic.TrafficManagementStats"> & { + /** + * + * Total number of packets inspected by traffic management + * + * @generated from field: uint32 packets_inspected = 1; + */ + packetsInspected: number; + + /** + * + * Number of position packets dropped due to deduplication + * + * @generated from field: uint32 position_dedup_drops = 2; + */ + positionDedupDrops: number; + + /** + * + * Number of NodeInfo requests answered from cache + * + * @generated from field: uint32 nodeinfo_cache_hits = 3; + */ + nodeinfoCacheHits: number; + + /** + * + * Number of packets dropped due to rate limiting + * + * @generated from field: uint32 rate_limit_drops = 4; + */ + rateLimitDrops: number; + + /** + * + * Number of unknown/undecryptable packets dropped + * + * @generated from field: uint32 unknown_packet_drops = 5; + */ + unknownPacketDrops: number; + + /** + * + * Number of packets with hop_limit exhausted for local-only broadcast + * + * @generated from field: uint32 hop_exhausted_packets = 6; + */ + hopExhaustedPackets: number; + + /** + * + * Number of times router hop preservation was applied + * + * @generated from field: uint32 router_hops_preserved = 7; + */ + routerHopsPreserved: number; +}; + +/** + * Describes the message meshtastic.TrafficManagementStats. + * Use `create(TrafficManagementStatsSchema)` to create a new message. + */ +export const TrafficManagementStatsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 5); + +/** + * + * Health telemetry metrics + * + * @generated from message meshtastic.HealthMetrics + */ +export type HealthMetrics = Message<"meshtastic.HealthMetrics"> & { + /** + * + * Heart rate (beats per minute) + * + * @generated from field: optional uint32 heart_bpm = 1; + */ + heartBpm?: number | undefined; + + /** + * + * SpO2 (blood oxygen saturation) level + * + * @generated from field: optional uint32 spO2 = 2; + */ + spO2?: number | undefined; + + /** + * + * Body temperature in degrees Celsius + * + * @generated from field: optional float temperature = 3; + */ + temperature?: number | undefined; +}; + +/** + * Describes the message meshtastic.HealthMetrics. + * Use `create(HealthMetricsSchema)` to create a new message. + */ +export const HealthMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 6); + +/** + * + * Linux host metrics + * + * @generated from message meshtastic.HostMetrics + */ +export type HostMetrics = Message<"meshtastic.HostMetrics"> & { + /** + * + * Host system uptime + * + * @generated from field: uint32 uptime_seconds = 1; + */ + uptimeSeconds: number; + + /** + * + * Host system free memory + * + * @generated from field: uint64 freemem_bytes = 2; + */ + freememBytes: bigint; + + /** + * + * Host system disk space free for / + * + * @generated from field: uint64 diskfree1_bytes = 3; + */ + diskfree1Bytes: bigint; + + /** + * + * Secondary system disk space free + * + * @generated from field: optional uint64 diskfree2_bytes = 4; + */ + diskfree2Bytes?: bigint | undefined; + + /** + * + * Tertiary disk space free + * + * @generated from field: optional uint64 diskfree3_bytes = 5; + */ + diskfree3Bytes?: bigint | undefined; + + /** + * + * Host system one minute load in 1/100ths + * + * @generated from field: uint32 load1 = 6; + */ + load1: number; + + /** + * + * Host system five minute load in 1/100ths + * + * @generated from field: uint32 load5 = 7; + */ + load5: number; + + /** + * + * Host system fifteen minute load in 1/100ths + * + * @generated from field: uint32 load15 = 8; + */ + load15: number; + + /** + * + * Optional User-provided string for arbitrary host system information + * that doesn't make sense as a dedicated entry. + * + * @generated from field: optional string user_string = 9; + */ + userString?: string | undefined; +}; + +/** + * Describes the message meshtastic.HostMetrics. + * Use `create(HostMetricsSchema)` to create a new message. + */ +export const HostMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 7); + +/** + * + * Types of Measurements the telemetry module is equipped to handle + * + * @generated from message meshtastic.Telemetry + */ +export type Telemetry = Message<"meshtastic.Telemetry"> & { + /** + * + * Seconds since 1970 - or 0 for unknown/unset + * + * @generated from field: fixed32 time = 1; + */ + time: number; + + /** + * @generated from oneof meshtastic.Telemetry.variant + */ + variant: { + /** + * + * Key native device metrics such as battery level + * + * @generated from field: meshtastic.DeviceMetrics device_metrics = 2; + */ + value: DeviceMetrics; + case: "deviceMetrics"; + } | { + /** + * + * Weather station or other environmental metrics + * + * @generated from field: meshtastic.EnvironmentMetrics environment_metrics = 3; + */ + value: EnvironmentMetrics; + case: "environmentMetrics"; + } | { + /** + * + * Air quality metrics + * + * @generated from field: meshtastic.AirQualityMetrics air_quality_metrics = 4; + */ + value: AirQualityMetrics; + case: "airQualityMetrics"; + } | { + /** + * + * Power Metrics + * + * @generated from field: meshtastic.PowerMetrics power_metrics = 5; + */ + value: PowerMetrics; + case: "powerMetrics"; + } | { + /** + * + * Local device mesh statistics + * + * @generated from field: meshtastic.LocalStats local_stats = 6; + */ + value: LocalStats; + case: "localStats"; + } | { + /** + * + * Health telemetry metrics + * + * @generated from field: meshtastic.HealthMetrics health_metrics = 7; + */ + value: HealthMetrics; + case: "healthMetrics"; + } | { + /** + * + * Linux host metrics + * + * @generated from field: meshtastic.HostMetrics host_metrics = 8; + */ + value: HostMetrics; + case: "hostMetrics"; + } | { + /** + * + * Traffic management statistics + * + * @generated from field: meshtastic.TrafficManagementStats traffic_management_stats = 9; + */ + value: TrafficManagementStats; + case: "trafficManagementStats"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message meshtastic.Telemetry. + * Use `create(TelemetrySchema)` to create a new message. + */ +export const TelemetrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 8); + +/** + * + * NAU7802 Telemetry configuration, for saving to flash + * + * @generated from message meshtastic.Nau7802Config + */ +export type Nau7802Config = Message<"meshtastic.Nau7802Config"> & { + /** + * + * The offset setting for the NAU7802 + * + * @generated from field: int32 zeroOffset = 1; + */ + zeroOffset: number; + + /** + * + * The calibration factor for the NAU7802 + * + * @generated from field: float calibrationFactor = 2; + */ + calibrationFactor: number; +}; + +/** + * Describes the message meshtastic.Nau7802Config. + * Use `create(Nau7802ConfigSchema)` to create a new message. + */ +export const Nau7802ConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 9); + +/** + * + * SEN5X State, for saving to flash + * + * @generated from message meshtastic.SEN5XState + */ +export type SEN5XState = Message<"meshtastic.SEN5XState"> & { + /** + * + * Last cleaning time for SEN5X + * + * @generated from field: uint32 last_cleaning_time = 1; + */ + lastCleaningTime: number; + + /** + * + * Last cleaning time for SEN5X - valid flag + * + * @generated from field: bool last_cleaning_valid = 2; + */ + lastCleaningValid: boolean; + + /** + * + * Config flag for one-shot mode (see admin.proto) + * + * @generated from field: bool one_shot_mode = 3; + */ + oneShotMode: boolean; + + /** + * + * Last VOC state time for SEN55 + * + * @generated from field: optional uint32 voc_state_time = 4; + */ + vocStateTime?: number | undefined; + + /** + * + * Last VOC state validity flag for SEN55 + * + * @generated from field: optional bool voc_state_valid = 5; + */ + vocStateValid?: boolean | undefined; + + /** + * + * VOC state array (8x uint8t) for SEN55 + * + * @generated from field: optional fixed64 voc_state_array = 6; + */ + vocStateArray?: bigint | undefined; +}; + +/** + * Describes the message meshtastic.SEN5XState. + * Use `create(SEN5XStateSchema)` to create a new message. + */ +export const SEN5XStateSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_telemetry, 10); + +/** + * + * Supported I2C Sensors for telemetry in Meshtastic + * + * @generated from enum meshtastic.TelemetrySensorType + */ +export enum TelemetrySensorType { + /** + * + * No external telemetry sensor explicitly set + * + * @generated from enum value: SENSOR_UNSET = 0; + */ + SENSOR_UNSET = 0, + + /** + * + * High accuracy temperature, pressure, humidity + * + * @generated from enum value: BME280 = 1; + */ + BME280 = 1, + + /** + * + * High accuracy temperature, pressure, humidity, and air resistance + * + * @generated from enum value: BME680 = 2; + */ + BME680 = 2, + + /** + * + * Very high accuracy temperature + * + * @generated from enum value: MCP9808 = 3; + */ + MCP9808 = 3, + + /** + * + * Moderate accuracy current and voltage + * + * @generated from enum value: INA260 = 4; + */ + INA260 = 4, + + /** + * + * Moderate accuracy current and voltage + * + * @generated from enum value: INA219 = 5; + */ + INA219 = 5, + + /** + * + * High accuracy temperature and pressure + * + * @generated from enum value: BMP280 = 6; + */ + BMP280 = 6, + + /** + * + * TODO - REMOVE High accuracy temperature and humidity + * + * @generated from enum value: SHTC3 = 7; + */ + SHTC3 = 7, + + /** + * + * High accuracy pressure + * + * @generated from enum value: LPS22 = 8; + */ + LPS22 = 8, + + /** + * + * 3-Axis magnetic sensor + * + * @generated from enum value: QMC6310 = 9; + */ + QMC6310 = 9, + + /** + * + * 6-Axis inertial measurement sensor + * + * @generated from enum value: QMI8658 = 10; + */ + QMI8658 = 10, + + /** + * + * 3-Axis magnetic sensor + * + * @generated from enum value: QMC5883L = 11; + */ + QMC5883L = 11, + + /** + * + * TODO - REMOVE High accuracy temperature and humidity + * + * @generated from enum value: SHT31 = 12; + */ + SHT31 = 12, + + /** + * + * PM2.5 air quality sensor + * + * @generated from enum value: PMSA003I = 13; + */ + PMSA003I = 13, + + /** + * + * INA3221 3 Channel Voltage / Current Sensor + * + * @generated from enum value: INA3221 = 14; + */ + INA3221 = 14, + + /** + * + * BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280) + * + * @generated from enum value: BMP085 = 15; + */ + BMP085 = 15, + + /** + * + * RCWL-9620 Doppler Radar Distance Sensor, used for water level detection + * + * @generated from enum value: RCWL9620 = 16; + */ + RCWL9620 = 16, + + /** + * + * TODO - REMOVE Sensirion High accuracy temperature and humidity + * + * @generated from enum value: SHT4X = 17; + */ + SHT4X = 17, + + /** + * + * VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. + * + * @generated from enum value: VEML7700 = 18; + */ + VEML7700 = 18, + + /** + * + * MLX90632 non-contact IR temperature sensor. + * + * @generated from enum value: MLX90632 = 19; + */ + MLX90632 = 19, + + /** + * + * TI OPT3001 Ambient Light Sensor + * + * @generated from enum value: OPT3001 = 20; + */ + OPT3001 = 20, + + /** + * + * Lite On LTR-390UV-01 UV Light Sensor + * + * @generated from enum value: LTR390UV = 21; + */ + LTR390UV = 21, + + /** + * + * AMS TSL25911FN RGB Light Sensor + * + * @generated from enum value: TSL25911FN = 22; + */ + TSL25911FN = 22, + + /** + * + * AHT10 Integrated temperature and humidity sensor + * + * @generated from enum value: AHT10 = 23; + */ + AHT10 = 23, + + /** + * + * DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction) + * + * @generated from enum value: DFROBOT_LARK = 24; + */ + DFROBOT_LARK = 24, + + /** + * + * NAU7802 Scale Chip or compatible + * + * @generated from enum value: NAU7802 = 25; + */ + NAU7802 = 25, + + /** + * + * BMP3XX High accuracy temperature and pressure + * + * @generated from enum value: BMP3XX = 26; + */ + BMP3XX = 26, + + /** + * + * ICM-20948 9-Axis digital motion processor + * + * @generated from enum value: ICM20948 = 27; + */ + ICM20948 = 27, + + /** + * + * MAX17048 1S lipo battery sensor (voltage, state of charge, time to go) + * + * @generated from enum value: MAX17048 = 28; + */ + MAX17048 = 28, + + /** + * + * Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor + * + * @generated from enum value: CUSTOM_SENSOR = 29; + */ + CUSTOM_SENSOR = 29, + + /** + * + * MAX30102 Pulse Oximeter and Heart-Rate Sensor + * + * @generated from enum value: MAX30102 = 30; + */ + MAX30102 = 30, + + /** + * + * MLX90614 non-contact IR temperature sensor + * + * @generated from enum value: MLX90614 = 31; + */ + MLX90614 = 31, + + /** + * + * SCD40/SCD41 CO2, humidity, temperature sensor + * + * @generated from enum value: SCD4X = 32; + */ + SCD4X = 32, + + /** + * + * ClimateGuard RadSens, radiation, Geiger-Muller Tube + * + * @generated from enum value: RADSENS = 33; + */ + RADSENS = 33, + + /** + * + * High accuracy current and voltage + * + * @generated from enum value: INA226 = 34; + */ + INA226 = 34, + + /** + * + * DFRobot Gravity tipping bucket rain gauge + * + * @generated from enum value: DFROBOT_RAIN = 35; + */ + DFROBOT_RAIN = 35, + + /** + * + * Infineon DPS310 High accuracy pressure and temperature + * + * @generated from enum value: DPS310 = 36; + */ + DPS310 = 36, + + /** + * + * RAKWireless RAK12035 Soil Moisture Sensor Module + * + * @generated from enum value: RAK12035 = 37; + */ + RAK12035 = 37, + + /** + * + * MAX17261 lipo battery gauge + * + * @generated from enum value: MAX17261 = 38; + */ + MAX17261 = 38, + + /** + * + * PCT2075 Temperature Sensor + * + * @generated from enum value: PCT2075 = 39; + */ + PCT2075 = 39, + + /** + * + * ADS1X15 ADC + * + * @generated from enum value: ADS1X15 = 40; + */ + ADS1X15 = 40, + + /** + * + * ADS1X15 ADC_ALT + * + * @generated from enum value: ADS1X15_ALT = 41; + */ + ADS1X15_ALT = 41, + + /** + * + * Sensirion SFA30 Formaldehyde sensor + * + * @generated from enum value: SFA30 = 42; + */ + SFA30 = 42, + + /** + * + * SEN5X PM SENSORS + * + * @generated from enum value: SEN5X = 43; + */ + SEN5X = 43, + + /** + * + * TSL2561 light sensor + * + * @generated from enum value: TSL2561 = 44; + */ + TSL2561 = 44, + + /** + * + * BH1750 light sensor + * + * @generated from enum value: BH1750 = 45; + */ + BH1750 = 45, + + /** + * + * HDC1080 Temperature and Humidity Sensor + * + * @generated from enum value: HDC1080 = 46; + */ + HDC1080 = 46, + + /** + * + * TODO - REMOVE STH21 Temperature and R. Humidity sensor + * + * @generated from enum value: SHT21 = 47; + */ + SHT21 = 47, + + /** + * + * Sensirion STC31 CO2 sensor + * + * @generated from enum value: STC31 = 48; + */ + STC31 = 48, + + /** + * + * SCD30 CO2, humidity, temperature sensor + * + * @generated from enum value: SCD30 = 49; + */ + SCD30 = 49, + + /** + * + * SHT family of sensors for temperature and humidity + * + * @generated from enum value: SHTXX = 50; + */ + SHTXX = 50, + + /** + * + * DS248X Bridge for one-wire temperature sensors + * + * @generated from enum value: DS248X = 51; + */ + DS248X = 51, + + /** + * + * MMC5983MA 3-Axis Digital Magnetic Sensor + * + * @generated from enum value: MMC5983MA = 52; + */ + MMC5983MA = 52, + + /** + * + * ICM-42607-P 6‑Axis IMU + * + * @generated from enum value: ICM42607P = 53; + */ + ICM42607P = 53, +} + +/** + * Describes the enum meshtastic.TelemetrySensorType. + */ +export const TelemetrySensorTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_telemetry, 0); + diff --git a/packages/protobufs/packages/ts/dist/meshtastic/xmodem_pb.ts b/packages/protobufs/packages/ts/dist/meshtastic/xmodem_pb.ts new file mode 100644 index 00000000..05da5dde --- /dev/null +++ b/packages/protobufs/packages/ts/dist/meshtastic/xmodem_pb.ts @@ -0,0 +1,97 @@ +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file meshtastic/xmodem.proto (package meshtastic, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file meshtastic/xmodem.proto. + */ +export const file_meshtastic_xmodem: GenFile = /*@__PURE__*/ + fileDesc("ChdtZXNodGFzdGljL3htb2RlbS5wcm90bxIKbWVzaHRhc3RpYyK2AQoGWE1vZGVtEisKB2NvbnRyb2wYASABKA4yGi5tZXNodGFzdGljLlhNb2RlbS5Db250cm9sEgsKA3NlcRgCIAEoDRINCgVjcmMxNhgDIAEoDRIOCgZidWZmZXIYBCABKAwiUwoHQ29udHJvbBIHCgNOVUwQABIHCgNTT0gQARIHCgNTVFgQAhIHCgNFT1QQBBIHCgNBQ0sQBhIHCgNOQUsQFRIHCgNDQU4QGBIJCgVDVFJMWhAaQmIKFG9yZy5tZXNodGFzdGljLnByb3RvQgxYbW9kZW1Qcm90b3NaImdpdGh1Yi5jb20vbWVzaHRhc3RpYy9nby9nZW5lcmF0ZWSqAhRNZXNodGFzdGljLlByb3RvYnVmc7oCAGIGcHJvdG8z"); + +/** + * @generated from message meshtastic.XModem + */ +export type XModem = Message<"meshtastic.XModem"> & { + /** + * @generated from field: meshtastic.XModem.Control control = 1; + */ + control: XModem_Control; + + /** + * @generated from field: uint32 seq = 2; + */ + seq: number; + + /** + * @generated from field: uint32 crc16 = 3; + */ + crc16: number; + + /** + * @generated from field: bytes buffer = 4; + */ + buffer: Uint8Array; +}; + +/** + * Describes the message meshtastic.XModem. + * Use `create(XModemSchema)` to create a new message. + */ +export const XModemSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_meshtastic_xmodem, 0); + +/** + * @generated from enum meshtastic.XModem.Control + */ +export enum XModem_Control { + /** + * @generated from enum value: NUL = 0; + */ + NUL = 0, + + /** + * @generated from enum value: SOH = 1; + */ + SOH = 1, + + /** + * @generated from enum value: STX = 2; + */ + STX = 2, + + /** + * @generated from enum value: EOT = 4; + */ + EOT = 4, + + /** + * @generated from enum value: ACK = 6; + */ + ACK = 6, + + /** + * @generated from enum value: NAK = 21; + */ + NAK = 21, + + /** + * @generated from enum value: CAN = 24; + */ + CAN = 24, + + /** + * @generated from enum value: CTRLZ = 26; + */ + CTRLZ = 26, +} + +/** + * Describes the enum meshtastic.XModem.Control. + */ +export const XModem_ControlSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_meshtastic_xmodem, 0, 0); + diff --git a/packages/protobufs/packages/ts/dist/nanopb_pb.ts b/packages/protobufs/packages/ts/dist/nanopb_pb.ts new file mode 100644 index 00000000..db50405e --- /dev/null +++ b/packages/protobufs/packages/ts/dist/nanopb_pb.ts @@ -0,0 +1,463 @@ +// Custom options for defining: +// - Maximum size of string/bytes +// - Maximum number of elements in array +// +// These are used by nanopb to generate statically allocable structures +// for memory-limited environments. + +// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated from file nanopb.proto (syntax proto2) +/* eslint-disable */ + +import type { GenEnum, GenExtension, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { EnumOptions, FieldDescriptorProto_Type, FieldOptions, FileOptions, MessageOptions } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file nanopb.proto. + */ +export const file_nanopb: GenFile = /*@__PURE__*/ + fileDesc("CgxuYW5vcGIucHJvdG8ipAcKDU5hbm9QQk9wdGlvbnMSEAoIbWF4X3NpemUYASABKAUSEgoKbWF4X2xlbmd0aBgOIAEoBRIRCgltYXhfY291bnQYAiABKAUSJgoIaW50X3NpemUYByABKA4yCC5JbnRTaXplOgpJU19ERUZBVUxUEiQKBHR5cGUYAyABKA4yCi5GaWVsZFR5cGU6CkZUX0RFRkFVTFQSGAoKbG9uZ19uYW1lcxgEIAEoCDoEdHJ1ZRIcCg1wYWNrZWRfc3RydWN0GAUgASgIOgVmYWxzZRIaCgtwYWNrZWRfZW51bRgKIAEoCDoFZmFsc2USGwoMc2tpcF9tZXNzYWdlGAYgASgIOgVmYWxzZRIYCglub191bmlvbnMYCCABKAg6BWZhbHNlEg0KBW1zZ2lkGAkgASgNEh4KD2Fub255bW91c19vbmVvZhgLIAEoCDoFZmFsc2USFQoGcHJvdG8zGAwgASgIOgVmYWxzZRIjChRwcm90bzNfc2luZ3VsYXJfbXNncxgVIAEoCDoFZmFsc2USHQoOZW51bV90b19zdHJpbmcYDSABKAg6BWZhbHNlEhsKDGZpeGVkX2xlbmd0aBgPIAEoCDoFZmFsc2USGgoLZml4ZWRfY291bnQYECABKAg6BWZhbHNlEh4KD3N1Ym1zZ19jYWxsYmFjaxgWIAEoCDoFZmFsc2USLwoMbWFuZ2xlX25hbWVzGBEgASgOMhEuVHlwZW5hbWVNYW5nbGluZzoGTV9OT05FEigKEWNhbGxiYWNrX2RhdGF0eXBlGBIgASgJOg1wYl9jYWxsYmFja190EjQKEWNhbGxiYWNrX2Z1bmN0aW9uGBMgASgJOhlwYl9kZWZhdWx0X2ZpZWxkX2NhbGxiYWNrEjAKDmRlc2NyaXB0b3JzaXplGBQgASgOMg8uRGVzY3JpcHRvclNpemU6B0RTX0FVVE8SGgoLZGVmYXVsdF9oYXMYFyABKAg6BWZhbHNlEg8KB2luY2x1ZGUYGCADKAkSDwoHZXhjbHVkZRgaIAMoCRIPCgdwYWNrYWdlGBkgASgJEkEKDXR5cGVfb3ZlcnJpZGUYGyABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIZCgtzb3J0X2J5X3RhZxgcIAEoCDoEdHJ1ZRIuCg1mYWxsYmFja190eXBlGB0gASgOMgouRmllbGRUeXBlOgtGVF9DQUxMQkFDSyppCglGaWVsZFR5cGUSDgoKRlRfREVGQVVMVBAAEg8KC0ZUX0NBTExCQUNLEAESDgoKRlRfUE9JTlRFUhAEEg0KCUZUX1NUQVRJQxACEg0KCUZUX0lHTk9SRRADEg0KCUZUX0lOTElORRAFKkQKB0ludFNpemUSDgoKSVNfREVGQVVMVBAAEggKBElTXzgQCBIJCgVJU18xNhAQEgkKBUlTXzMyECASCQoFSVNfNjQQQCpaChBUeXBlbmFtZU1hbmdsaW5nEgoKBk1fTk9ORRAAEhMKD01fU1RSSVBfUEFDS0FHRRABEg0KCU1fRkxBVFRFThACEhYKEk1fUEFDS0FHRV9JTklUSUFMUxADKkUKDkRlc2NyaXB0b3JTaXplEgsKB0RTX0FVVE8QABIICgREU18xEAESCAoERFNfMhACEggKBERTXzQQBBIICgREU184EAg6VAoObmFub3BiX2ZpbGVvcHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY8gcgASgLMg4uTmFub1BCT3B0aW9uc1INbmFub3BiRmlsZW9wdDpVCg1uYW5vcGJfbXNnb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGPIHIAEoCzIOLk5hbm9QQk9wdGlvbnNSDG5hbm9wYk1zZ29wdDpUCg5uYW5vcGJfZW51bW9wdBIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucxjyByABKAsyDi5OYW5vUEJPcHRpb25zUg1uYW5vcGJFbnVtb3B0OkYKBm5hbm9wYhIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY8gcgASgLMg4uTmFub1BCT3B0aW9uc1IGbmFub3BiQj4KGGZpLmthcHNpLmtvdGkuanBhLm5hbm9wYloiZ2l0aHViLmNvbS9tZXNodGFzdGljL2dvL2dlbmVyYXRlZA", [file_google_protobuf_descriptor]); + +/** + * This is the inner options message, which basically defines options for + * a field. When it is used in message or file scope, it applies to all + * fields. + * + * @generated from message NanoPBOptions + */ +export type NanoPBOptions = Message<"NanoPBOptions"> & { + /** + * Allocated size for 'bytes' and 'string' fields. + * For string fields, this should include the space for null terminator. + * + * @generated from field: optional int32 max_size = 1; + */ + maxSize: number; + + /** + * Maximum length for 'string' fields. Setting this is equivalent + * to setting max_size to a value of length+1. + * + * @generated from field: optional int32 max_length = 14; + */ + maxLength: number; + + /** + * Allocated number of entries in arrays ('repeated' fields) + * + * @generated from field: optional int32 max_count = 2; + */ + maxCount: number; + + /** + * Size of integer fields. Can save some memory if you don't need + * full 32 bits for the value. + * + * @generated from field: optional IntSize int_size = 7 [default = IS_DEFAULT]; + */ + intSize: IntSize; + + /** + * Force type of field (callback or static allocation) + * + * @generated from field: optional FieldType type = 3 [default = FT_DEFAULT]; + */ + type: FieldType; + + /** + * Use long names for enums, i.e. EnumName_EnumValue. + * + * @generated from field: optional bool long_names = 4 [default = true]; + */ + longNames: boolean; + + /** + * Add 'packed' attribute to generated structs. + * Note: this cannot be used on CPUs that break on unaligned + * accesses to variables. + * + * @generated from field: optional bool packed_struct = 5 [default = false]; + */ + packedStruct: boolean; + + /** + * Add 'packed' attribute to generated enums. + * + * @generated from field: optional bool packed_enum = 10 [default = false]; + */ + packedEnum: boolean; + + /** + * Skip this message + * + * @generated from field: optional bool skip_message = 6 [default = false]; + */ + skipMessage: boolean; + + /** + * Generate oneof fields as normal optional fields instead of union. + * + * @generated from field: optional bool no_unions = 8 [default = false]; + */ + noUnions: boolean; + + /** + * integer type tag for a message + * + * @generated from field: optional uint32 msgid = 9; + */ + msgid: number; + + /** + * decode oneof as anonymous union + * + * @generated from field: optional bool anonymous_oneof = 11 [default = false]; + */ + anonymousOneof: boolean; + + /** + * Proto3 singular field does not generate a "has_" flag + * + * @generated from field: optional bool proto3 = 12 [default = false]; + */ + proto3: boolean; + + /** + * Force proto3 messages to have no "has_" flag. + * This was default behavior until nanopb-0.4.0. + * + * @generated from field: optional bool proto3_singular_msgs = 21 [default = false]; + */ + proto3SingularMsgs: boolean; + + /** + * Generate an enum->string mapping function (can take up lots of space). + * + * @generated from field: optional bool enum_to_string = 13 [default = false]; + */ + enumToString: boolean; + + /** + * Generate bytes arrays with fixed length + * + * @generated from field: optional bool fixed_length = 15 [default = false]; + */ + fixedLength: boolean; + + /** + * Generate repeated field with fixed count + * + * @generated from field: optional bool fixed_count = 16 [default = false]; + */ + fixedCount: boolean; + + /** + * Generate message-level callback that is called before decoding submessages. + * This can be used to set callback fields for submsgs inside oneofs. + * + * @generated from field: optional bool submsg_callback = 22 [default = false]; + */ + submsgCallback: boolean; + + /** + * Shorten or remove package names from type names. + * This option applies only on the file level. + * + * @generated from field: optional TypenameMangling mangle_names = 17 [default = M_NONE]; + */ + mangleNames: TypenameMangling; + + /** + * Data type for storage associated with callback fields. + * + * @generated from field: optional string callback_datatype = 18 [default = "pb_callback_t"]; + */ + callbackDatatype: string; + + /** + * Callback function used for encoding and decoding. + * Prior to nanopb-0.4.0, the callback was specified in per-field pb_callback_t + * structure. This is still supported, but does not work inside e.g. oneof or pointer + * fields. Instead, a new method allows specifying a per-message callback that + * will be called for all callback fields in a message type. + * + * @generated from field: optional string callback_function = 19 [default = "pb_default_field_callback"]; + */ + callbackFunction: string; + + /** + * Select the size of field descriptors. This option has to be defined + * for the whole message, not per-field. Usually automatic selection is + * ok, but if it results in compilation errors you can increase the field + * size here. + * + * @generated from field: optional DescriptorSize descriptorsize = 20 [default = DS_AUTO]; + */ + descriptorsize: DescriptorSize; + + /** + * Set default value for has_ fields. + * + * @generated from field: optional bool default_has = 23 [default = false]; + */ + defaultHas: boolean; + + /** + * Extra files to include in generated `.pb.h` + * + * @generated from field: repeated string include = 24; + */ + include: string[]; + + /** + * Automatic includes to exclude from generated `.pb.h` + * Same as nanopb_generator.py command line flag -x. + * + * @generated from field: repeated string exclude = 26; + */ + exclude: string[]; + + /** + * Package name that applies only for nanopb. + * + * @generated from field: optional string package = 25; + */ + package: string; + + /** + * Override type of the field in generated C code. Only to be used with related field types + * + * @generated from field: optional google.protobuf.FieldDescriptorProto.Type type_override = 27; + */ + typeOverride: FieldDescriptorProto_Type; + + /** + * Due to historical reasons, nanopb orders fields in structs by their tag number + * instead of the order in .proto. Set this to false to keep the .proto order. + * The default value will probably change to false in nanopb-0.5.0. + * + * @generated from field: optional bool sort_by_tag = 28 [default = true]; + */ + sortByTag: boolean; + + /** + * Set the FT_DEFAULT field conversion strategy. + * A field that can become a static member of a c struct (e.g. int, bool, etc) + * will be a a static field. + * Fields with dynamic length are converted to either a pointer or a callback. + * + * @generated from field: optional FieldType fallback_type = 29 [default = FT_CALLBACK]; + */ + fallbackType: FieldType; +}; + +/** + * Describes the message NanoPBOptions. + * Use `create(NanoPBOptionsSchema)` to create a new message. + */ +export const NanoPBOptionsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_nanopb, 0); + +/** + * @generated from enum FieldType + */ +export enum FieldType { + /** + * Automatically decide field type, generate static field if possible. + * + * @generated from enum value: FT_DEFAULT = 0; + */ + FT_DEFAULT = 0, + + /** + * Always generate a callback field. + * + * @generated from enum value: FT_CALLBACK = 1; + */ + FT_CALLBACK = 1, + + /** + * Always generate a dynamically allocated field. + * + * @generated from enum value: FT_POINTER = 4; + */ + FT_POINTER = 4, + + /** + * Generate a static field or raise an exception if not possible. + * + * @generated from enum value: FT_STATIC = 2; + */ + FT_STATIC = 2, + + /** + * Ignore the field completely. + * + * @generated from enum value: FT_IGNORE = 3; + */ + FT_IGNORE = 3, + + /** + * Legacy option, use the separate 'fixed_length' option instead + * + * @generated from enum value: FT_INLINE = 5; + */ + FT_INLINE = 5, +} + +/** + * Describes the enum FieldType. + */ +export const FieldTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_nanopb, 0); + +/** + * @generated from enum IntSize + */ +export enum IntSize { + /** + * Default, 32/64bit based on type in .proto + * + * @generated from enum value: IS_DEFAULT = 0; + */ + IS_DEFAULT = 0, + + /** + * @generated from enum value: IS_8 = 8; + */ + IS_8 = 8, + + /** + * @generated from enum value: IS_16 = 16; + */ + IS_16 = 16, + + /** + * @generated from enum value: IS_32 = 32; + */ + IS_32 = 32, + + /** + * @generated from enum value: IS_64 = 64; + */ + IS_64 = 64, +} + +/** + * Describes the enum IntSize. + */ +export const IntSizeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_nanopb, 1); + +/** + * @generated from enum TypenameMangling + */ +export enum TypenameMangling { + /** + * Default, no typename mangling + * + * @generated from enum value: M_NONE = 0; + */ + M_NONE = 0, + + /** + * Strip current package name + * + * @generated from enum value: M_STRIP_PACKAGE = 1; + */ + M_STRIP_PACKAGE = 1, + + /** + * Only use last path component + * + * @generated from enum value: M_FLATTEN = 2; + */ + M_FLATTEN = 2, + + /** + * Replace the package name by the initials + * + * @generated from enum value: M_PACKAGE_INITIALS = 3; + */ + M_PACKAGE_INITIALS = 3, +} + +/** + * Describes the enum TypenameMangling. + */ +export const TypenameManglingSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_nanopb, 2); + +/** + * @generated from enum DescriptorSize + */ +export enum DescriptorSize { + /** + * Select minimal size based on field type + * + * @generated from enum value: DS_AUTO = 0; + */ + DS_AUTO = 0, + + /** + * 1 word; up to 15 byte fields, no arrays + * + * @generated from enum value: DS_1 = 1; + */ + DS_1 = 1, + + /** + * 2 words; up to 4095 byte fields, 4095 entry arrays + * + * @generated from enum value: DS_2 = 2; + */ + DS_2 = 2, + + /** + * 4 words; up to 2^32-1 byte fields, 2^16-1 entry arrays + * + * @generated from enum value: DS_4 = 4; + */ + DS_4 = 4, + + /** + * 8 words; up to 2^32-1 entry arrays + * + * @generated from enum value: DS_8 = 8; + */ + DS_8 = 8, +} + +/** + * Describes the enum DescriptorSize. + */ +export const DescriptorSizeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_nanopb, 3); + +/** + * @generated from extension: optional NanoPBOptions nanopb_fileopt = 1010; + */ +export const nanopb_fileopt: GenExtension = /*@__PURE__*/ + extDesc(file_nanopb, 0); + +/** + * @generated from extension: optional NanoPBOptions nanopb_msgopt = 1010; + */ +export const nanopb_msgopt: GenExtension = /*@__PURE__*/ + extDesc(file_nanopb, 1); + +/** + * @generated from extension: optional NanoPBOptions nanopb_enumopt = 1010; + */ +export const nanopb_enumopt: GenExtension = /*@__PURE__*/ + extDesc(file_nanopb, 2); + +/** + * @generated from extension: optional NanoPBOptions nanopb = 1010; + */ +export const nanopb: GenExtension = /*@__PURE__*/ + extDesc(file_nanopb, 3); + diff --git a/packages/protobufs/packages/ts/mod.ts b/packages/protobufs/packages/ts/mod.ts index a3f7f2df..d244b217 100644 --- a/packages/protobufs/packages/ts/mod.ts +++ b/packages/protobufs/packages/ts/mod.ts @@ -1,20 +1,20 @@ -export * as Admin from "./dist/admin_pb.ts"; -export * as AppOnly from "./dist/apponly_pb.ts"; -export * as ATAK from "./dist/atak_pb.ts"; -export * as CannedMessages from "./dist/cannedmessages_pb.ts"; -export * as Channel from "./dist/channel_pb.ts"; -export * as ClientOnly from "./dist/clientonly_pb.ts"; -export * as Config from "./dist/config_pb.ts"; -export * as ConnectionStatus from "./dist/connection_status_pb.ts"; -export * as LocalOnly from "./dist/localonly_pb.ts"; -export * as Mesh from "./dist/mesh_pb.ts"; -export * as ModuleConfig from "./dist/module_config_pb.ts"; -export * as Mqtt from "./dist/mqtt_pb.ts"; -export * as PaxCount from "./dist/paxcount_pb.ts"; -export * as Portnums from "./dist/portnums_pb.ts"; -export * as PowerMon from "./dist/powermon_pb.ts"; -export * as RemoteHardware from "./dist/remote_hardware_pb.ts"; -export * as Rtttl from "./dist/rtttl_pb.ts"; -export * as StoreForward from "./dist/storeforward_pb.ts"; -export * as Telemetry from "./dist/telemetry_pb.ts"; -export * as Xmodem from "./dist/xmodem_pb.ts"; +export * as Admin from "./dist/meshtastic/admin_pb.ts"; +export * as AppOnly from "./dist/meshtastic/apponly_pb.ts"; +export * as ATAK from "./dist/meshtastic/atak_pb.ts"; +export * as CannedMessages from "./dist/meshtastic/cannedmessages_pb.ts"; +export * as Channel from "./dist/meshtastic/channel_pb.ts"; +export * as ClientOnly from "./dist/meshtastic/clientonly_pb.ts"; +export * as Config from "./dist/meshtastic/config_pb.ts"; +export * as ConnectionStatus from "./dist/meshtastic/connection_status_pb.ts"; +export * as LocalOnly from "./dist/meshtastic/localonly_pb.ts"; +export * as Mesh from "./dist/meshtastic/mesh_pb.ts"; +export * as ModuleConfig from "./dist/meshtastic/module_config_pb.ts"; +export * as Mqtt from "./dist/meshtastic/mqtt_pb.ts"; +export * as PaxCount from "./dist/meshtastic/paxcount_pb.ts"; +export * as Portnums from "./dist/meshtastic/portnums_pb.ts"; +export * as PowerMon from "./dist/meshtastic/powermon_pb.ts"; +export * as RemoteHardware from "./dist/meshtastic/remote_hardware_pb.ts"; +export * as Rtttl from "./dist/meshtastic/rtttl_pb.ts"; +export * as StoreForward from "./dist/meshtastic/storeforward_pb.ts"; +export * as Telemetry from "./dist/meshtastic/telemetry_pb.ts"; +export * as Xmodem from "./dist/meshtastic/xmodem_pb.ts"; diff --git a/packages/web/src/components/Dialog/ClientNotificationDialog/ClientNotificationDialog.tsx b/packages/web/src/components/Dialog/ClientNotificationDialog/ClientNotificationDialog.tsx deleted file mode 100644 index 97cda7ca..00000000 --- a/packages/web/src/components/Dialog/ClientNotificationDialog/ClientNotificationDialog.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { - Dialog, - DialogClose, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@components/UI/Dialog.tsx"; -import { useDevice } from "@core/stores"; -import { useTranslation } from "react-i18next"; - -export interface ClientNotificationDialogProps { - open: boolean; - onOpenChange: (open: boolean) => void; -} - -export const ClientNotificationDialog = ({ open, onOpenChange }: ClientNotificationDialogProps) => { - const { t } = useTranslation("dialog"); - const { getClientNotification, removeClientNotification } = useDevice(); - - const localOnOpenChange = (open: boolean) => { - removeClientNotification(0); - if (!getClientNotification(0)) { - onOpenChange(open); - } - }; - - const dialogContent = (() => { - if (!getClientNotification(0)) { - return; - } - - switch (getClientNotification(0)?.payloadVariant.case) { - // TODO: Add KeyVerification logic - /*case "keyVerificationNumberInform": - return <>; - case "keyVerificationNumberRequest": - return <>; - case "keyVerificationFinal": - return <>; - case "duplicatedPublicKey": - return <>; - case "lowEntropyKey": - return <>;*/ - - default: - return ( - - {t("clientNotification.title")} - - {t([ - `clientNotification.${getClientNotification(0)?.message}`, - getClientNotification(0)?.message ?? "", - ])} - - - ); - } - })(); - - return ( - - - - {dialogContent} - - - ); -}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3192d6c..f99176c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^2.12.0 version: 2.12.0 '@meshtastic/protobufs': - specifier: jsr:^2.7.20 - version: '@jsr/meshtastic__protobufs@2.7.20' + specifier: workspace:* + version: link:packages/protobufs ste-simple-events: specifier: ^3.0.11 version: 3.0.11 @@ -49,17 +49,283 @@ importers: specifier: ^4.1.8 version: 4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + apps/web: + dependencies: + '@hookform/resolvers': + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.78.0(react@19.2.4)) + '@meshtastic/core': + specifier: workspace:* + version: link:../../packages/core + '@meshtastic/transport-http': + specifier: workspace:* + version: link:../../packages/transport-http + '@meshtastic/transport-web-bluetooth': + specifier: workspace:* + version: link:../../packages/transport-web-bluetooth + '@meshtastic/transport-web-serial': + specifier: workspace:* + version: link:../../packages/transport-web-serial + '@noble/curves': + specifier: ^1.9.2 + version: 1.9.7 + '@preact/signals-core': + specifier: ^1.8.0 + version: 1.14.2 + '@radix-ui/react-accordion': + specifier: ^1.2.12 + version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-checkbox': + specifier: ^1.3.3 + version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-label': + specifier: ^2.1.7 + version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-menubar': + specifier: ^1.1.16 + version: 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popover': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-scroll-area': + specifier: ^1.2.10 + version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-separator': + specifier: ^1.1.7 + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slider': + specifier: ^1.3.6 + version: 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-switch': + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tabs': + specifier: ^1.1.13 + version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toast': + specifier: ^1.2.15 + version: 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toggle-group': + specifier: ^1.1.11 + version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tooltip': + specifier: ^1.2.8 + version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-visually-hidden': + specifier: ^1.2.3 + version: 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tailwindcss/vite': + specifier: ^4.1.14 + version: 4.2.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/react-router': + specifier: ^1.170.15 + version: 1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-router-devtools': + specifier: ^1.167.0 + version: 1.167.0(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.13)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/router-cli': + specifier: ^1.167.17 + version: 1.167.17 + '@tanstack/router-devtools': + specifier: ^1.167.0 + version: 1.167.0(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.13)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@turf/turf': + specifier: ^7.2.0 + version: 7.3.4 + '@types/node': + specifier: ^24.7.0 + version: 24.12.0 + '@types/web-bluetooth': + specifier: ^0.0.21 + version: 0.0.21 + base64-js: + specifier: ^1.5.1 + version: 1.5.1 + better-result: + specifier: ^1.0.0 + version: 1.0.1 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + crypto-random-string: + specifier: ^5.0.0 + version: 5.0.0 + i18next: + specifier: ^25.5.3 + version: 25.8.17(typescript@5.9.3) + i18next-browser-languagedetector: + specifier: ^8.2.0 + version: 8.2.1 + i18next-http-backend: + specifier: ^4.0.0 + version: 4.0.0 + idb-keyval: + specifier: ^6.2.2 + version: 6.2.2 + immer: + specifier: ^11.1.8 + version: 11.1.8 + js-cookie: + specifier: ^3.0.7 + version: 3.0.7 + lucide-react: + specifier: ^1.17.0 + version: 1.17.0(react@19.2.4) + maplibre-gl: + specifier: 5.8.0 + version: 5.8.0 + react: + specifier: ^19.2.0 + version: 19.2.4 + react-dom: + specifier: ^19.2.0 + version: 19.2.4(react@19.2.4) + react-error-boundary: + specifier: ^6.0.0 + version: 6.1.1(react@19.2.4) + react-hook-form: + specifier: ^7.78.0 + version: 7.78.0(react@19.2.4) + react-i18next: + specifier: ^17.0.8 + version: 17.0.8(i18next@25.8.17(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react-map-gl: + specifier: 8.1.0 + version: 8.1.0(maplibre-gl@5.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-qrcode-logo: + specifier: ^4.0.0 + version: 4.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + rfc4648: + specifier: ^1.5.4 + version: 1.5.4 + vite: + specifier: ^7.3.2 + version: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-html: + specifier: ^3.2.2 + version: 3.2.2(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-pwa: + specifier: ^1.3.0 + version: 1.3.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) + zod: + specifier: ^4.1.12 + version: 4.4.3 + zustand: + specifier: 5.0.8 + version: 5.0.8(@types/react@19.2.14)(immer@11.1.8)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + devDependencies: + '@tanstack/router-plugin': + specifier: ^1.168.18 + version: 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) + '@types/chrome': + specifier: ^0.1.22 + version: 0.1.37 + '@types/geojson': + specifier: ^7946.0.16 + version: 7946.0.16 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/react': + specifier: ^19.2.1 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.0 + version: 19.2.3(@types/react@19.2.14) + '@types/serviceworker': + specifier: ^0.0.158 + version: 0.0.158 + '@types/w3c-web-serial': + specifier: ^1.0.8 + version: 1.0.8 + '@vitejs/plugin-basic-ssl': + specifier: ^2.1.0 + version: 2.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + '@vitejs/plugin-react': + specifier: ^5.0.4 + version: 5.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.27(postcss@8.5.10) + gzipper: + specifier: ^8.2.1 + version: 8.2.1 + happy-dom: + specifier: ^20.8.9 + version: 20.8.9 + oxfmt: + specifier: ^0.16.0 + version: 0.16.0 + oxlint: + specifier: ^1.41.0 + version: 1.52.0 + tailwind-merge: + specifier: ^3.3.1 + version: 3.5.0 + tailwindcss: + specifier: ^4.1.14 + version: 4.2.1 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.2.1) + tar: + specifier: ^7.5.11 + version: 7.5.11 + testing-library: + specifier: ^0.0.2 + version: 0.0.2(@angular/common@6.1.10(@angular/core@6.1.10(rxjs@6.6.7)(zone.js@0.8.29))(rxjs@6.6.7))(@angular/core@6.1.10(rxjs@6.6.7)(zone.js@0.8.29)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^4.1.8 + version: 4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + packages/core: dependencies: + '@meshtastic/protobufs': + specifier: workspace:* + version: link:../protobufs crc: specifier: npm:crc@^4.3.2 version: 4.3.2 packages/protobufs: + dependencies: + '@bufbuild/protobuf': + specifier: ^2.9.0 + version: 2.12.0 devDependencies: '@bufbuild/protoc-gen-es': specifier: ^1.9.0 - version: 1.10.1(@bufbuild/protobuf@1.10.1) + version: 1.10.1(@bufbuild/protobuf@2.12.0) rimraf: specifier: ^6.0.0 version: 6.1.3 @@ -156,7 +422,7 @@ importers: version: 4.2.1 '@tailwindcss/vite': specifier: ^4.1.14 - version: 4.2.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) '@types/react': specifier: ^18.3.5 version: 18.3.28 @@ -165,7 +431,7 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) publint: specifier: ^0.3.14 version: 0.3.18 @@ -180,269 +446,16 @@ importers: version: 5.9.3 vite: specifier: ^7.3.2 - version: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.12.0)(rollup@4.60.2)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@24.12.0)(rollup@4.60.2)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) vite-plugin-static-copy: specifier: ^4.1.1 - version: 4.1.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: specifier: ^4.1.8 - version: 4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - - packages/web: - dependencies: - '@hookform/resolvers': - specifier: ^5.2.2 - version: 5.2.2(react-hook-form@7.78.0(react@19.2.4)) - '@meshtastic/core': - specifier: workspace:* - version: link:../core - '@meshtastic/transport-http': - specifier: workspace:* - version: link:../transport-http - '@meshtastic/transport-web-bluetooth': - specifier: workspace:* - version: link:../transport-web-bluetooth - '@meshtastic/transport-web-serial': - specifier: workspace:* - version: link:../transport-web-serial - '@noble/curves': - specifier: ^1.9.2 - version: 1.9.7 - '@radix-ui/react-accordion': - specifier: ^1.2.12 - version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-alert-dialog': - specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-checkbox': - specifier: ^1.3.3 - version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dialog': - specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dropdown-menu': - specifier: ^2.1.16 - version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-label': - specifier: ^2.1.7 - version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-menubar': - specifier: ^1.1.16 - version: 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-popover': - specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-scroll-area': - specifier: ^1.2.10 - version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-select': - specifier: ^2.2.6 - version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-separator': - specifier: ^1.1.7 - version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slider': - specifier: ^1.3.6 - version: 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-switch': - specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-tabs': - specifier: ^1.1.13 - version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-toast': - specifier: ^1.2.15 - version: 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-toggle-group': - specifier: ^1.1.11 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-tooltip': - specifier: ^1.2.8 - version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-visually-hidden': - specifier: ^1.2.3 - version: 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tailwindcss/vite': - specifier: ^4.1.14 - version: 4.2.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/react-router': - specifier: ^1.170.15 - version: 1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-router-devtools': - specifier: ^1.167.0 - version: 1.167.0(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.13)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-cli': - specifier: ^1.167.17 - version: 1.167.17 - '@tanstack/router-devtools': - specifier: ^1.167.0 - version: 1.167.0(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.171.13)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@turf/turf': - specifier: ^7.2.0 - version: 7.3.4 - '@types/node': - specifier: ^24.7.0 - version: 24.12.0 - '@types/web-bluetooth': - specifier: ^0.0.21 - version: 0.0.21 - base64-js: - specifier: ^1.5.1 - version: 1.5.1 - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - cmdk: - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - crypto-random-string: - specifier: ^5.0.0 - version: 5.0.0 - i18next: - specifier: ^25.5.3 - version: 25.8.17(typescript@5.9.3) - i18next-browser-languagedetector: - specifier: ^8.2.0 - version: 8.2.1 - i18next-http-backend: - specifier: ^4.0.0 - version: 4.0.0 - idb-keyval: - specifier: ^6.2.2 - version: 6.2.2 - immer: - specifier: ^11.1.8 - version: 11.1.8 - js-cookie: - specifier: ^3.0.7 - version: 3.0.7 - lucide-react: - specifier: ^1.17.0 - version: 1.17.0(react@19.2.4) - maplibre-gl: - specifier: 5.8.0 - version: 5.8.0 - react: - specifier: ^19.2.0 - version: 19.2.4 - react-dom: - specifier: ^19.2.0 - version: 19.2.4(react@19.2.4) - react-error-boundary: - specifier: ^6.0.0 - version: 6.1.1(react@19.2.4) - react-hook-form: - specifier: ^7.78.0 - version: 7.78.0(react@19.2.4) - react-i18next: - specifier: ^17.0.8 - version: 17.0.8(i18next@25.8.17(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - react-map-gl: - specifier: 8.1.0 - version: 8.1.0(maplibre-gl@5.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-qrcode-logo: - specifier: ^4.0.0 - version: 4.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - rfc4648: - specifier: ^1.5.4 - version: 1.5.4 - vite: - specifier: ^7.3.2 - version: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-html: - specifier: ^3.2.2 - version: 3.2.2(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - vite-plugin-pwa: - specifier: ^1.3.0 - version: 1.3.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) - zod: - specifier: ^4.1.12 - version: 4.3.6 - zustand: - specifier: 5.0.8 - version: 5.0.8(@types/react@19.2.14)(immer@11.1.8)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - devDependencies: - '@tanstack/router-plugin': - specifier: ^1.168.18 - version: 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - '@testing-library/jest-dom': - specifier: ^6.9.1 - version: 6.9.1 - '@testing-library/react': - specifier: ^16.3.0 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@testing-library/user-event': - specifier: ^14.6.1 - version: 14.6.1(@testing-library/dom@10.4.1) - '@types/chrome': - specifier: ^0.1.22 - version: 0.1.37 - '@types/geojson': - specifier: ^7946.0.16 - version: 7946.0.16 - '@types/js-cookie': - specifier: ^3.0.6 - version: 3.0.6 - '@types/react': - specifier: ^19.2.1 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.2.0 - version: 19.2.3(@types/react@19.2.14) - '@types/serviceworker': - specifier: ^0.0.158 - version: 0.0.158 - '@types/w3c-web-serial': - specifier: ^1.0.8 - version: 1.0.8 - '@vitejs/plugin-basic-ssl': - specifier: ^2.1.0 - version: 2.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - '@vitejs/plugin-react': - specifier: ^5.0.4 - version: 5.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - autoprefixer: - specifier: ^10.4.21 - version: 10.4.27(postcss@8.5.10) - gzipper: - specifier: ^8.2.1 - version: 8.2.1 - happy-dom: - specifier: ^20.8.9 - version: 20.8.9 - oxfmt: - specifier: ^0.16.0 - version: 0.16.0 - oxlint: - specifier: ^1.41.0 - version: 1.52.0 - tailwind-merge: - specifier: ^3.3.1 - version: 3.5.0 - tailwindcss: - specifier: ^4.1.14 - version: 4.2.1 - tailwindcss-animate: - specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.2.1) - tar: - specifier: ^7.5.11 - version: 7.5.11 - testing-library: - specifier: ^0.0.2 - version: 0.0.2(@angular/common@6.1.10(@angular/core@6.1.10(rxjs@6.6.7)(zone.js@0.8.29))(rxjs@6.6.7))(@angular/core@6.1.10(rxjs@6.6.7)(zone.js@0.8.29)) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.1.8 - version: 4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) packages: @@ -471,18 +484,10 @@ packages: peerDependencies: ajv: '>=8' - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.7': resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} @@ -507,10 +512,6 @@ packages: resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} @@ -532,10 +533,6 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} @@ -544,20 +541,10 @@ packages: resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.29.7': resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.29.7': resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} @@ -568,10 +555,6 @@ packages: resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.29.7': resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} @@ -592,26 +575,14 @@ packages: resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.29.7': resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} @@ -620,10 +591,6 @@ packages: resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.7': resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} @@ -1027,34 +994,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} @@ -1543,6 +1494,9 @@ packages: cpu: [x64] os: [win32] + '@preact/signals-core@1.14.2': + resolution: {integrity: sha512-RZHdBj9ZF4n40Rp4jS052EHHjBWf96P9oNdXPfhQTovCuWY9iQn3Gq+gOTJSgBO9A/JBuPfMOWsSX/lIU9Pc/A==} + '@publint/pack@0.1.4': resolution: {integrity: sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ==} engines: {node: '>=18'} @@ -3563,16 +3517,14 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} - engines: {node: '>=6.0.0'} - hasBin: true - baseline-browser-mapping@2.10.35: resolution: {integrity: sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==} engines: {node: '>=6.0.0'} hasBin: true + better-result@1.0.1: + resolution: {integrity: sha512-5IUPG5P3cUJgAc7rizc3heHqcJzVQDG+YrcJXhjhsjfJrFdCerpfe0RTL3nIYJCT3nU3GN/BJCaahIyqWfLYyg==} + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -3601,11 +3553,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.28.2: resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3639,9 +3586,6 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - caniuse-lite@1.0.30001777: - resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} - caniuse-lite@1.0.30001797: resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} @@ -3924,9 +3868,6 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.307: - resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} - electron-to-chromium@1.5.371: resolution: {integrity: sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==} @@ -4500,9 +4441,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} @@ -4746,9 +4684,6 @@ packages: node-html-parser@5.4.2: resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} - node-releases@2.0.47: resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} engines: {node: '>=18'} @@ -5486,11 +5421,6 @@ packages: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} - terser@5.46.0: - resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} - engines: {node: '>=10'} - hasBin: true - terser@5.48.0: resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} engines: {node: '>=10'} @@ -5523,10 +5453,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -5996,9 +5922,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -6047,33 +5970,25 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} - '@babel/compat-data@7.29.7': {} '@babel/core@7.29.0': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -6105,7 +6020,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.7 '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -6123,14 +6038,6 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 @@ -6170,8 +6077,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} '@babel/helper-member-expression-to-functions@7.29.7': @@ -6181,13 +6086,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.29.7': dependencies: '@babel/traverse': 7.29.7 @@ -6195,12 +6093,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -6217,8 +6115,6 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-plugin-utils@7.29.7': {} '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': @@ -6246,16 +6142,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-validator-option@7.29.7': {} '@babel/helper-wrap-function@7.29.7': @@ -6266,11 +6156,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.6': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - '@babel/helpers@7.29.7': dependencies: '@babel/template': 7.29.7 @@ -6616,12 +6501,22 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': dependencies: @@ -6774,34 +6669,14 @@ snapshots: '@babel/types': 7.29.7 esutils: 2.0.3 - '@babel/runtime@7.28.6': {} - '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.7 - '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -6814,11 +6689,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 @@ -6828,11 +6698,11 @@ snapshots: '@bufbuild/protobuf@2.12.0': {} - '@bufbuild/protoc-gen-es@1.10.1(@bufbuild/protobuf@1.10.1)': + '@bufbuild/protoc-gen-es@1.10.1(@bufbuild/protobuf@2.12.0)': dependencies: '@bufbuild/protoplugin': 1.10.1 optionalDependencies: - '@bufbuild/protobuf': 1.10.1 + '@bufbuild/protobuf': 2.12.0 transitivePeerDependencies: - supports-color @@ -7204,6 +7074,8 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.52.0': optional: true + '@preact/signals-core@1.14.2': {} + '@publint/pack@0.1.4': {} '@quansync/fs@1.0.0': @@ -7355,6 +7227,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.28 + '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-context@1.1.2(@types/react@18.3.28)(react@19.2.4)': dependencies: react: 19.2.4 @@ -7540,6 +7418,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.28 + '@radix-ui/react-id@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -7772,6 +7657,15 @@ snapshots: '@types/react': 18.3.28 '@types/react-dom': 18.3.7(@types/react@18.3.28) + '@radix-ui/react-primitive@2.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.5(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -7924,6 +7818,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.28 + '@radix-ui/react-slot@1.2.5(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -8130,6 +8031,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.28 + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)': dependencies: react: 19.2.4 @@ -8423,7 +8330,7 @@ snapshots: '@serialport/binding-mock@10.2.2': dependencies: '@serialport/bindings-interface': 1.2.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8489,7 +8396,7 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.20.0 - jiti: 2.6.1 + jiti: 2.7.0 lightningcss: 1.31.1 magic-string: 0.30.21 source-map-js: 1.2.1 @@ -8554,12 +8461,12 @@ snapshots: postcss: 8.5.8 tailwindcss: 4.2.1 - '@tailwindcss/vite@4.2.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) '@tanstack/history@1.162.0': {} @@ -8639,7 +8546,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -8652,7 +8559,7 @@ snapshots: zod: 4.4.3 optionalDependencies: '@tanstack/react-router': 1.170.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -8695,7 +8602,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -9842,8 +9749,8 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 @@ -9854,7 +9761,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.7 '@babel/types': 7.29.7 '@types/babel__traverse@7.28.0': @@ -9970,11 +9877,11 @@ snapshots: optionalDependencies: maplibre-gl: 5.8.0 - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) - '@vitejs/plugin-react@4.7.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -9982,19 +9889,19 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -10007,14 +9914,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 4.1.8 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.1.8(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.1.8 @@ -10195,8 +10094,8 @@ snapshots: autoprefixer@10.4.27(postcss@8.5.10): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001777 + browserslist: 4.28.2 + caniuse-lite: 1.0.30001797 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.10 @@ -10245,10 +10144,10 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.0: {} - baseline-browser-mapping@2.10.35: {} + better-result@1.0.1: {} + bignumber.js@9.3.1: {} binary-extensions@2.3.0: {} @@ -10273,14 +10172,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001777 - electron-to-chromium: 1.5.307 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - browserslist@4.28.2: dependencies: baseline-browser-mapping: 2.10.35 @@ -10324,8 +10215,6 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 - caniuse-lite@1.0.30001777: {} - caniuse-lite@1.0.30001797: {} chai@6.2.2: {} @@ -10379,10 +10268,10 @@ snapshots: cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: @@ -10580,8 +10469,6 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.307: {} - electron-to-chromium@1.5.371: {} emoji-regex@10.6.0: {} @@ -10787,13 +10674,13 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 fs-extra@9.1.0: @@ -10972,7 +10859,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.46.0 + terser: 5.48.0 html-parse-stringify@3.0.1: dependencies: @@ -10982,13 +10869,13 @@ snapshots: i18next-browser-languagedetector@8.2.1: dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.7 i18next-http-backend@4.0.0: {} i18next@25.8.17(typescript@5.9.3): dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.7 optionalDependencies: typescript: 5.9.3 @@ -11192,12 +11079,6 @@ snapshots: json5@2.2.3: {} - jsonfile@6.2.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - jsonfile@6.2.1: dependencies: universalify: 2.0.1 @@ -11428,8 +11309,6 @@ snapshots: css-select: 4.3.0 he: 1.2.0 - node-releases@2.0.36: {} - node-releases@2.0.47: {} normalize-path@3.0.0: {} @@ -12280,13 +12159,6 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser@5.46.0: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 - commander: 2.20.3 - source-map-support: 0.5.21 - terser@5.48.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -12320,11 +12192,6 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -12501,12 +12368,6 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 @@ -12549,7 +12410,7 @@ snapshots: util-deprecate@1.0.2: {} - vite-plugin-dts@4.5.4(@types/node@24.12.0)(rollup@4.60.2)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@24.12.0)(rollup@4.60.2)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.57.7(@types/node@24.12.0) '@rollup/pluginutils': 5.3.0(rollup@4.60.2) @@ -12562,13 +12423,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-html@3.2.2(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -12582,43 +12443,26 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-pwa@1.3.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0): + vite-plugin-pwa@1.3.0(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 tinyglobby: 0.2.17 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) workbox-build: 7.4.0(@types/babel__core@7.20.5) workbox-window: 7.4.0 transitivePeerDependencies: - supports-color - vite-plugin-static-copy@4.1.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-static-copy@4.1.1(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.17 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) - - vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.10 - rollup: 4.60.2 - tinyglobby: 0.2.16 - optionalDependencies: - '@types/node': 24.12.0 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.31.1 - terser: 5.48.0 - tsx: 4.21.0 - yaml: 2.8.2 + vite: 7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: @@ -12627,7 +12471,7 @@ snapshots: picomatch: 4.0.4 postcss: 8.5.10 rollup: 4.60.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.12.0 fsevents: 2.3.3 @@ -12637,34 +12481,6 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitest@4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.1.8 - '@vitest/runner': 4.1.8 - '@vitest/snapshot': 4.1.8 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.2 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.12.0 - happy-dom: 20.8.9 - transitivePeerDependencies: - - msw - vitest@4.1.8(@types/node@24.12.0)(happy-dom@20.8.9)(vite@7.3.2(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.31.1)(terser@5.48.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@vitest/expect': 4.1.8 @@ -12912,8 +12728,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - zod@4.3.6: {} - zod@4.4.3: {} zone.js@0.8.29: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 52ff2e1d..886ae9a3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,3 +6,4 @@ allowBuilds: minimumReleaseAge: 2880 # package dependency library must be at least 2 days old packages: - "packages/*" + - "apps/*" diff --git a/tsconfig.json b/tsconfig.json index 0b4120ba..d359fc1f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "files": [], "references": [ - { "path": "packages/web" }, + { "path": "apps/web" }, { "path": "packages/transport-http" } ] } diff --git a/vitest.config.ts b/vitest.config.ts index 9e51699d..3b3ac6f0 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,6 +2,6 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { - projects: ["packages/*"], + projects: ["packages/*", "apps/*"], }, });