mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
Adds a full RemoteShell (portnum=13) implementation matching Jonathan's dmshell_client.py protocol: Protocol layer: - Seq/ack reliability: incrementing seq on every non-ACK frame, piggybacked ack_seq, out-of-order frame buffering, gap detection and replay requests - TX history ring buffer (last 50 frames) for retransmission on request - ACK frames carry optional 4-byte big-endian REPLAY_REQUEST payload - PING/PONG heartbeat with 8-byte status payload (lastTxSeq, lastRxSeq); PONG handler triggers replay if peer is behind - PKI: DataPacket.PKC_CHANNEL_INDEX so CommandSenderImpl applies Curve25519 encryption (firmware rejects non-PKI DMShell packets) - Input batching: 500ms debounce (matches Python client), immediate flush on \r, \t, buffer-full (64 bytes), or Enter Terminal UI: - Retro-CRT composables: TerminalCanvas (phosphor glow, two-pass bloom), ScanlinesOverlay, FlickerEffect (animated brightness variation), CrtCurvatureModifier (AGSL barrel distortion on Android 12+, no-op on JVM) - PhosphorPreset enum: GREEN (P1), AMBER (P3), WHITE (P4) - Pending-input rendered inline in preset.dim colour; snaps to confirmed on flush - Hidden zero-size BasicTextField captures soft and hardware keyboard input - Phosphor colour picker dropdown in top bar Capabilities gate: - supportsRemoteShell gated to UNRELEASED (9.9.9) - Entry only visible in AdministrationSection when node.capabilities.supportsRemoteShell |
||
|---|---|---|
| .. | ||
| src | ||
| build.gradle.kts | ||
| README.md | ||
:core:navigation
Overview
The :core:navigation module defines the type-safe Navigation 3 route model for Android and Desktop using Kotlin Serialization.
Key Components
1. Routes.kt
Contains serializable NavKey route classes/objects used by shared feature graphs.
2. DeepLinkRouter.kt
Parses Meshtastic deep-link URIs and synthesizes a typed backstack (for example /nodes/1234/device-metrics).
3. NavigationConfig.kt
Defines MeshtasticNavSavedStateConfig using sealed interface hierarchies so Navigation 3 backstacks can be persisted/restored safely — new routes are auto-registered at compile time.
Features
- Type-Safety: Uses serializable
NavKeyroutes instead of ad-hoc string routes. - Deep-link synthesis: Converts incoming URIs into typed backstacks via
DeepLinkRouter. - Centralized definition: Routes and saved-state serializers are declared in one place to avoid feature-module cycles.
Usage
Feature modules depend on this module to define their entry points and navigate via NavBackStack<NavKey>.
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.meshtastic.core.navigation.NodesRoute
fun openNodeDetail(backStack: NavBackStack<NavKey>, destNum: Int) {
backStack.add(NodesRoute.NodeDetail(destNum))
}
Module dependency graph
graph TB
:core:navigation[navigation]:::kmp-library-compose
classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000;
classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000;