if this enum type has no constant with the specified name
From a2ccedf2e32b2b2bff62ff6f186830751e16970d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Sep 2026 05:08:48 +0000 Subject: [PATCH] docs: publish channels: main api --- .../reconcile-conversations.html | 2 +- .../-switching-channel-set-data-source/set-lora-config.html | 2 +- .../update-channel-settings.html | 2 +- .../-command-sender-impl/-companion/index.html | 2 +- .../-command-sender-impl/request-neighbor-info.html | 2 +- .../-command-sender-impl/request-position.html | 2 +- .../request-telemetry-for-connection.html | 2 +- .../-command-sender-impl/request-telemetry.html | 2 +- .../-command-sender-impl/request-traceroute.html | 2 +- .../-command-sender-impl/request-user-info.html | 2 +- .../-command-sender-impl/resolve-node-num.html | 2 +- .../-command-sender-impl/send-admin-await-result.html | 2 +- .../-command-sender-impl/send-admin-for-connection.html | 2 +- .../-command-sender-impl/send-admin-immediate.html | 2 +- .../-command-sender-impl/send-admin.html | 2 +- .../-command-sender-impl/send-lock-now.html | 2 +- .../-command-sender-impl/send-lockdown-passphrase.html | 2 +- .../-command-sender-impl/send-position.html | 2 +- .../-command-sender-impl/set-fixed-position.html | 2 +- .../-companion/resolve-history-request-parameters.html | 2 +- .../-history-manager-impl/request-history-replay.html | 2 +- .../update-store-forward-last-request.html | 2 +- .../-mesh-connection-manager-impl/-companion/index.html | 2 +- .../-mesh-connection-manager-impl/clear-radio-config.html | 2 +- .../-mesh-connection-manager-impl/on-handshake-complete.html | 2 +- .../-mesh-connection-manager-impl/on-handshake-progress.html | 2 +- .../on-my-node-info-received.html | 2 +- .../-mesh-connection-manager-impl/on-node-db-ready.html | 2 +- .../-mesh-connection-manager-impl/on-radio-config-loaded.html | 2 +- .../-mesh-connection-manager-impl/start-node-info-only.html | 2 +- .../update-status-notification.html | 2 +- .../-mesh-connection-manager-impl/update-telemetry.html | 2 +- .../-mesh-data-handler-impl/-companion/index.html | 2 +- .../-mesh-data-handler-impl/remember-data-packet.html | 2 +- .../-mesh-message-processor-impl/-companion/index.html | 2 +- .../-mqtt-manager-impl/handle-mqtt-proxy-message.html | 2 +- .../-mqtt-manager-impl/probe.html | 2 +- .../-mqtt-manager-impl/stop.html | 2 +- .../-companion/-m-a-x_-i-n_-m-e-m-o-r-y_-n-o-d-e-s.html | 2 +- .../-node-manager-impl/apply-trusted-identity-migrations.html | 2 +- .../-node-manager-impl/clear.html | 2 +- .../-node-manager-impl/get-my-id.html | 2 +- .../-node-manager-impl/get-my-node-info.html | 2 +- .../-node-manager-impl/handle-received-node-status.html | 2 +- .../-node-manager-impl/handle-received-paxcounter.html | 2 +- .../-node-manager-impl/handle-received-position.html | 2 +- .../-node-manager-impl/handle-received-telemetry.html | 2 +- .../-node-manager-impl/handle-received-user.html | 2 +- .../-node-manager-impl/insert-metadata.html | 2 +- .../-node-manager-impl/install-node-info-and-persist.html | 2 +- .../-node-manager-impl/install-node-info.html | 2 +- .../-node-manager-impl/load-cached-node-d-b.html | 2 +- .../-node-manager-impl/remove-by-nodenum.html | 2 +- .../-node-manager-impl/to-node-i-d.html | 2 +- .../-node-manager-impl/update-node-and-persist.html | 2 +- .../-node-manager-impl/update-node-for-session.html | 2 +- .../-node-manager-impl/update-node-status-and-persist.html | 2 +- .../-node-manager-impl/update-node-status.html | 2 +- .../-node-manager-impl/update-node.html | 2 +- .../-telemetry-packet-handler-impl/-companion/index.html | 2 +- .../-x-modem-manager-impl/-companion/index.html | 2 +- .../-mesh-log-repository-impl/-companion/index.html | 2 +- .../-mesh-log-repository-impl/delete-all.html | 2 +- .../-mesh-log-repository-impl/delete-local-stats-logs.html | 2 +- .../-mesh-log-repository-impl/delete-log.html | 2 +- .../-mesh-log-repository-impl/delete-logs-older-than.html | 2 +- .../-mesh-log-repository-impl/delete-logs.html | 2 +- .../-mesh-log-repository-impl/get-my-node-info.html | 2 +- .../-mesh-log-repository-impl/insert.html | 2 +- .../-node-repository-impl/clear-my-node-info.html | 2 +- .../-node-repository-impl/clear-node-d-b.html | 2 +- .../-node-repository-impl/delete-node.html | 2 +- .../-node-repository-impl/delete-nodes.html | 2 +- .../-node-repository-impl/get-node-db-snapshot.html | 2 +- .../-node-repository-impl/get-nodes-older-than.html | 2 +- .../-node-repository-impl/get-nodes.html | 2 +- .../-node-repository-impl/get-unknown-nodes.html | 2 +- .../-node-repository-impl/insert-metadata.html | 2 +- .../-node-repository-impl/install-config.html | 2 +- .../-node-repository-impl/mark-all-heard-on-current-lora.html | 2 +- .../-node-repository-impl/online-node-count.html | 2 +- .../-node-repository-impl/set-node-notes.html | 2 +- .../-node-repository-impl/total-node-count.html | 2 +- .../-node-repository-impl/update-power-channel-label.html | 2 +- .../-node-repository-impl/upsert.html | 2 +- .../-node-info-dao/backfill-denormalized-names.html | 2 +- .../-node-info-dao/clear-my-node-info.html | 2 +- .../-node-info-dao/clear-node-info.html | 2 +- .../-node-info-dao/delete-all-nodes.html | 2 +- .../-node-info-dao/delete-dm-contact-settings.html | 2 +- .../-node-info-dao/delete-metadata-for-nodes.html | 2 +- .../-node-info-dao/delete-metadata.html | 2 +- .../-node-info-dao/delete-node-and-metadata.html | 2 +- .../-node-info-dao/delete-node.html | 2 +- .../-node-info-dao/delete-nodes-and-metadata.html | 2 +- .../-node-info-dao/delete-nodes.html | 2 +- .../-node-info-dao/delete-non-favorite-nodes.html | 2 +- .../-node-info-dao/delete-reactions-for-owner.html | 2 +- .../-node-info-dao/do-upsert.html | 2 +- .../-node-info-dao/find-node-by-public-key.html | 2 +- .../-node-info-dao/find-nodes-by-public-keys.html | 2 +- .../-node-info-dao/get-all-metadata-snapshot.html | 2 +- .../-node-info-dao/get-all-nodes-snapshot.html | 2 +- .../-node-info-dao/get-my-node-entity.html | 2 +- .../-node-info-dao/get-my-node-info.html | 2 +- .../-node-info-dao/get-node-by-num.html | 2 +- .../-node-info-dao/get-node-entities-by-nums.html | 2 +- .../-node-info-dao/get-nodes-older-than.html | 2 +- .../-node-info-dao/get-nodes.html | 2 +- .../-node-info-dao/get-unknown-nodes.html | 2 +- .../-node-info-dao/install-config.html | 2 +- .../-node-info-dao/mark-all-heard-on-current-lora.html | 2 +- .../-node-info-dao/node-d-bby-num-snapshot.html | 2 +- .../-node-info-dao/node-d-bby-num.html | 2 +- .../-node-info-dao/put-all.html | 2 +- .../-node-info-dao/remap-dm-contact-key.html | 2 +- .../-node-info-dao/remap-dm-contact-settings.html | 2 +- .../-node-info-dao/remap-packet-owner.html | 2 +- .../-node-info-dao/remap-reaction-owner.html | 2 +- .../-node-info-dao/set-my-node-info.html | 2 +- .../-node-info-dao/set-node-notes.html | 2 +- .../-node-info-dao/set-power-channel-labels.html | 2 +- .../-node-info-dao/update-power-channel-label.html | 2 +- .../-node-info-dao/upsert.html | 2 +- .../-mesh-log/-mesh-log.html | 2 +- .../org.meshtastic.core.database.entity/-mesh-log/index.html | 4 ++-- .../-companion/-e-r-r-o-r_-b-y-t-e_-s-t-r-i-n-g.html | 2 +- .../-node-entity/-companion/current-time.html | 2 +- .../-node-entity/-companion/deg-d.html | 2 +- .../-node-entity/-companion/deg-i.html | 2 +- .../-node-entity/-companion/index.html | 2 +- .../-node-entity/-node-entity.html | 2 +- .../-node-entity/air-quality-metrics.html | 2 +- .../-node-entity/air-quality-telemetry.html | 2 +- .../-node-entity/channel.html | 2 +- .../-node-entity/device-metrics.html | 2 +- .../-node-entity/device-telemetry.html | 2 +- .../-node-entity/environment-metrics.html | 2 +- .../-node-entity/environment-telemetry.html | 2 +- .../-node-entity/has-p-k-c.html | 2 +- .../-node-entity/heard-on-current-lora.html | 2 +- .../-node-entity/hops-away.html | 2 +- .../-node-entity/index.html | 4 ++-- .../-node-entity/is-favorite.html | 2 +- .../-node-entity/is-ignored.html | 2 +- .../-node-entity/is-muted.html | 2 +- .../-node-entity/is-online.html | 2 +- .../-node-entity/is-unknown-user.html | 2 +- .../-node-entity/key-match.html | 2 +- .../-node-entity/last-transport.html | 2 +- .../-node-entity/manually-verified.html | 2 +- .../-node-entity/new-public-key.html | 2 +- .../-node-entity/node-status.html | 2 +- .../-node-entity/notes.html | 2 +- .../-node-entity/paxcounter.html | 2 +- .../-node-entity/power-channel-labels.html | 2 +- .../-node-entity/power-metrics.html | 2 +- .../-node-entity/power-telemetry.html | 2 +- .../-node-entity/public-key.html | 2 +- .../-node-entity/set-position.html | 2 +- .../-node-entity/signs-packets.html | 2 +- .../-node-entity/to-model.html | 2 +- .../-node-entity/via-mqtt.html | 2 +- .../database/org.meshtastic.core.database.entity/index.html | 4 ++-- .../-converters/byte-string-to-bytes.html | 2 +- .../-converters/bytes-to-byte-string.html | 2 +- .../-converters/bytes-to-channel-set.html | 2 +- .../-converters/bytes-to-channel-settings.html | 2 +- .../-converters/bytes-to-lo-ra-config.html | 2 +- .../-converters/bytes-to-metadata.html | 2 +- .../-converters/bytes-to-paxcounter.html | 2 +- .../-converters/bytes-to-position.html | 2 +- .../-converters/bytes-to-telemetry.html | 2 +- .../-converters/bytes-to-user.html | 2 +- .../-converters/channel-set-to-bytes.html | 2 +- .../-converters/channel-settings-to-bytes.html | 2 +- .../-converters/from-radio-to-bytes.html | 2 +- .../-converters/from-string-list.html | 2 +- .../-converters/int-to-message-status.html | 2 +- .../-converters/lo-ra-config-to-bytes.html | 2 +- .../-converters/message-status-to-int.html | 2 +- .../-converters/metadata-to-bytes.html | 2 +- .../-converters/pax-counter-to-bytes.html | 2 +- .../-converters/position-to-bytes.html | 2 +- .../-converters/telemetry-to-bytes.html | 2 +- .../-converters/to-string-list.html | 2 +- .../-converters/user-to-bytes.html | 2 +- .../-beacon-join-option/entries.html | 2 +- .../-beacon-join-option/index.html | 2 +- .../-beacon-join-option/value-of.html | 2 +- .../-beacon-join-option/values.html | 2 +- ...-h-a-n-n-e-l_-i-d-e-n-t-i-t-y_-t-o-k-e-n_-l-e-n-g-t-h.html | 2 +- .../-channel-identity/-channel-identity.html | 2 +- .../-channel-identity/index.html | 2 +- .../-channel-identity/name.html | 2 +- .../org.meshtastic.core.model.util/-channel-identity/psk.html | 2 +- .../-channel-identity/to-string.html | 2 +- .../-channel-identity/token.html | 2 +- .../org.meshtastic.core.model.util/beacon-join-option.html | 2 +- .../org.meshtastic.core.model.util/channel-identity.html | 2 +- .../model/org.meshtastic.core.model.util/compare-users.html | 2 +- .../model/org.meshtastic.core.model.util/get-channel-url.html | 2 +- .../get-shared-contact-url.html | 2 +- .../org.meshtastic.core.model.util/is-already-joined.html | 2 +- .../is-channel-placeholder.html | 2 +- .../normalize-replacement-settings.html | 2 +- .../org.meshtastic.core.model.util/to-join-channel-set.html | 2 +- .../org.meshtastic.core.model.util/to-shared-contact.html | 2 +- .../org.meshtastic.core.model.util/user-fields-to-string.html | 2 +- .../-channel/-companion/get-random-key.html | 2 +- .../model/org.meshtastic.core.model/-channel/channel-num.html | 2 +- api/core/model/org.meshtastic.core.model/-channel/equals.html | 2 +- .../model/org.meshtastic.core.model/-channel/hash-code.html | 2 +- api/core/model/org.meshtastic.core.model/-channel/hash.html | 2 +- api/core/model/org.meshtastic.core.model/-channel/name.html | 2 +- api/core/model/org.meshtastic.core.model/-channel/psk.html | 2 +- .../model/org.meshtastic.core.model/-channel/radio-freq.html | 2 +- .../model/org.meshtastic.core.model/-mesh-log/-mesh-log.html | 2 +- api/core/model/org.meshtastic.core.model/-mesh-log/index.html | 4 ++-- api/core/model/org.meshtastic.core.model/-node/-node.html | 2 +- api/core/model/org.meshtastic.core.model/-node/index.html | 4 ++-- .../-traceroute-map-availability/entries.html | 2 +- .../-traceroute-map-availability/index.html | 2 +- .../-traceroute-map-availability/value-of.html | 2 +- .../-traceroute-map-availability/values.html | 2 +- .../evaluate-traceroute-map-availability.html | 2 +- .../org.meshtastic.core.model/get-traceroute-response.html | 2 +- api/core/model/org.meshtastic.core.model/index.html | 4 ++-- .../org.meshtastic.core.model/is-unmessageable-role.html | 2 +- api/core/model/org.meshtastic.core.model/matches-search.html | 2 +- .../-mock-radio-transport/-mock-radio-transport.html | 2 +- .../-mock-radio-transport/address.html | 2 +- .../-mock-radio-transport/close.html | 2 +- .../-mock-radio-transport/handle-send-to-radio.html | 2 +- .../-mock-radio-transport/index.html | 2 +- .../-mock-radio-transport/start.html | 2 +- .../-d-e-f-a-u-l-t_-p-a-c-k-e-t_-d-e-l-a-y_-m-s.html | 2 +- .../-replay-radio-transport/-companion/index.html | 2 +- .../-replay-radio-transport/close.html | 2 +- .../-m-q-t-t-repository-impl/publish.html | 2 +- .../-m-q-t-t_-k-e-e-p-a-l-i-v-e_-s-e-c-o-n-d-s.html | 2 +- .../effective-tls-enabled.html | 2 +- .../is-credential-rejection.html | 2 +- .../resolve-endpoint.html | 2 +- .../-heartbeat-sender/-companion/-f-i-r-s-t_-n-o-n-c-e.html | 2 +- .../-heartbeat-sender/-companion/index.html | 2 +- .../to-fixed-position-admin-message.html | 2 +- .../-android-mesh-location-manager/restart.html | 2 +- .../-android-mesh-location-manager/stop.html | 2 +- .../-shared-radio-interface-service/handle-from-radio.html | 2 +- .../-shared-radio-interface-service/keep-alive.html | 2 +- .../-shared-radio-interface-service/on-connect.html | 2 +- .../-shared-radio-interface-service/on-disconnect.html | 2 +- .../reset-received-buffer.html | 2 +- .../-shared-radio-interface-service/try-send-to-radio.html | 2 +- .../-t-a-k-packet-conversion/to-co-t-message.html | 2 +- .../-t-a-k-packet-v2-conversion/to-co-t-message.html | 2 +- .../-fake-node-repository/clear-my-node-info.html | 2 +- .../-fake-node-repository/clear-node-d-b.html | 2 +- .../-fake-node-repository/delete-node.html | 2 +- .../-fake-node-repository/delete-nodes.html | 2 +- .../-fake-node-repository/get-node-db-snapshot.html | 2 +- .../-fake-node-repository/get-nodes-older-than.html | 2 +- .../-fake-node-repository/get-nodes.html | 2 +- .../-fake-node-repository/get-unknown-nodes.html | 2 +- .../-fake-node-repository/insert-metadata.html | 2 +- .../-fake-node-repository/install-config.html | 2 +- .../-fake-node-repository/mark-all-heard-on-current-lora.html | 2 +- .../-fake-node-repository/set-my-id.html | 2 +- .../-fake-node-repository/set-my-node-info.html | 2 +- .../-fake-node-repository/set-node-notes.html | 2 +- .../-fake-node-repository/set-nodes.html | 2 +- .../-fake-node-repository/set-our-node.html | 2 +- .../-fake-node-repository/update-power-channel-label.html | 2 +- .../-fake-node-repository/upsert.html | 2 +- .../-fake-radio-config-repository/add-file-info.html | 2 +- .../clear-device-u-i-config.html | 2 +- .../-fake-radio-config-repository/clear-file-manifest.html | 2 +- .../-fake-radio-config-repository/clear-local-config.html | 2 +- .../clear-local-module-config.html | 2 +- .../clear-lora-region-preset-map.html | 2 +- .../reconcile-conversations-count.html | 2 +- .../reconcile-conversations.html | 2 +- .../-fake-radio-config-repository/set-channel-set.html | 2 +- .../-fake-radio-config-repository/set-device-profile.html | 2 +- .../-fake-radio-config-repository/set-device-u-i-config.html | 2 +- .../set-local-config-direct.html | 2 +- .../-fake-radio-config-repository/set-local-config.html | 2 +- .../set-local-module-config-direct.html | 2 +- .../set-local-module-config.html | 2 +- .../set-lora-region-preset-map.html | 2 +- .../update-channel-settings.html | 2 +- .../-robolectric-ble-bonding/index.html | 2 +- .../-test-data-factory/create-my-node-info.html | 2 +- .../-test-data-factory/create-test-nodes.html | 2 +- .../-test-data-factory/create-test-packet.html | 2 +- api/core/testing/org.meshtastic.core.testing/to-list.html | 2 +- .../-node-preview-parameter-provider/minnie-mouse.html | 2 +- .../-node-preview-parameter-provider/unknown.html | 2 +- .../-node-preview-parameter-provider/values.html | 2 +- .../preview-node.html | 2 +- .../org.meshtastic.core.ui.component/-meshtastic-dialog.html | 2 +- .../-scanned-qr-code-view-model/max-channels.html | 2 +- .../-scanned-qr-code-view-model/set-channels.html | 2 +- .../-preview-shared-contact-import-alert.html | 2 +- .../-channel-add-preview/-channel-add-preview.html | 2 +- .../-channel-add-preview/index.html | 2 +- .../-channel-add-preview/selections.html | 2 +- .../-channel-add-preview/settings.html | 2 +- .../get-channel-preview-for-add.html | 2 +- .../ui/org.meshtastic.core.ui.util/import-channel-set.html | 2 +- .../-bluetooth-scan-preview.html | 2 +- .../-connecting-device-info-preview.html | 2 +- .../-device-section-header-preview.html | 2 +- .../-disconnect-button-preview.html | 2 +- .../-empty-state-content-preview.html | 2 +- .../-transport-selector-preview.html | 2 +- .../-discovery-scan-engine/-companion/index.html | 2 +- .../restore-interrupted-sessions-on-reconnect.html | 2 +- .../-discovery-view-model/-companion/index.html | 2 +- .../-discovery-view-model/reset.html | 2 +- .../-discovery-view-model/stop-scan.html | 2 +- .../-waypoint-info-dialog-opted-in-preview.html | 2 +- .../-waypoint-info-dialog-read-only-preview.html | 2 +- .../-contact-section/entries.html | 2 +- .../-contact-section/index.html | 2 +- .../-contact-section/key.html | 2 +- .../-contact-section/value-of.html | 2 +- .../-contact-section/values.html | 2 +- .../-contacts-view-model/-companion/index.html | 2 +- .../-contacts-view-model/contact-list.html | 2 +- .../-contacts-view-model/delete-contacts.html | 2 +- .../-contacts-view-model/get-contact-settings.html | 2 +- .../-contacts-view-model/get-node.html | 2 +- .../-contacts-view-model/get-total-message-count.html | 2 +- .../-contacts-view-model/mark-all-as-read.html | 2 +- .../-contacts-view-model/mark-unread.html | 2 +- .../-contacts-view-model/set-contact-filtering-disabled.html | 2 +- .../-contacts-view-model/set-mute-until.html | 2 +- .../-contacts-view-model/set-pinned.html | 2 +- .../-contacts-view-model/show-snackbar.html | 2 +- .../org.meshtastic.feature.messaging.ui.contact/section.html | 2 +- .../-air-quality-info-cards-preview.html | 2 +- .../-environment-metrics-preview.html | 2 +- .../-node-details-section-preview.html | 2 +- .../-node-details-section-signed-preview.html | 2 +- .../-position-inline-content-preview.html | 2 +- .../-power-metrics-no-current-preview.html | 2 +- .../-power-metrics-partial-preview.html | 2 +- .../-device-metrics-card-preview.html | 2 +- .../-metrics-view-model/clear-local-stats.html | 2 +- .../-metrics-view-model/clear-position.html | 2 +- .../-metrics-view-model/clear-traceroute-response.html | 2 +- .../-metrics-view-model/decode-pax-from-log.html | 2 +- .../-metrics-view-model/delete-log.html | 2 +- .../-metrics-view-model/environment-graphing-data.html | 2 +- .../-metrics-view-model/filtered-pax-metrics.html | 2 +- .../-metrics-view-model/get-traceroute-overlay.html | 2 +- .../-metrics-view-model/get-user.html | 2 +- .../-metrics-view-model/last-request-neighbors-time.html | 2 +- .../-metrics-view-model/last-trace-route-time.html | 2 +- .../-metrics-view-model/positioned-node-nums.html | 2 +- .../-metrics-view-model/request-neighbor-info.html | 2 +- .../-metrics-view-model/request-position.html | 2 +- .../-metrics-view-model/request-telemetry.html | 2 +- .../-metrics-view-model/request-traceroute.html | 2 +- .../-metrics-view-model/save-device-metrics-c-s-v.html | 2 +- .../-metrics-view-model/save-environment-metrics-c-s-v.html | 2 +- .../-metrics-view-model/save-local-stats-c-s-v.html | 2 +- .../-metrics-view-model/save-position-c-s-v.html | 2 +- .../-metrics-view-model/save-position-gpx.html | 2 +- .../-metrics-view-model/save-power-metrics-c-s-v.html | 2 +- .../-metrics-view-model/save-signal-metrics-c-s-v.html | 2 +- .../-metrics-view-model/set-node-id.html | 2 +- .../-metrics-view-model/set-power-channel-label.html | 2 +- .../-metrics-view-model/show-log-detail.html | 2 +- .../-metrics-view-model/show-traceroute-detail.html | 2 +- .../-metrics-view-model/traceroute-snapshot-positions.html | 2 +- .../-channel-view-model/channels.html | 2 +- .../-channel-view-model/clear-request-channel-url.html | 2 +- .../-channel-view-model/is-managed.html | 2 +- .../-channel-view-model/region.html | 2 +- .../-channel-view-model/request-channel-set.html | 2 +- .../-channel-view-model/request-channel-url.html | 2 +- .../-channel-view-model/set-channels.html | 2 +- .../-channel-view-model/set-config.html | 2 +- .../-channel-view-model/track-share.html | 2 +- .../-channel-view-model/tx-enabled.html | 2 +- .../-channel-psk-edit-state/-channel-psk-edit-state.html | 2 +- .../-channel-psk-edit-state/can-generate-psk-for-name.html | 2 +- .../-channel-psk-edit-state/generated-psk-for-name.html | 2 +- .../-channel-psk-edit-state/index.html | 2 +- .../-channel-psk-edit-state/psk-explicitly-edited.html | 2 +- .../-private-key-regenerate-dialog.html | 2 +- .../-router-role-confirmation-dialog.html | 2 +- .../-radio-config-state/-radio-config-state.html | 2 +- .../-radio-config-state/index.html | 4 ++-- .../-radio-config-view-model/backup-security-keys.html | 2 +- .../-radio-config-view-model/clear-packet-response.html | 2 +- .../-radio-config-view-model/delete-security-key-backup.html | 2 +- .../-radio-config-view-model/ensure-loading-for-remote.html | 2 +- .../-radio-config-view-model/export-profile.html | 2 +- .../-radio-config-view-model/import-profile.html | 2 +- .../-radio-config-view-model/install-profile.html | 2 +- .../-radio-config-view-model/load-config-route.html | 2 +- .../-radio-config-view-model/remove-fixed-position.html | 2 +- .../-radio-config-view-model/restore-security-keys.html | 2 +- .../-radio-config-view-model/security-key-backup-exists.html | 2 +- .../-radio-config-view-model/set-canned-messages.html | 2 +- .../-radio-config-view-model/set-config.html | 2 +- .../-radio-config-view-model/set-fixed-position.html | 2 +- .../-radio-config-view-model/set-module-config.html | 2 +- .../-radio-config-view-model/set-owner.html | 2 +- .../-radio-config-view-model/set-response-state-loading.html | 2 +- .../-radio-config-view-model/set-ringtone.html | 2 +- .../-radio-config-view-model/set-should-report-location.html | 2 +- .../-radio-config-view-model/should-report-location.html | 2 +- .../-radio-config-view-model/update-channels.html | 2 +- .../settings/org.meshtastic.feature.settings.radio/index.html | 2 +- api/scripts/pages.json | 2 +- main/assets/css/just-the-docs-dark.css.map | 2 +- main/assets/css/just-the-docs-default.css.map | 2 +- main/assets/css/just-the-docs-light.css.map | 2 +- main/assets/css/just-the-docs-meshtastic-dark.css.map | 2 +- main/assets/css/just-the-docs-meshtastic.css.map | 2 +- 425 files changed, 432 insertions(+), 432 deletions(-) diff --git a/api/core/data/org.meshtastic.core.data.datasource/-switching-channel-set-data-source/reconcile-conversations.html b/api/core/data/org.meshtastic.core.data.datasource/-switching-channel-set-data-source/reconcile-conversations.html index 9bc08b2126..de93351f5f 100644 --- a/api/core/data/org.meshtastic.core.data.datasource/-switching-channel-set-data-source/reconcile-conversations.html +++ b/api/core/data/org.meshtastic.core.data.datasource/-switching-channel-set-data-source/reconcile-conversations.html @@ -94,7 +94,7 @@
Re-keys stored conversations onto the current channel set, and records it as the new baseline.
Conversations are keyed by channel index, so a slot that changes occupant shows the previous channel's history under the new channel until this runs. Idempotent: a second call with nothing changed does nothing.
Called explicitly after the handshake because the handshake streams channels in one slot at a time (and its LoRa config arrives as its own write). Reconciling on each of those would see a channel momentarily missing, retire it, and then see it come back.
Re-keys stored conversations onto the current channel set, and records it as the new baseline.
Conversations are keyed by channel index, so a slot that changes occupant shows the previous channel's history under the new channel until this runs. Idempotent: a second call with nothing changed does nothing.
Called explicitly after the handshake because the handshake streams channels in one slot at a time (and its LoRa config arrives as its own write). Reconciling on each of those would see a channel momentarily missing, retire it, and then see it come back.
Places channel's settings at its index, resizing with blank channels to fill any gap (parity with legacy).
Places channel's settings at its index, resizing with blank channels to fill any gap (parity with legacy).
Synchronously cancels the transport-aware handshake watchdog the moment Stage 2 completes (NODE_INFO_NONCE received). Does NOT replicate onNodeDbReady's post-NodeDB side effects (analytics, MQTT start, history replay, telemetry requests) — those remain gated on onNodeDbReady at the end of the async DB install block.
See MeshConnectionManager.onHandshakeComplete for the full rationale.
Synchronously cancels the transport-aware handshake watchdog the moment Stage 2 completes (NODE_INFO_NONCE received). Does NOT replicate onNodeDbReady's post-NodeDB side effects (analytics, MQTT start, history replay, telemetry requests) — those remain gated on onNodeDbReady at the end of the async DB install block.
See MeshConnectionManager.onHandshakeComplete for the full rationale.
Ceiling on entries in the in-memory node index. See NodeIndex.evictedToFit.
An order of magnitude above the largest NodeDB firmware exposes (MAX_NUM_NODES is 100–250 by target), so a legitimately busy mesh never reaches it and only sustained novel-from traffic does.
Ceiling on entries in the in-memory node index. See NodeIndex.evictedToFit.
An order of magnitude above the largest NodeDB firmware exposes (MAX_NUM_NODES is 100–250 by target), so a legitimately busy mesh never reaches it and only sustained novel-from traffic does.
Deletes only local stats telemetry logs for nodeNum, preserving other telemetry types. The bounded keyset scan and atomic deletion remain under one manager-tracked database lease, while protobuf parsing runs on the compute dispatcher.
Deletes only local stats telemetry logs for nodeNum, preserving other telemetry types. The bounded keyset scan and atomic deletion remain under one manager-tracked database lease, while protobuf parsing runs on the compute dispatcher.
Prunes the log database based on the configured retentionDays. The sentinel values are resolved by MeshLogRetention, so "never delete" is a no-op and "1 hour" trims to the last hour rather than scaling the sentinel by days.
Prunes the log database based on the configured retentionDays. The sentinel values are resolved by MeshLogRetention, so "never delete" is a no-op and "1 hour" trims to the last hour rather than scaling the sentinel by days.
Returns the cached MyNodeInfo from the system logs.
Returns the cached MyNodeInfo from the system logs.
Clears the local node's connection info.
Clears the local node's connection info.
Deletes all nodes from the database, optionally preserving favorites.
Deletes all nodes from the database, optionally preserving favorites.
Deletes a node and its metadata by num.
Deletes a node and its metadata by num.
Deletes multiple nodes and their metadata.
Deletes multiple nodes and their metadata.
Persists hardware metadata for a node.
Persists hardware metadata for a node.
Installs initial configuration data (local info and remote nodes) into the database.
Installs initial configuration data (local info and remote nodes) into the database.
Flow emitting the count of nodes currently considered "online".
Flow emitting the count of nodes currently considered "online".
Flow emitting the total number of nodes in the database.
Flow emitting the total number of nodes in the database.
Backfills longName and shortName columns from the user protobuf for nodes where these columns are NULL. This ensures search functionality works for all nodes. Skips placeholder/default users (hwModel == UNSET).
Backfills longName and shortName columns from the user protobuf for nodes where these columns are NULL. This ensures search functionality works for all nodes. Skips placeholder/default users (hwModel == UNSET).
Atomically deletes one node and its separately stored device metadata.
Atomically deletes one node and its separately stored device metadata.
Atomically deletes nodes and their metadata, chunking both IN queries below SQLite's bind-parameter limit. Every chunk participates in the same transaction, so cancellation or a query failure rolls back the whole batch.
Atomically deletes nodes and their metadata, chunking both IN queries below SQLite's bind-parameter limit. Every chunk participates in the same transaction, so cancellation or a query failure rolls back the whole batch.
Snapshot used by DatabaseMerger to carry per-node DeviceMetadata across transports (newest timestamp wins).
Snapshot used by DatabaseMerger to carry per-node DeviceMetadata across transports (newest timestamp wins).
Installs the config download from the connected device, reconciling any node-number change of the device itself (firmware 2.8 renumber, erase-and-reflash, manual re-key) before the new my_node row lands.
node numbers whose rows were removed by identity migration, so callers can evict them from in-memory caches.
Installs the config download from the connected device, reconciling any node-number change of the device itself (firmware 2.8 renumber, erase-and-reflash, manual re-key) before the new my_node row lands.
node numbers whose rows were removed by identity migration, so callers can evict them from in-memory caches.
Clears the unheard flag on every node. Called when the connected firmware cannot report NodeInfo.heard_on_current_lora, so a value written by a radio that could does not outlive it and leave nodes shown as unreachable. Normalizing in the database rather than in memory keeps every reader correct, including the repository-backed flows the node list renders from.
Clears the unheard flag on every node. Called when the connected firmware cannot report NodeInfo.heard_on_current_lora, so a value written by a radio that could does not outlive it and leave nodes shown as unreachable. Normalizing in the database rather than in memory keeps every reader correct, including the repository-backed flows the node list renders from.
One-shot snapshot of every node row in the CURRENTLY SELECTED database (not the process-wide stateIn cache). Used by session-safe cache loads (see NodeManagerImpl.loadCachedNodeDB) so a transport switch can't deliver a stale pre-switch map.
One-shot snapshot of every node row in the CURRENTLY SELECTED database (not the process-wide stateIn cache). Used by session-safe cache loads (see NodeManagerImpl.loadCachedNodeDB) so a transport switch can't deliver a stale pre-switch map.
Contact keys are "$channel$userId", so a suffix match rewrites just the DM threads of one node.
Contact keys are "$channel$userId", so a suffix match rewrites just the DM threads of one node.
Re-scopes stored messages from one owning node number to another (see Packet.myNodeNum).
Re-scopes stored messages from one owning node number to another (see Packet.myNodeNum).
OR IGNORE: myNodeNum is part of the reactions PK; drop the rare duplicate instead of aborting.
OR IGNORE: myNodeNum is part of the reactions PK; drop the rare duplicate instead of aborting.
Sets a single power-channel label (0-based channelIndex) atomically: the read-modify-write runs inside a transaction that reads the current labels from the DB, so concurrent edits to different channels can't clobber each other via a stale read. Earlier channels keep their slot (blank padding); trailing blanks are dropped.
Reads via getNodeByNum rather than a scalar SELECT power_channel_labels: Room reads a List<String> query result as one String per row (returning the raw JSON text), not as the column's converted List<String>.
Sets a single power-channel label (0-based channelIndex) atomically: the read-modify-write runs inside a transaction that reads the current labels from the DB, so concurrent edits to different channels can't clobber each other via a stale read. Earlier channels keep their slot (blank padding); trailing blanks are dropped.
Reads via getNodeByNum rather than a scalar SELECT power_channel_labels: Room reads a List<String> query result as one String per row (returning the raw JSON text), not as the column's converted List<String>.
Represents a log entry in the database.
Logs are used for auditing radio traffic, telemetry history, and debugging.
Represents a log entry in the database.
Logs are used for auditing radio traffic, telemetry history, and debugging.
True when the radio has heard this node over RF on the LoRa configuration it is using now (NodeInfo.heard_on_current_lora). The radio derives this from the slot each node was heard on rather than clearing it on a config change, so returning to a configuration restores the previous answers. Defaults true so nodes stored before this column existed, and nodes from firmware that does not report it, are never shown as unheard.
True when the radio has heard this node over RF on the LoRa configuration it is using now (NodeInfo.heard_on_current_lora). The radio derives this from the slot each node was heard on rather than clearing it on a config change, so returning to a configuration restores the previous answers. Defaults true so nodes stored before this column existed, and nodes from firmware that does not report it, are never shown as unheard.
False once a different public key has arrived for a node one is already stored for.
The stored key stands (first-wins) and this records the refusal, matching firmware — which drops the whole NodeInfo on a key mismatch rather than overwriting — and Meshtastic-Apple. Overwriting the trusted key instead would let any mesh or MQTT peer destroy it by broadcasting a NodeInfo under that node's number.
Defaults true so rows written before this column existed are not read as mismatched; those rows record a mismatch the old way, as ERROR_BYTE_STRING in publicKey.
False once a different public key has arrived for a node one is already stored for.
The stored key stands (first-wins) and this records the refusal, matching firmware — which drops the whole NodeInfo on a key mismatch rather than overwriting — and Meshtastic-Apple. Overwriting the trusted key instead would let any mesh or MQTT peer destroy it by broadcasting a NodeInfo under that node's number.
Defaults true so rows written before this column existed are not read as mismatched; those rows record a mismatch the old way, as ERROR_BYTE_STRING in publicKey.
The transport mechanism this node was last heard over (see MeshPacket.TransportMechanism).
The transport mechanism this node was last heard over (see MeshPacket.TransportMechanism).
The key that was refused, kept so the mismatch can be shown as more than a warning.
Null whenever keyMatch is true. Rows that recorded a mismatch the old way, as ERROR_BYTE_STRING in publicKey, have no rejected key to report and stay null.
The key that was refused, kept so the mismatch can be shown as more than a warning.
Null whenever keyMatch is true. Rows that recorded a mismatch the old way, as ERROR_BYTE_STRING in publicKey, have no rejected key to report and stay null.
True when this node signs its broadcasts via XEdDSA (NodeInfo.has_xeddsa_signed).
True when this node signs its broadcasts via XEdDSA (NodeInfo.has_xeddsa_signed).
Discovery scans capture the radio's pre-scan primary channel to restore after a custom-channel target.
Discovery scans capture the radio's pre-scan primary channel to restore after a custom-channel target.
Discovery scans capture the radio's pre-scan LoRa config so an interrupted scan can restore it later.
Discovery scans capture the radio's pre-scan LoRa config so an interrupted scan can restore it later.
Returns a representation of an immutable list of all enum entries, in the order they're declared.
This method may be used to iterate over the enum entries.
Returns a representation of an immutable list of all enum entries, in the order they're declared.
This method may be used to iterate over the enum entries.
How a received Mesh Beacon invitation can be joined, given the connected radio's current settings.
How a received Mesh Beacon invitation can be joined, given the connected radio's current settings.
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
if this enum type has no constant with the specified name
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
if this enum type has no constant with the specified name
Returns an array containing the constants of this enum type, in the order they're declared.
This method may be used to iterate over the constants.
Returns an array containing the constants of this enum type, in the order they're declared.
This method may be used to iterate over the constants.
Hex characters of the identity digest kept in a retired contact key.
64 bits rather than the 32 that eight slots would need: a collision would silently merge two archived conversations, and the key format is not released yet, so widening it now costs nothing and never has to be migrated later.
Hex characters of the identity digest kept in a retired contact key.
64 bits rather than the 32 that eight slots would need: a collision would silently merge two archived conversations, and the key format is not released yet, so widening it now costs nothing and never has to be migrated later.
Semantic channel identity based on the effective name and effective PSK.
Semantic channel identity based on the effective name and effective PSK.
Stable opaque token for this identity, used to key a retired conversation (see ContactKey).
Deliberately one-way and truncated: a contact key reaches logs and deep links, so it must never carry a PSK or be reversible into one. The name length is prefixed so ("ab", "c") and ("a", "bc") cannot collide.
Stable opaque token for this identity, used to key a retired conversation (see ContactKey).
Deliberately one-way and truncated: a contact key reaches logs and deep links, so it must never carry a PSK or be reversible into one. The name length is prefixed so ("ab", "c") and ("a", "bc") cannot collide.
Decides whether a beacon can be joined by simply adding its channel (no reboot) or requires a switch (retune + reboot). Adding works only when the offered mesh sits on the radio's current frequency slot — Meshtastic secondary channels ride the primary channel's frequency, so the offered channel must resolve (name-hash) to the same slot the radio's primary is on, under a matching preset and region. Mirrors the Apple 014-mesh-beacons FR-016/FR-017 logic.
The radio's current LoRaConfig (null → can't reason, so SWITCH).
The radio's current channel settings, index 0 = primary.
Decides whether a beacon can be joined by simply adding its channel (no reboot) or requires a switch (retune + reboot). Adding works only when the offered mesh sits on the radio's current frequency slot — Meshtastic secondary channels ride the primary channel's frequency, so the offered channel must resolve (name-hash) to the same slot the radio's primary is on, under a matching preset and region. Mirrors the Apple 014-mesh-beacons FR-016/FR-017 logic.
The radio's current LoRaConfig (null → can't reason, so SWITCH).
The radio's current channel settings, index 0 = primary.
Resolves this setting's semantic identity under loraConfig.
Resolves this setting's semantic identity under loraConfig.
Compares two User objects and returns a string detailing the differences.
Compares two User objects and returns a string detailing the differences.
Return a URL that represents the ChannelSet
portions of the URL can be upper case to make for more efficient QR codes
Return a URL that represents the ChannelSet
portions of the URL can be upper case to make for more efficient QR codes
Converts a SharedContact to its corresponding URI representation.
Converts a SharedContact to its corresponding URI representation.
True when this is a channel the radio already has configured (design#140 behavior 10). Null currentLora or an empty currentChannels means "can't tell" and returns false, never hiding a still-relevant invitation on missing data. Comparison uses resolved ChannelIdentity (effective name plus expanded PSK) so a blank-name primary or a short-code PSK still matches; differing PSK under an identical name is deliberately not a match, since same name with a different key is a different mesh. Secondary slots are skipped when isChannelPlaceholder (blank name, no PSK): SwitchingChannelSetDataSource pads a gap left by a removed channel with a bare ChannelSettings, and those placeholders are read back unfiltered here, so without this exclusion a beacon offering a genuinely blank/cleartext channel would misclassify a padding slot as a real match. The primary slot (index 0) is never skipped: it always represents a real channel, matching the same convention in normalizeReplacementSettings.
True when this beacon's offered channel is already configured on the radio; see ChannelSettings.isAlreadyJoined.
True when this is a channel the radio already has configured (design#140 behavior 10). Null currentLora or an empty currentChannels means "can't tell" and returns false, never hiding a still-relevant invitation on missing data. Comparison uses resolved ChannelIdentity (effective name plus expanded PSK) so a blank-name primary or a short-code PSK still matches; differing PSK under an identical name is deliberately not a match, since same name with a different key is a different mesh. Secondary slots are skipped when isChannelPlaceholder (blank name, no PSK): SwitchingChannelSetDataSource pads a gap left by a removed channel with a bare ChannelSettings, and those placeholders are read back unfiltered here, so without this exclusion a beacon offering a genuinely blank/cleartext channel would misclassify a padding slot as a real match. The primary slot (index 0) is never skipped: it always represents a real channel, matching the same convention in normalizeReplacementSettings.
True when this beacon's offered channel is already configured on the radio; see ChannelSettings.isAlreadyJoined.
True when these settings carry no name and no PSK, making them padding rather than an intended channel.
True when these settings carry no name and no PSK, making them padding rather than an intended channel.
Normalizes replacement settings so firmware only materializes real, distinct channels.
Slot zero is preserved as-is. Blank placeholder secondaries and semantic duplicates under loraConfig are removed, and the remaining secondaries compact into sequential slots.
Normalizes replacement settings so firmware only materializes real, distinct channels.
Slot zero is preserved as-is. Blank placeholder secondaries and semantic duplicates under loraConfig are removed, and the remaining secondaries compact into sequential slots.
Builds the ChannelSet to hand the QR channel-import dialog for a given option.
ADD omits lora_config so the dialog merges the offered channel into a free secondary slot with no reboot. SWITCH carries a fresh lora_config (not a copy of currentLora) with use_preset = true, the advertised preset+region applied, and every RF field left at its default — notably channel_num/override_frequency zeroed so firmware re-derives the frequency from the offered channel name (Apple FR-006). Starting blank guarantees no stale slot/frequency pin (channel_num, override_frequency, manual bandwidth/spread_factor/coding_rate) from the old mesh survives the retune. Only region is carried from currentLora when the beacon doesn't advertise one — this config is sent as a full LoRaConfig replacement, and a zero region disables transmit; hop_limit/tx_enabled fall back to the app's standard defaults. Returns null for NONE or a beacon with no offered channel.
Both paths strip position sharing from the offered channel (withoutPositionSharing) so joining a stranger's mesh never leaks our location — matching Apple's joinBeaconMesh/addBeaconChannel.
The radio's current LoRaConfig; a switch reuses only its region/preset as fallbacks.
Builds the ChannelSet to hand the QR channel-import dialog for a given option.
ADD omits lora_config so the dialog merges the offered channel into a free secondary slot with no reboot. SWITCH carries a fresh lora_config (not a copy of currentLora) with use_preset = true, the advertised preset+region applied, and every RF field left at its default — notably channel_num/override_frequency zeroed so firmware re-derives the frequency from the offered channel name (Apple FR-006). Starting blank guarantees no stale slot/frequency pin (channel_num, override_frequency, manual bandwidth/spread_factor/coding_rate) from the old mesh survives the retune. Only region is carried from currentLora when the beacon doesn't advertise one — this config is sent as a full LoRaConfig replacement, and a zero region disables transmit; hop_limit/tx_enabled fall back to the app's standard defaults. Returns null for NONE or a beacon with no offered channel.
Both paths strip position sharing from the offered channel (withoutPositionSharing) so joining a stranger's mesh never leaks our location — matching Apple's joinBeaconMesh/addBeaconChannel.
The radio's current LoRaConfig; a switch reuses only its region/preset as fallbacks.
Bridge extension for Android clients.
The SharedContact to encode for node.
isOwnContact marks it manually verified (design#149 point 2): you hold your own radio's key, and a QR shown in person is the in-person exchange. Relaying someone else's contact only passes on what was already recorded, it never asserts verification on their behalf.
Return a SharedContact that represents the contact encoded by the URL.
when not recognized as a valid Meshtastic URL
Bridge extension for Android clients.
The SharedContact to encode for node.
isOwnContact marks it manually verified (design#149 point 2): you hold your own radio's key, and a QR shown in person is the in-person exchange. Relaying someone else's contact only passes on what was already recorded, it never asserts verification on their behalf.
Return a SharedContact that represents the contact encoded by the URL.
when not recognized as a valid Meshtastic URL
Converts a User object to a string representation of its fields and values.
Converts a User object to a string representation of its fields and values.
Represents a log entry in shared repository/domain code.
Logs are used for auditing radio traffic, telemetry history, and debugging.
Represents a log entry in shared repository/domain code.
Logs are used for auditing radio traffic, telemetry history, and debugging.
Domain model representing a node in the mesh network.
This class aggregates user information, position data, and hardware metrics.
Domain model representing a node in the mesh network.
This class aggregates user information, position data, and hardware metrics.
Returns a representation of an immutable list of all enum entries, in the order they're declared.
This method may be used to iterate over the enum entries.
Returns a representation of an immutable list of all enum entries, in the order they're declared.
This method may be used to iterate over the enum entries.
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
if this enum type has no constant with the specified name
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
if this enum type has no constant with the specified name
Returns an array containing the constants of this enum type, in the order they're declared.
This method may be used to iterate over the constants.
Returns an array containing the constants of this enum type, in the order they're declared.
This method may be used to iterate over the constants.
Domain model representing a node in the mesh network.
Domain model representing a node in the mesh network.
Matches node search text (long/short name, hex id, decimal id) with Unicode-aware case folding.
Must run in Kotlin, not SQL: SQLite's LIKE/UPPER/LOWER only case-fold ASCII a-z/A-Z, so a query like "kolså" can never match a stored name of "KOLSÅS" via a SQL WHERE clause (#6750).
Matches node search text (long/short name, hex id, decimal id) with Unicode-aware case folding.
Must run in Kotlin, not SQL: SQLite's LIKE/UPPER/LOWER only case-fold ASCII a-z/A-Z, so a query like "kolså" can never match a stored name of "KOLSÅS" via a SQL WHERE clause (#6750).
A simulated radio, selected as "Demo Mode" in the Connections screen.
It answers the app's real two-stage want_config handshake and then feeds a small synthetic mesh — a populated node list with positions, signal readings and battery levels, one channel conversation, one direct-message thread, and telemetry that keeps accruing while the app is open. That makes the app fully explorable without any LoRa hardware, which is what an app-store reviewer and a first-time user both need.
Three properties of the real protocol have to be honoured or the app never leaves "Loading node list":
The handshake is two-stage (HandshakeConstants.CONFIG_NONCE then HandshakeConstants.NODE_INFO_NONCE). Each stage must answer with only its own frames and its own config_complete_id. Re-sending my_info on stage 2 resets the app's handshake state machine and the stage-2 completion is then rejected.
node_info frames are only accepted inside the handshake window, so every simulated node has to ship in stage 2.
Radio metrics (SNR/RSSI/hops) are only taken from packets that look like direct LoRa receptions — transport_mechanism = TRANSPORT_LORA and hop_start == hop_limit. Frames left at the proto defaults are treated as internal traffic and contribute no signal information at all.
A simulated radio, selected as "Demo Mode" in the Connections screen.
It answers the app's real two-stage want_config handshake and then feeds a small synthetic mesh — a populated node list with positions, signal readings and battery levels, one channel conversation, one direct-message thread, and telemetry that keeps accruing while the app is open. That makes the app fully explorable without any LoRa hardware, which is what an app-store reviewer and a first-time user both need.
Three properties of the real protocol have to be honoured or the app never leaves "Loading node list":
The handshake is two-stage (HandshakeConstants.CONFIG_NONCE then HandshakeConstants.NODE_INFO_NONCE). Each stage must answer with only its own frames and its own config_complete_id. Re-sending my_info on stage 2 resets the app's handshake state machine and the stage-2 completion is then rejected.
node_info frames are only accepted inside the handshake window, so every simulated node has to ship in stage 2.
Radio metrics (SNR/RSSI/hops) are only taken from packets that look like direct LoRa receptions — transport_mechanism = TRANSPORT_LORA and hop_start == hop_limit. Frames left at the proto defaults are treated as internal traffic and contribute no signal information at all.
~10 packets/sec, matching the burningmesh-replay steady-rate rig used for ingestion perf work.
~10 packets/sec, matching the burningmesh-replay steady-rate rig used for ingestion perf work.
true only for CONNACK reason codes where retrying can never help — the broker examined our credentials or client identity and refused them.
A MqttException.ConnectionRejected can still carry a transient broker verdict (SERVER_BUSY, SERVER_UNAVAILABLE, CONNECTION_RATE_EXCEEDED), which must stay in the retry loop rather than stop the proxy with a "check credentials" dialog. Public so MqttManagerImpl in :core:data can phrase its user-facing error from the same classification.
true only for CONNACK reason codes where retrying can never help — the broker examined our credentials or client identity and refused them.
A MqttException.ConnectionRejected can still carry a transient broker verdict (SERVER_BUSY, SERVER_UNAVAILABLE, CONNECTION_RATE_EXCEEDED), which must stay in the retry loop rather than stop the proxy with a "check credentials" dialog. Public so MqttManagerImpl in :core:data can phrase its user-facing error from the same classification.
Resolve a user-supplied broker address into an MqttEndpoint.
Address resolution rules:
If rawAddress already contains a URI scheme (scheme://…), parse it directly via MqttEndpoint.parse and respect whatever transport / port the user encoded.
Otherwise wrap it as a TCP endpoint using standard MQTT ports: port 8883 if tlsEnabled is true, port 1883 otherwise. This allows standard MQTT brokers to work out of the box.
Extracted as a top-level function so MQTTRepositoryImplTest can exercise every branch without spinning up the full repository, and so MqttManagerImpl (in :core:data) can reuse the same parsing rules for the probe API. Visibility is public because Kotlin's internal is scoped per Gradle module.
Resolve a user-supplied broker address into an MqttEndpoint.
Address resolution rules:
If rawAddress already contains a URI scheme (scheme://…), parse it directly via MqttEndpoint.parse and respect whatever transport / port the user encoded.
Otherwise wrap it as a TCP endpoint using standard MQTT ports: port 8883 if tlsEnabled is true, port 1883 otherwise. This allows standard MQTT brokers to work out of the box.
Extracted as a top-level function so MQTTRepositoryImplTest can exercise every branch without spinning up the full repository, and so MqttManagerImpl (in :core:data) can reuse the same parsing rules for the probe API. Visibility is public because Kotlin's internal is scoped per Gradle module.
First heartbeat nonce any sender emits; it sits past 1, the firmware's NodeInfo-ping trigger.
First heartbeat nonce any sender emits; it sits past 1, the firmware's NodeInfo-ping trigger.
Builds the device admin command for setting or removing a fixed position.
Builds the device admin command for setting or removing a fixed position.