mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
feat(remote-shell): PTY-over-mesh terminal with retro-CRT UI
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
This commit is contained in:
parent
0f900fe7d7
commit
8701b8645d
18 changed files with 1563 additions and 0 deletions
|
|
@ -64,6 +64,12 @@ data class Capabilities(val firmwareVersion: String?, internal val forceEnableAl
|
|||
/** Support for ESP32 Unified OTA. Supported since firmware v2.7.18. */
|
||||
val supportsEsp32Ota = atLeast(V2_7_18)
|
||||
|
||||
/**
|
||||
* Support for the RemoteShell module (PTY-over-mesh, REMOTE_SHELL_APP portnum). Defined in protobufs HEAD
|
||||
* (post-v2.7.21); gated to [UNRELEASED] until a firmware release ships it.
|
||||
*/
|
||||
val supportsRemoteShell = atLeast(UNRELEASED)
|
||||
|
||||
companion object {
|
||||
private val V2_6_8 = DeviceVersion("2.6.8")
|
||||
private val V2_6_9 = DeviceVersion("2.6.9")
|
||||
|
|
|
|||
|
|
@ -85,6 +85,12 @@ class CapabilitiesTest {
|
|||
assertTrue(caps("2.7.19").supportsTakConfig)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun supportsRemoteShell_is_currently_unreleased() {
|
||||
assertFalse(caps("2.7.22").supportsRemoteShell)
|
||||
assertFalse(caps("3.0.0").supportsRemoteShell)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun supportsEsp32Ota_requires_V2_7_18() {
|
||||
assertFalse(caps("2.7.17").supportsEsp32Ota)
|
||||
|
|
@ -104,6 +110,7 @@ class CapabilitiesTest {
|
|||
assertFalse(c.supportsStatusMessage)
|
||||
assertFalse(c.supportsTrafficManagementConfig)
|
||||
assertFalse(c.supportsTakConfig)
|
||||
assertFalse(c.supportsRemoteShell)
|
||||
assertFalse(c.supportsEsp32Ota)
|
||||
}
|
||||
|
||||
|
|
@ -115,5 +122,6 @@ class CapabilitiesTest {
|
|||
assertTrue(c.supportsStatusMessage)
|
||||
assertTrue(c.supportsTrafficManagementConfig)
|
||||
assertTrue(c.supportsTakConfig)
|
||||
assertTrue(c.supportsRemoteShell)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue