Files
Meshtastic-Android/feature/node
James Rich 122a627d76 feat(remote-shell): plain terminal UI, turn-taking, and a correct input sink
Three things stood between the April branch and a working session:

- The CRT theatrics are gone - scanlines, phosphor presets, flicker, and
  the AGSL curvature shader, which rendered the block cursor as a skewed
  amber quad in the corner. The terminal is now monospace text on the app
  theme.
- Turn-taking ('talking stick', RemoteShell.flags) landed on the firmware
  side after this branch was written. DMShellModule marks every session
  turn-managed and withholds output until the peer grants a turn, so a
  client that never grants sees an open session and no prompt, and the
  device re-sends RTS every 250 ms until its TX queue fills. We now grant
  on every frame we originate and answer any request immediately.
- The invisible input sink passed a constant "" as its value, so Compose
  re-delivered characters we had already consumed: 'whoami' reached the
  PTY as 'wwhwhowhoa'. It now tracks what it consumed and forwards the
  delta, mapping a shrinking field to backspaces.

Verified against meshtasticd: session opens, 'whoami' echoes exactly and
returns 'root'.
2026-08-24 14:28:39 -05:00
..

:feature:node

Overview

Targets: Android · JVM (Desktop) · iOS

The :feature:node module handles node-centric features, including the node list, detailed node information, telemetry charts, and the compass.

Key Components

1. NodeListScreen

Displays all nodes currently known to the application.

2. NodeDetailScreen

Shows exhaustive details for a specific node, including hardware info, position history, and last heard status.

3. MetricsViewModel

Manages the retrieval and display of telemetry data (e.g., battery, SNR, environment metrics) using charts.

4. CompassViewModel

Provides a compass interface to show the relative direction and distance to other nodes.

Dependency Graph

graph TB
  :feature:node[node]:::kmp-feature
  :feature:node -.-> :core:common
  :feature:node -.-> :core:data
  :feature:node -.-> :core:database
  :feature:node -.-> :core:datastore
  :feature:node -.-> :core:domain
  :feature:node -.-> :core:model
  :feature:node -.-> :core:navigation
  :feature:node -.-> :core:repository
  :feature:node -.-> :core:resources
  :feature:node -.-> :core:service
  :feature:node -.-> :core:ui
  :feature:node -.-> :core:di
  :feature:node -.-> :feature:map
  :feature:node -.-> :core:testing

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;